Frage

Für ein Plugin muss ich meinen eigenen, sehr frühen Postinhalt erstellen und den Inhaltsfilter kommentieren. Postinhalte/Text ändern Werke, dh die Änderungen landen im Browser des Kunden. Aber mein Kommentarinhalt/Textänderungen sind irgendwie nicht beständig, dh der Client erhält den ursprünglichen Kommentartext.

Der Punkt in der Zeit i "Hook in" wird durch die definiert template_redirect Haken. Ich führe dann so etwas aus:

global $wp_query;

// Iterate over all posts in this query.
foreach ($wp_query->posts as $post) {
    // Edit post text
    $post->post_content = "foo"; // works: ends up at the client

    // Iterate over all approved comments belonging to this post
    $comments = get_approved_comments($post->ID);
    foreach ($comments as $comment) {
        // Edit comment text
        $comment->comment_content = "bar"; // this one is lost
        } 
    }

Wie über die obigen Quellkommentare angegeben, $post->post_content = "foo"; hat Wirkung in diesem Zusammenhang, aber $comment->comment_content = "bar"; nicht.

Um dies mindestens ein bisschen mehr zu verfolgen, habe ich einen Debug -Filter auf den Post -Inhalt und den Kommentarinhalt angewendet:

add_filter('the_content', 'var_dump');
add_filter('comment_text', 'var_dump');

Nach der obigen Inhaltsänderungsroutine drucken diese Filter im Falle von Post -Inhalten "foo", aber der Kommentarinhalt wird unverändert gedruckt (der ursprüngliche Inhalt wird gedruckt).

Somit, $comment->comment_content = "bar"; Scheint eine lokale Modifikation zu sein $post->post_content = "foo"; funktioniert wie gewünscht: global.

Oder wird die Datenbank noch zweimal für Kommentare befragt, so dass meine Änderung irgendwann irgendwann überschrieben wird?

Ich habe versucht zu arbeiten $wp_query->comments, zu. Aber diese Variable ist NULL Zu dem Zeitpunkt, an dem ich mich einhacken möchte und muss.

Die endgültige und primäre Frage ist:

Was muss ich in meiner Schleife oben tun, um den Kommentarinhalt anhaltend zu ändern?

Zu Ihrer Information: Ich verwende WordPress 3.0.1

War es hilfreich?

Lösung

Die Funktion, die die Kommentarvorlage enthält Auch (Re) lädt die Kommentare. Dies bedeutet, dass was auch immer Sie vor diesem Punkt tun, wenn Sie sie nicht in der Datenbank speichern, wird sie nicht verwendet.

Es gibt keine Möglichkeit, diese SQL -Abfrage zu verhindern, aber Sie können die Ergebnisse überschreiben, indem Sie sich in die anschließen comments_array Filter. Ich würde Ihre Modifikationen in einem von der Kommentar -ID kühnenden Array speichern, damit Sie schnelle Suchvorgänge durchführen und bei Bedarf Inhalte ersetzen können.

$wpse4522_comments = array();

// Somewhere in your template_redirect (why not wp_head?) hook:
foreach ($wp_query->posts as $post) {
    // Edit post text
    $post->post_content = "foo"; // works: ends up at the client

    // Iterate over all approved comments belonging to this post
    $comments = get_approved_comments($post->ID);
    foreach ($comments as $comment) {
        // Edit comment text
        $GLOBALS['wpse4522_comments'][$comment->comment_ID] = 'bar';
    } 
}

// And this loads the content back into the array from comments_template()
add_filter( 'comments_array', 'wpse4522_set_comments_content' );
function wpse5422_set_comments_content( $comments, $post_id )
{
    global $wpse4522_comments;
    foreach ( $comments as &$comment_data ) {
        if ( array_key_exists( $comment_data->comment_ID, $wpse4522_comments ) ) {
            $comment_data->comment_content = $wpse4522_comments[$comment_data->comment_ID];
        }
    }
    return $comments;
}

Andere Tipps

Ohne viel mehr über das zu wissen, was Sie tun, um sie zu erreichen, gibt es einige mögliche Lösungen.

Eine davon ist, weiter zu tun, was Sie derzeit tun, aber auch einen Filter zu 'comment_text' hinzuzufügen, um die Kommentarausgabe zu ändern. Der Nachteil dabei ist, dass Sie die Kommentare mehrmals abfragen.

Eine weitere Option besteht darin, einen Ausgangspuffer auf 'template_redirect' zu starten und einen Platzhalter auf dem 'wp_head' Hook zu drucken, um einen Punkt im Header zu markieren. Verwenden Sie dann die Filter von 'comment_text' und 'the_content', um die Ausgabe zu ändern, und prüfen Sie, nach welchen Markern Sie suchen. Lassen Sie ihn im Ausgangspuffer -Rückruf diesen Marker ersetzen, den Sie in den Header mit dem CSS einfügen, den Sie hinzufügen müssen. Das einzige Problem mit dieser Lösung ist, dass die auf dem Server festgelegte Puffergröße möglicherweise nicht ausreicht, je nachdem, wie viel Inhalt Sie auf einer einzelnen Seite haben oder wie klein der Puffer ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top