web-dev-qa-db-fra.com

Ensemble de requêtes, ordre par auteur

J'essaie de commander par l'auteur lorsque vous cliquez sur la flèche de l'auteur sur une liste de tickets. Lorsque vous cliquez sur la flèche, les noms sont classés par quelque chose que je ne peux pas identifier. Je veux qu'ils commandent par le nom réel et non par le numéro d'identification de l'utilisateur.

Comment puis-je obtenir la commande pour interroger par le "joli nom" de l'utilisateur (auteur)?

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

Pour commander par les auteurs, nicename n'est pas pris en charge de manière native par le WP_Query . Si vous commandez par auteur, comme vous l'avez expérimenté, vous commandez par l'ID de l'auteur.

Donc, vous devez réellement aller dans les clauses SQL et gérer cela vous-même.

C'est un hack rapide et sale à faire:

<?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;
}

Ce que nous devons faire: lors de la première étape, nous vérifions, si nous souhaitons commander par auteur, ce que nous traitons également par son nom. Si tel est le cas, nous ajoutons le filtre posts_clauses- dans lequel nous pouvons réellement modifier les instructions SQL.

Nous devons

  1. Rejoignez la table user, car nous trouvons le nicename dans cette table.
  2. Modifiez notre déclaration orderby en conséquence.
2
websupporter