Comment définir l'ordre de tri administrateur par défaut pour un type de publication personnalisé sur une colonne personnalisée?


15

SOLUTION DISPONIBLE ICI

J'ai mis en place un type de publication personnalisé appelé clientarea, et mis en place plusieurs colonnes personnalisées pour celui-ci dans la zone d'administration - les colonnes personnalisées sont toutes des champs méta personnalisés, comme vous pouvez le voir dans mon code. Je voudrais trier par 'Date de rendez-vous' décroissant par défaut.

Toutes les colonnes fonctionnent correctement et peuvent être triées manuellement comme prévu, mais je ne parviens pas à faire fonctionner l'ordre de tri par défaut.

Si je change le champ de tri par défaut en un champ standard (par exemple «titre»), cela fonctionne comme prévu; il semble que cela ne fonctionne pas lorsque j'essaie de définir une colonne personnalisée comme ordre de tri par défaut. La commande fonctionne (c'est-à-dire que je peux changer entre asc et desc par défaut même avec une colonne personnalisée), mais elle ne reprend pas la commande par conséquent, elle revient au tri selon la date de publication du message personnalisé.

Qu'est-ce que je rate?

Mon code est le suivant:

add_action( 'manage_posts_custom_column' , 'custom_columns', 10, 2 );

function custom_columns( $column, $post_id ) {
    global $wpdb;
    switch ( $column ) {
        case 'extranet_case_office':
            $get_office_ID = get_post_meta( $post_id, 'extranet_case_office', true );
            $get_office_name = $wpdb->get_results('SELECT post_title FROM `cn_bf_posts` WHERE `ID` = '.$get_office_ID);
            echo $get_office_name[0]->post_title;
            break;
        case 'extranet_appointment_date':
            echo date('d/m/Y',strtotime(get_post_meta( $post_id, 'extranet_appointment_date', true ))); 
            break;
        case 'extranet_appointment_type':
            echo get_post_meta( $post_id, 'extranet_appointment_type', true ); 
            break;
        case 'extranet_insolvency_practioner':
            $get_person_ID = get_post_meta( $post_id, 'extranet_insolvency_practioner', true );
            $get_person_name = $wpdb->get_results('SELECT post_title FROM `cn_bf_posts` WHERE `ID` = '.$get_person_ID);
            echo $get_person_name[0]->post_title;
            break;
        default:
            break;
    }
}

add_filter( 'manage_edit-clientarea_sortable_columns', 'my_sortable_clientarea_columns' );

function my_sortable_clientarea_columns( $columns ) {
    $columns['extranet_case_office'] = 'extranet_sort_office';
    $columns['extranet_appointment_date'] = 'extranet_sort_date';
    $columns['extranet_appointment_type'] = 'extranet_sort_type';
    $columns['extranet_insolvency_practioner'] = 'extranet_sort_IP';
    return $columns;
}

add_action( 'pre_get_posts', 'extranet_orderby' );

function extranet_orderby( $query ) {
    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby');

    switch ( $orderby ) {
        case 'extranet_sort_office':
            $query->set('meta_key','extranet_case_office');
            $query->set('orderby','meta_value_num');
            break;
        case 'extranet_sort_date':
            $query->set('meta_key','extranet_appointment_date');
            $query->set('orderby','meta_value');
            break;
        case 'extranet_sort_type':
            $query->set('meta_key','extranet_appointment_type');
            $query->set('orderby','meta_value');
            break;
        case 'extranet_sort_IP':
            $query->set('meta_key','extranet_insolvency_practioner');
            $query->set('orderby','meta_value_num');
            break;
        default:
            break;
    }
}

add_action('pre_get_posts','clientarea_default_order');
function clientarea_default_order( $query ){
    if( $query->get('post_type')=='clientarea' ){
        if( $query->get('orderby') == '' )
            $query->set('orderby','extranet_sort_date');

        if( $query->get('order') == '' )
            $query->set('order','desc');
    }
}

Suite - J'ai essayé cela dans le passé pour un client avec des résultats mitigés. Désireux de voir une bonne solution à celui-ci.
jdm2112

