如何根据$wp_Query持久化修改评论内容?

时间:2010-11-25 作者:Jan-Philip Gehrcke

对于插件,我需要构建自己的早期帖子内容和评论内容过滤器。发布内容/文本更改工作,即修改最终在客户端浏览器中完成。但我的评论内容/文本修改在某种程度上并不持久,即客户端接收到原始评论文本。

时间点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

2 个回复
最合适的回答,由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;
}

SO网友:prettyboymp

在不了解更多关于你想要完成什么的情况下,有几种可能的解决方案。

一种是继续执行当前正在执行的操作,但也要在“comment\\u text”中添加一个过滤器以更改注释输出。这样做的缺点是您要多次查询注释。

另一个选项是在“template\\u redirect”上启动一个输出缓冲区,并在“wp\\u head”挂钩上打印一个占位符,以标记标头中的一个点。然后使用“comment\\u text”和“the\\u content”过滤器更改输出并检查您要查找的标记。然后,在输出缓冲区回调中,让它用您需要添加的任何css替换您在标头中放置的标记。此解决方案的唯一问题是,服务器上设置的缓冲区大小可能不够,这取决于单个页面中的内容量或缓冲区的大小。

结束

相关推荐

I can't view or add comments

嘿,那里。我刚刚建立了这个网站。http://www.paledogstudios.com 它工作得很好,只是我似乎看不到过去的评论(这个博客是从blogger导入的)或添加评论。我知道这是代码而不是设置,因为有人告诉我,但他没有进一步帮助我。他说这可能在索引上。php帮助