Wie ändern Sie den Kommentarinhalt dauerhaft basierend auf $ wp_query?

Für ein Plugin muss ich meinen eigenen sehr frühen Post Content und Kommentar Content Filter erstellen. Post Content / Text Changing funktioniert, dh die Änderungen landen im Browser des Clients. Aber meine Kommentarinhalte / Textänderungen sind irgendwie nicht persistent, dh der Client erhält den ursprünglichen Kommentartext.

Der Zeitpunkt, zu dem ich mich eingehe, wird durch den template_redirect- Hook definiert. 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 oben in den Quellenkommentaren angegeben, $post->post_content = "foo"; wirkt in diesem Zusammenhang, aber $comment->comment_content = "bar"; nicht.

Um dies ein wenig nachzuverfolgen, habe ich einen Debug-Filter auf den Post-Inhalt und auf den Kommentar-Inhalt angewendet:

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

Nach der obigen Inhaltsmodifikationsroutine drucken diese Filter “foo” im Falle von Post-Inhalt, aber der Kommentar-Inhalt wird unverändert gedruckt (der ursprüngliche Inhalt wird gedruckt).

Daher $comment->comment_content = "bar"; scheint eine lokale Modifikation zu sein, während $post->post_content = "foo"; funktioniert wie gewünscht: global.

Oder wird die database sogar zweimal nach Kommentaren abgefragt, so dass meine Modifikation irgendwann überschrieben wird?

Ich habe auch versucht, mit $wp_query->comments zu arbeiten. Aber diese Variable ist NULL zu dem Zeitpunkt, den ich möchte und muss einhaken.

Die letzte und wichtigste Frage ist:

Was muss ich in meiner obigen Schleife tun, um den Kommentarinhalt dauerhaft zu ändern?

Zu Ihrer Information: Ich benutze WordPress 3.0.1

Solutions Collecting From Web of "Wie ändern Sie den Kommentarinhalt dauerhaft basierend auf $ wp_query?"

Die function, die die Kommentarvorlage enthält, lädt auch die Kommentare (neu) . Das heißt, was auch immer Sie vor diesem Punkt tun, wenn Sie es nicht in der database speichern, wird es nicht verwendet.

Es gibt keine Möglichkeit, diese SQL-Abfrage zu verhindern, aber Sie können die Ergebnisse überschreiben, indem Sie sich in den Filter comments_array einklinken. Ich würde Ihre Änderungen in einem Array speichern, das durch die Kommentar-ID codiert ist. So können Sie schnell nachschlagen und den Inhalt bei Bedarf ersetzen.

 $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; } 

Ohne viel mehr darüber zu wissen, was Sie anstreben, gibt es ein paar mögliche Lösungen.

Eine besteht darin, das zu tun, was Sie gerade 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 andere Möglichkeit besteht darin, einen Ausgabepuffer auf ‘template_redirect’ zu starten und einen Platzhalter auf dem Haken ‘wp_head’ zu drucken, um einen Punkt in der Kopfzeile zu markieren. Verwenden Sie dann die Filter ‘comment_text’ und ‘the_content’, um die Ausgabe zu ändern und nach den gewünschten Markern zu suchen. Im Callback des Ausgabepuffers muss er dann den Marker ersetzen, den Sie in die Kopfzeile eingefügt haben, mit der CSS, die Sie hinzufügen müssen. Das einzige Problem bei dieser Lösung besteht darin, dass die auf dem Server festgelegte Puffergröße möglicherweise nicht ausreicht, je nachdem, wie viel Inhalt auf einer einzelnen Seite vorhanden ist oder wie klein der Puffer ist.