$ wp_queryに基づいて、コメントコンテンツを永続的に変更するにはどうすればよいですか?
質問
プラグインの場合、自分の非常に初期の投稿コンテンツを構築し、コンテンツフィルターをコメントする必要があります。コンテンツ/テキストの変更作品を投稿してください。つまり、変更はクライアントのブラウザになります。しかし、私のコメントコンテンツ/テキストの変更はどういうわけか永続的ではありません。つまり、クライアントは元のコメントテキストを受け取ります。
私が「フックイン」の時点は、 template_redirect 針。次に、次のようなものを実行します。
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
}
}
上記のソースコメントを介して示されているように、 $post->post_content = "foo";
この文脈では効果がありますが $comment->comment_content = "bar";
そうではありません。
これを少なくとももう少し追跡するために、ポストコンテンツとコメントコンテンツにデバッグフィルターを適用しました。
add_filter('the_content', 'var_dump');
add_filter('comment_text', 'var_dump');
上記のコンテンツ変更ルーチンの後、これらのフィルターは投稿コンテンツの場合に「Foo」を印刷しますが、コメントコンテンツは変更されていません(元のコンテンツが印刷されています)。
したがって、 $comment->comment_content = "bar";
一方、ローカルの変更のようです $post->post_content = "foo";
必要に応じて機能します:グローバル。
または、データベースはコメントのために2回照会されています。
私は一緒に仕事をしようとしました $wp_query->comments
, 、 それも。しかし、この変数はです NULL
私が望んでいて、フックする必要がある時点で。
最終的な質問と主な質問は次のとおりです。
上記のループでは、コメントコンテンツを永続的に変更するために、私は何をしなければなりませんか?
参考までに:WordPress 3.0.1を使用しています
解決
コメントテンプレートを含む関数 また、コメントを(再)ロードします. 。これは、その時点以前に何をするにしても、データベースに保存しないと使用されないことを意味します。
このSQLクエリが発生するのを防ぐ方法はありませんが、結果を上書きすることができます。 comments_array
フィルター。コメントIDがキーにした配列に変更を保存するため、必要に応じてクイックルックアップを行い、コンテンツを交換できます。
$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;
}
他のヒント
あなたが達成するために何をしているのかをもっと知ることなく、いくつかの可能な解決策があります。
1つは、現在行っていることを続けることですが、「comment_text」にフィルターを追加してコメント出力を変更することです。これの欠点は、コメントを複数回クエリしていることです。
別のオプションは、「Template_redirect」で出力バッファーを起動し、「wp_head」フックにプレースホルダーを印刷して、ヘッダーのスポットをマークすることです。次に、「comment_text」と「the_content」フィルターを使用して出力を変更し、探しているマーカーを確認します。次に、出力バッファコールバックで、ヘッダーに入れたマーカーを、追加する必要があるCSSに置き換えます。このソリューションの唯一の問題は、サーバーに設定されたバッファサイズが、単一ページにあるコンテンツの量やバッファーがどれだけ小さいかによって、十分ではない可能性があることです。