Sticky Comments

时间:2015-10-25 作者:matthew

我怎么能有粘性评论?我正在努力做到这一点,以便我可以在所有其他评论之前发表评论。这可能吗?如果是,我可以使用什么代码来实现这一点?谢谢

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

我对任何现有的插件都很好奇,并搜索了插件目录。存在一个旧的粘性评论插件,我与它无关。它似乎使用了一个粘滞的元键。

它使用左连接查询,但创建其自己的整个版本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来标记粘性注释。但是你可以查看我前面提到的这个老插件,了解关于这个问题的想法。