为什么对COMMENTS_ARRAY挂钩所做的任何操作都被重置?

时间:2020-10-15 作者:Michał Kuczek

我正在写一个插件,允许简单的评论投票。

我正在尝试按UPVOLUES的数量对评论进行排序。但是我在comments\\u array挂钩上所做的任何事情都会以某种方式重置。我的问题是在哪里,如何?

这是我的代码:

add_filter( \'comments_array\', \'biiird_order_comments_by_likes\' );
function biiird_order_comments_by_likes( $array ) {

    $arraya = $array;

    usort($arraya, function($a, $b) {
        $likes_a = get_comment_meta( $a->comment_ID, \'likes\', true );
        $likes_b = get_comment_meta( $b->comment_ID, \'likes\', true );
        
        return ($likes_a > $likes_b) ? -1 : 1;

    });

    foreach ( $arraya as $comment ) {
        $comment->comment_content .= \'something\';
    }
    var_dump($arraya);
    var_dump($array);

    return $arraya;
}
Thevar_dump($arraya) 按正确的顺序输出修改后的数组,但注释会显示在页面上,就好像过滤器未运行一样。

2 个回复
最合适的回答,由SO网友:Andy 整理而成

这不是一个bug。

如果您查看从line 2100 of wp/wp-includes/comment-template.phpwp_list_comments 函数,您将看到如果per_page 参数已设置且其值与主wp\\U查询的值不同,它将执行单独的注释查询并显示这些注释查询,而不是已排序的注释查询。

要解决此问题,您需要创建一个自定义助行器并将其传递给wp_list_comments 函数并在此执行排序:

wp_list_comments([\'walker\' => new MySortingCommentWalker()]);
考虑到您正在编写插件,您可以使用wp_list_comments_args 筛选以确保始终使用自定义助行器:

add_filter(\'wp_list_comments_args\', function($args) {
    $args[\'walker\'] = new MySortingCommentWalker();
    return $args;
});
您可以扩展默认值Walker_Comment 类,重写paged_walk 方法并对其中的注释进行排序。排序后,可以将它们传递给父方法:

class MySortingCommentWalker extends \\Walker_Comment
{
    public function paged_walk($elements, $max_depth, $page_num, $per_page, ...$args)
    {
        // Pass $elements to your sorting function here
        
        return parent::paged_walk($elements, $max_depth, $page_num, $per_page, $args);
    }
}

SO网友:Michał Kuczek

我想我在wordpress中发现了一个bug,导致这个问题的原因是\'per_page\' 传入的参数wp_list_comments(). 如果已设置,则对comments\\u array hook所做的更改将在稍后的wp core中重置或忽略。

我90%确定这是一个bug,我已经报告过了wordpress trac.

相关推荐

Disallow Comments

我的网络主机暂停了我的网站,因为页面的评论部分被垃圾邮件发送,因此我无法再通过wordpress访问该网站。我需要编辑哪些文件才能关闭所有页面上的评论?我如何测试更改?