我对任何现有的插件都很好奇,并搜索了插件目录。存在一个旧的粘性评论插件,我与它无关。它似乎使用了一个粘滞的元键。
它使用左连接查询,但创建其自己的整个版本comments_template()
核心函数,重写当前查询。如果核心函数发生更改,则需要更新该自定义函数。这很可能是因为该函数包含硬编码的SQL查询。
现在,在WordPress 4.3.1中comments_template()
函数仅包含一个get_comments()
调用,因此我们可以使用单个筛选器来替代它。
现在,这里有一些如何做到这一点的想法:
方法#1
我们可以使用粘性注释类型来标记粘性注释。
然后我们可以使用pre_get_comments
挂钩调整顺序:
add_action( \'pre_get_comments\', \'wpse_comment_stickies_v1\' );
function wpse_comment_stickies_v1( \\WP_Comment_Query $q )
{
// Only run it once
remove_action( current_action(), __FUNCTION__ );
// Modify the ordering, so sticky comments are at the top
$q->query_vars[ \'orderby\'] = [
\'comment_type\' => \'DESC\',
\'comment_date_gmt\' => \'ASC\',
\'comment_ID\' => \'ASC\'
];
}
需要添加行的位置:
add_action( \'pre_get_comments\', \'wpse_comment_stickies_v1\' );
就在
comments_template()
调用您的主题。
WordPress 4.2中添加了数组排序,但Codex on WP_Comment_Query
没提这件事。
方法#2
此方法与#1中的方法类似,但这里我们使用
comments_clauses
筛选以修改注释的顺序:
add_filter( \'comments_clauses\', \'wpse_comment_stickies_v2\' );
function wpse_comment_stickies_v2( $clauses )
{
global $wpdb;
// Only run it once
remove_filter( current_filter(), __FUNCTION__ );
// Modify the ordering, so sticky comments are at the top
$clauses[\'orderby\'] = $wpdb->comments . \'.comment_type DESC, \' . $clauses[\'orderby\'];
return $clauses;
}
方法3我们也可以使用注释元。如果我们用
sticky
注释meta,然后我们可以使用以下命令修改排序:
add_action( \'comments_clauses\', \'wpse_stickies_v3\' );
function wpse_stickies_v3( $clauses )
{
global $wpdb;
// LEFT JOIN the comments table and the comments meta table
$clauses[\'join\'] .= "
LEFT JOIN {$wpdb->commentmeta} wpsecm
ON ( wpsecm.comment_id = {$wpdb->comments}.comment_ID AND wpsecm.meta_key = \'sticky\' ) ";
// Order by the meta key
$clauses[\'orderby\'] = \'wpsecm.meta_key DESC, \' . $clauses[\'orderby\'];
return $clauses;
}
方法4类似于方法3,但我们只修改
orderby
条款:
add_action( \'comments_clauses\', \'wpse_stickies_v4\' );
function wpse_stickies_v4( $clauses )
{
global $wpdb;
$orderby = [];
$orderby[] = "
( SELECT COUNT( comment_ID )
FROM {$wpdb->commentmeta} wpsecm
WHERE wpsecm.comment_id = {$wpdb->comments}.comment_ID
AND wpsecm.meta_key = \'sticky\'
) DESC ";
$orderby[] = $clauses[\'orderby\'];
$clauses[\'orderby\'] = join( \',\', $orderby );
return $clauses;
}
注释有时我希望有一个参数过滤器
comments template()
, 为了更容易只针对它的查询,因为您不想与其他
get_comments()
调用,例如在小部件中调用。
我创建了一个ticket #34442 通过一些建议,可以更容易地从插件定位此查询。
在WordPress 4.4中get_comments()
呼叫将替换为:
$comment_query = new WP_Comment_Query( $comment_args );
但这不会有太大变化,因为
get_comments()
只是一个简单的
WP_Comment_Query
包装器。
这里我没有提到如何修改UI来标记粘性注释。但是你可以查看我前面提到的这个老插件,了解关于这个问题的想法。