web-dev-qa-db-ja.com

作者によるクエリセットの順序

チケットのリストにある[作成者]矢印をクリックしたときに、作成者名順に並べ替えようとしています。あなたが矢印をクリックすると、名前は私が識別できないものによって順序付けされています。ユーザーの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
ILikeTurtles

作者による順序付けでは、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- filterにフックします。そこで、実際にSQLステートメントを変更できます。

するべき

  1. このテーブルでニックネームを見つけたら、ユーザーテーブルに参加します。
  2. それに応じてorderbyステートメントを変更してください。
2
websupporter