对于插件,我需要构建自己的早期帖子内容和评论内容过滤器。发布内容/文本更改工作,即修改最终在客户端浏览器中完成。但我的评论内容/文本修改在某种程度上并不持久,即客户端接收到原始评论文本。
时间点I“;“挂钩”;由定义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";
按需工作:全局。
或者是数据库甚至查询了两次注释,以便在某个时候以某种方式覆盖我的修改?
我试着和$wp_query->comments
, 也但这个变量是NULL
在这个时候,我想也需要加入进来。
最后一个也是主要的问题是:
In my loop above, what do I have to do, to modify the comment content persistently?
仅供参考:我正在使用WordPress 3.0.1
最合适的回答,由SO网友:Jan Fabry 整理而成
包含注释模板的函数also (re)loads the comments. 这意味着,无论您在该点之前做什么,如果不将其保存到数据库中,它都不会被使用。
无法阻止此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;
}