Avez-vous pu résoudre votre tri pour les colonnes personnalisées?
jdm2112

@ jdm2112 - yep - J'ai croisé cela sur Stack Exchange (parce que j'avais assez de représentants pour définir une prime là-bas ..) - les deux réponses données sont correctes, mais celle acceptée donne plus d'explications et quelques suggestions d'amélioration du code. stackoverflow.com/questions/31434373/…
SinisterBeard

1
Vous devez ajouter une solution appropriée. Vous pouvez copier la solution de votre message sur Stack Overflow , ou une combinaison de toutes les réponses, puis poster simplement le lien sous forme de crédit aux auteurs originaux. Je sais que @birgire accepterait une rediffusion avec crédit ;-)
Pieter Goosen

2
Heureux d'entendre que cela a aidé à résoudre le problème, je viens de remarquer la question ici sur WPSE. @PieterGoosen merci pour vos suggestions, "penser ou ne pas penser" c'est la question épique 😃
birgire

Réponses:


9

Solution d'un post croisé sur StackExchange de @birgire :

Le problème est que vous exécutez le clientarea_default_orderrappel trop tard.

Pour résoudre ce problème, il vous suffit de modifier la priorité par rapport à celle par défaut qui est 10:

add_action( 'pre_get_posts','clientarea_default_order');

à la priorité de 9:

add_action( 'pre_get_posts','clientarea_default_order', 9 );

Mais vous n'avez en fait pas besoin de deux pre_get_postsrappels.

Vous pouvez les combiner:

Exemple 1

is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' );    

function extranet_orderby( $query ) 
{   
    // Nothing to do:  
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modify the 'orderby' and 'meta_key' parts
    //-------------------------------------------  
    $orderby = $query->get( 'orderby');      

    switch ( $orderby ) 
    {
        case 'extranet_sort_office':
            $query->set( 'meta_key', 'extranet_case_office' );
            $query->set( 'orderby',  'meta_value_num' );
            break;
        case 'extranet_sort_date':
            $query->set( 'meta_key', 'extranet_appointment_date' );  
            $query->set( 'orderby',  'meta_value' );
            break;
        case '':  // <-- The default empty case
            $query->set( 'meta_key', 'extranet_appointment_date' );  
            $query->set( 'orderby',  'meta_value' );
            break;
        case 'extranet_sort_type':
            $query->set( 'meta_key', 'extranet_appointment_type' );
            $query->set( 'orderby',  'meta_value' );
            break;
        case 'extranet_sort_IP':
            $query->set( 'meta_key', 'extranet_insolvency_practioner' );
            $query->set( 'orderby', 'meta_value_num' );
            break;
        default:
            break;
    }
}

où nous avons ajouté une vérification de requête principale et un boîtier de commutateur vide .

Exemple # 2

Voici une autre approche, sans la switchpartie (PHP 5.4+):

is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' );

function extranet_orderby( $query )
{
    // Nothing to do
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modify the 'orderby' and 'meta_key' parts
    //-------------------------------------------  
    $orderby = strtolower( $query->get( 'orderby') );  
    $mods = [
        'office' => [ 'meta_key' => 'extranet_sort_office',           'orderby' => 'meta_value_num' ],
        'date'   => [ 'meta_key' => 'extranet_appointment_date',      'orderby' => 'meta_value'     ],
        ''       => [ 'meta_key' => 'extranet_appointment_date',      'orderby' => 'meta_value'     ],
        'type'   => [ 'meta_key' => 'extranet_sort_type',             'orderby' => 'meta_value_num' ],
        'ip'     => [ 'meta_key' => 'extranet_insolvency_practioner', 'orderby' => 'meta_value_num' ],
    ];
    $key = 'extranet_sort_' . $orderby;
    if( isset( $mods[$key] ) )
    {
        $query->set( 'meta_key', $mods[$key]['meta_key'] );
        $query->set( 'orderby',  $mods[$key]['orderby']  );
    }
}

Très bien, merci d'avoir posté une réponse complète et avec crédit. +1
Pieter Goosen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.