web-dev-qa-db-fra.com

L'ordre de tri du type de message personnalisé ne fonctionne pas dans la zone d'administration

J'ai un site WordPress qui a quelques types de publication personnalisés. Aucun de ces types de messages personnalisés ne me permet de trier les messages par ordre alphabétique ou par date dans la zone d'administration.

J'ai regardé partout en ligne pour essayer de résoudre ce problème, mais je n'arrive pas à trouver quoi que ce soit qui fonctionne.

Dois-je appliquer une action sur le nombre de postes dans la zone d'administration?

3
Kane Mitchell

Les colonnes "titre" et "date" sont des tableaux par défaut de WordPress (même pour les CPT). Elles doivent donc pouvoir être automatiquement triées, sauf si ces colonnes ont été remplacées.

Pour les colonnes personnalisées, il existe un crochet pour enregistrer une colonne en tant que 'triable': https://developer.wordpress.org/reference/hooks/manage_this-screen-id_sortable_columns/

//Filter is 'manage_edit-{custom post type}_sortable_columns
//or more generally 'manage_{screen id}_sortable_columns
add_filter( 'manage_edit-cpt_sortable_columns', 'wpse221267_cpt_sortable_columns' );
function wpse221267_cpt_sortable_columns( $columns ) {
    //$columns is an array indexed by column identifier
    //and the value is a sort identifier. This sets the orderby parameter (see below)
    //Each element in $columns corresponds to a sortable column
    $columns['column_id'] = 'sort_identifier';
    return $columns;
}

Cependant, ce only gère l’interface utilisateur: il n’implémente pas le tri. Pour ce faire, vous devez intercepter la requête à pre_get_posts:

add_action( 'pre_get_posts', 'wpse221267_column_orderby' );  
function wpse221267_column_orderby( $query ) {  

    //Some sanity checking, you may want to check for screen ID too.        
    if( ! is_admin() ) {
        return;  
    }

    //This value will be determined by the column clicked
    //and its associated sort identifier (see above!)
    $orderby = $query->get( 'orderby');  
    $order   = $query->get( 'order' );

    if( 'sort_identifier' == $orderby ) {  
        //Modify $query to sort by $orderby and $order.
    }  
}  
2
Stephen Harris