如何按帖子标题对评论进行排序?

时间:2017-02-08 作者:the.matrix

到目前为止,我所做的一切都没有成功。因此,我开始四处寻找几天,试图找出如何按评论的标题排序。(我也尝试了meta\\u值,但似乎做得不对)。我读了wp法典。下面是我试图按帖子标题对评论进行排序的内容,但没有title或post\\u title参数作为评论的排序依据。任何帮助都将不胜感激。

<?php $args = array(
    \'status\' => \'approve\',
    \'post_status\' => \'publish\',
    \'post_type\' => \'post\',
    \'orderby\' => \'title\',
    \'order\' => \'DESC\'
);

$comments_query = new WP_Comment_Query; ?>

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

这个WP_Comment_Querysupports 订购人:

\'comment_agent\',
\'comment_approved\', 
\'comment_author\',
\'comment_author_email\', 
\'comment_author_IP\',
\'comment_author_url\', 
\'comment_content\', 
\'comment_date\',
\'comment_date_gmt\', 
\'comment_ID\', 
\'comment_karma\',
\'comment_parent\', 
\'comment_post_ID\', 
\'comment_type\',
\'user_id\', 
\'comment__in\', 
\'meta_value\', 
\'meta_value_num\',
有一种方法可以通过过滤器进行调整,因此我们可以支持按帖子标题排序:

$args = [
    \'status\'       => \'approve\',
    \'post_status\'  => \'publish\',
    \'post_type\'    => \'post\',
    \'orderby\'      => \'_post_title\', // <-- Our custom orderby value
    \'order\'        => \'DESC\'
];

$comment_query = new WP_Comment_Query( $args ); 
一个简单的演示插件,支持_post_title 订购可以使用PHP 7:

/**
 * Adjust orderby comments clause
 */

add_filter( \'comments_clauses\', function( $clauses, \\WP_Comment_Query $cq ) use ( &$wpdb )
{   
    $qv      = $cq->query_vars;
    $orderby = $qv[\'orderby\'] ?? \'\';
    $order   = $qv[\'order\'] ?? \'ASC\';

    if( 
           \'_post_title\' === $orderby 
        && in_array( strtoupper( $order ), [ \'ASC\', \'DESC\' ], true ) 
    )
        $clauses[ \'orderby\' ] = " {$wpdb->posts}.post_title {$order},
            {$wpdb->comments}.comment_ID {$order} "; 


    return $clauses;
}, 10, 2 );
然后,为了确保posts表已连接到comment表,如果缺少post type参数,我们可以将其设置为“post”:

/**
 * Make usre we have the posts table joined by making sure the post_type isn\'t empty.
 */

add_action( \'pre_get_comments\', function( \\WP_Comment_Query $cq )
{
    $qv      = &$cq->query_vars;
    $orderby = $qv[\'orderby\'] ?? \'\';

    if( \'_post_title\' === $orderby && empty( $qv[\'post_type\'] ) )
        $qv[\'post_type\'] = \'post\';

} );
请注意,此类查询:

SELECT  wp_comments.comment_ID 
    FROM wp_comments JOIN wp_posts ON wp_posts.ID = wp_comments.comment_post_ID     
    WHERE ( comment_approved = \'1\' ) 
        AND  wp_posts.post_status IN (\'publish\') 
        AND  wp_posts.post_type IN (\'post\')  
    ORDER BY  wp_posts.post_title DESC, wp_comments.comment_ID DESC  
由于使用临时文件和文件排序,因此效率不高。

希望您能根据需要进一步调整。

相关推荐

GET_POSTS在页面模板中工作,但不在短码中工作

我正在尝试编写一个短代码,其中包括“get\\u posts”,以便获取博客帖子数据,然后在页面上显示最近的3篇文章。此代码在模板中工作。然而,当我将其放入输出缓冲区(ob\\u start)内的短代码中时,它无法检索帖子。相反,它会获取当前页面本身并循环浏览该页面(在本例中为主页)。你知道我怎样才能让它按照最初的意图在帖子中循环吗?以下是在模板中工作的代码:<?php $lastposts = get_posts( array(\'posts_per_page\' => 3) );?>