目标
在;编辑注释。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\'
));
}
}
单击列标题时出现严重错误;“红心”;对列进行排序。重定向到包含以下消息的空页面: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()
在第四步中发挥作用以获得所需的结果在第四步中是否可以使用不同的挂钩
最合适的回答,由SO网友:Sally CJ 整理而成
在第四步中是否可以使用不同的挂钩?
是的,请参见parse_comment_query
这也是一个动作钩,但它在pre_get_comments
.
是否有可能以某种方式改变hearts_orderby()
在第四步中发挥作用以获得所需的结果?
对
但首先,你应该知道WP_Query
班WP_Comment_Query
(当前)没有set()
方法,所以尽管调用$comments_query->set()
没有导致任何错误meta_key
和orderby
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;