如何根据评论元字段对“EDIT-Comments.php”表中的评论进行排序?

时间:2021-08-30 作者:PantelD

目标

在;编辑注释。php“;单击自定义列的标题后,基于注释元字段的表。

上下文

为了简洁起见,我们假设在发布评论时,一个名为;“红心”;指定给它,以便所有注释都具有从0到10的正整数字段。的bold 下面提到的步骤,前三个步骤是针对上下文和预期工作给出的,问题是在第四个步骤上。

1. Creating the column

add_filter( \'manage_edit-comments_columns\', \'hearts_add_comments_column\' );
function hearts_add_comments_column( $cols ) {
    $cols[\'hearts\'] = \'Hearts\';
    return $cols;
}

2. Populating the column

add_action( \'manage_comments_custom_column\', \'hearts_column_content\', 10, 2 );
function hearts_column_content( $column, $comment_ID ) {
    switch ( $column ) :
        case \'hearts\' : {           
            $hearts = get_comment_meta( $comment_ID, \'hearts\', true );                  
            echo $hearts;           
            break;
        }
    endswitch;
}
add_action( \'manage_comments_custom_column\', \'hearts_column_content\', 10, 2 );
function hearts_column_content( $column, $comment_ID ) {
    switch ( $column ) :
        case \'hearts\' : {           
            $hearts = get_comment_meta( $comment_ID, \'hearts\', true );                  
            echo $hearts;           
            break;
        }
    endswitch;
}

4. Sort based on comment meta

这就是问题开始的地方,以下代码中需要更改一些内容,当独立测试时,这些代码将按预期返回排序的注释列表:

add_action( \'pre_get_comments\', \'hearts_orderby\' );
function hearts_orderby( $comments_query ) {
    $orderby = $comments_query->query_vars[\'orderby\'];
 
    if( \'by_hearts\' == $orderby ) {
        $comments_query->query(array( 
            \'meta_key\' => \'hearts\',
            \'orderby\' => \'meta_value_num\'
        ));         
    }
}
单击列标题时出现严重错误;“红心”;对列进行排序。重定向到包含以下消息的空页面:Critical Error when clicking on the column\'s title "Hearts" to sort the column.

Things tried

下面的代码没有错误,注释已列出但未排序。如果我完全删除下面的代码,结果是一样的。代码基于的最后一段代码this page.

add_action( \'pre_get_comments\', \'hearts_orderby\' );
function hearts_orderby( $comments_query ) {
    $orderby = $comments_query->query_vars[\'orderby\'];
 
    if( \'by_hearts\' == $orderby ) {
        $comments_query->set(\'meta_key\',\'hearts\');
        $comments_query->set(\'orderby\',\'meta_value_num\');   
    }
}
有没有可能以某种方式改变hearts_orderby() 在第四步中发挥作用以获得所需的结果

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

在第四步中是否可以使用不同的挂钩?

是的,请参见parse_comment_query 这也是一个动作钩,但它在pre_get_comments.

是否有可能以某种方式改变hearts_orderby() 在第四步中发挥作用以获得所需的结果?

但首先,你应该知道WP_QueryWP_Comment_Query (当前)没有set() 方法,所以尽管调用$comments_query->set() 没有导致任何错误meta_keyorderby args从未实际设置。

()WP_Comment_Query 有魔力__call() method, 因此调用不存在的方法,例如set() 只会返回false 不做任何其他事情)

现在,要使您的功能正常工作,只需通过直接修改$comments_query->query_vars 类似这样的阵列:

if( \'by_hearts\' == $orderby ) {
    $comments_query->query_vars[\'meta_key\'] = \'hearts\';
    $comments_query->query_vars[\'orderby\'] = \'meta_value_num\';
}
但是,如果要在不包含hearts meta,则可以使用meta_query 参数:

$meta_query = isset( $comments_query->query_vars[\'meta_query\'] ) ?
    (array) $comments_query->query_vars[\'meta_query\'] : array();

$meta_query[] = array(
    \'relation\'  => \'OR\',

    // Include comments having the meta.
    // Match the array key with the $orderby value.
    \'by_hearts\' => array(
        \'key\'  => \'hearts\',
        \'type\' => \'NUMERIC\',
    ),

    // Include comments without the meta.
    \'no_hearts\' => array(
        \'key\'     => \'hearts\',
        \'compare\' => \'NOT EXISTS\',
    ),
);

$comments_query->query_vars[\'meta_query\'] = $meta_query;

相关推荐

404在wp-admin上找不到nginx

我有自己的域名,我在InfinityFree上托管这个网站。所以在打字时http:// mysite.com/wp-admin 它给了我404找不到的nginx页面。我已成功安装WordPress,并添加了名称服务器。我什么都没有改变,只是安装了新的,并以这个结束。我不知道怎么了?我正在为自己创建网站,并且还在学习。我读了几篇文章,但没有找到确切的答案。非常感谢。