对于插件,我需要构建自己的早期发布内容和注释内容过滤器。发布内容/文本更改作品,即修改最终进入客户端的浏览器。但是我的评论内容/文本修改某种程度上并不持久,即客户端收到原始评论文本。

我“钩子”的时间点是由 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 在时间点,我想要并且需要钩住。

最后和主要问题是:

在上面的循环中,我该怎么做才能持续修改评论内容?

仅供参考:我正在使用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;
}

其他提示

在不了解您要完成的工作的情况下,有一些可能的解决方案。

一种是继续执行您当前正在做的事情,但还要在“ comment_text”中添加过滤器以更改注释输出。缺点是您要多次查询评论。

另一个选项是在“ Template_redirect”上启动输出缓冲区,并在“ WP_head”钩上打印一个占位符,以标记标题中的一个位置。然后使用“ comment_text”和“ the_content”过滤器来更改输出并检查您想要的任何标记。然后,在输出缓冲区回调中,请用您需要添加的任何CSS替换标记。该解决方案的唯一问题是,服务器上设置的缓冲区大小可能不够,具体取决于单个页面中的内容或缓冲区的小度。

许可以下: CC-BY-SA归因
scroll top