Query Set Order By Author

时间:2015-02-09 作者:ILikeTurtles

当您单击票证列表上的“作者”箭头时,我试图按author\\u名称排序。单击箭头时,名称按我无法识别的顺序排列。我希望他们按实际名称而不是用户的ID号订购。

如何让orderby按照用户(作者)的“好名字”进行查询?

public function add_support_ticket_author_query( $query )
{
    if ( $query->is_main_query() && ( $orderby = $query->get( \'orderby\' ) ) ) {
        switch( $orderby ) {
            case \'author\':
                $query->set( \'orderby\', \'author\' );
                break;
        }
    }
}

1 个回复
SO网友:websupporter

作者订购nicename本机不受WP_Query. 如果您按作者订购,正如您所经历的那样,您可以按作者的ID订购。

因此,您实际上需要进入SQL子句并自己管理它。

这是一种快速而肮脏的黑客行为:

<?php

add_action( \'pre_get_posts\', function( $query ) {

    if (
        ! $query->is_main_query() 
        || \'author\' !== $query->get( \'orderby\' )
    ) {
        return;
    }

    add_filter( \'posts_clauses\', \'177581_add_nicename_orderby\', 10, 2 );
} );

function 177581_add_nicename_orderby( $clauses, $query ) {

    global $wpdb;

    $clauses[\'join\'] = \'LEFT JOIN \' . $wpdb->users . \' AS author ON ( \' . $wpdb->posts . \'.post_author = author.ID)\';
    $clauses[\'orderby\'] = \'author.user_nicename \' . $query->get( \'order\' );
    return $clauses;
}
我们需要做的是:在第一步中,如果我们想按作者排序,我们会检查我们对按其名称排序的内容是否一视同仁。如果是这种情况,我们将posts_clauses-过滤器,在这里我们可以实际更改SQL语句。

我们必须

加入用户表,因为我们在这个表中找到了nicename

结束