Come impostare l'ordinamento predefinito dell'amministratore per un tipo di post personalizzato su una colonna personalizzata?


15

SOLUZIONE DISPONIBILE QUI

Ho impostato un tipo di post personalizzato chiamato clientarea e impostato diverse colonne personalizzate nell'area di amministrazione: le colonne personalizzate sono tutti metacampi personalizzati, come puoi vedere dal mio codice. Vorrei ordinare per 'Data appuntamento' decrescente per impostazione predefinita.

Tutte le colonne funzionano bene e possono essere ordinate manualmente come previsto, ma non riesco a far funzionare l'ordinamento predefinito.

Se cambio il campo di ordinamento predefinito in un campo standard (ad es. "Titolo") funziona come previsto; sembra non funzionare solo quando sto cercando di impostare una colonna personalizzata come ordinamento predefinito. L'ordine funziona (cioè posso cambiare tra asc e desc di default anche con una colonna personalizzata), ma non sta raccogliendo l'ordine, quindi sta tornando all'ordinamento entro la data di pubblicazione del post personalizzato.

Cosa mi sto perdendo?

Il mio codice è il seguente:

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');
    }
}

Di seguito: l'ho provato in passato per un cliente con risultati contrastanti. Ansioso di vedere una buona soluzione a questo.
jdm2112,

Sei riuscito a risolvere il tuo ordinamento per colonne personalizzate?
jdm2112,

@ jdm2112 - yep - Ho incrociato questo post su Stack Exchange (perché avevo abbastanza rappresentante per impostare una taglia lì ..) - Entrambe le risposte fornite sono corrette, ma quella accettata dà più spiegazioni e alcuni miglioramenti del codice suggeriti. stackoverflow.com/questions/31434373/…
SinisterBeard

1
È necessario aggiungere una soluzione adeguata. È possibile copiare la soluzione dal tuo post su Stack Overflow , o una combinazione di tutte le risposte e poi basta inviare il collegamento come forma di credito agli autori originali. So che @birgire dispiacerebbe ripubblicare con credito ;-)
Pieter Goosen il

2
Sono contento di sentirlo aiutare con il problema, ho appena notato la domanda qui su WPSE. @PieterGoosen grazie per i tuoi suggerimenti, "pensare o non pensare" questa è la domanda epica 😃
birgire,

Risposte:


9

Soluzione da un incrocio su StackExchange da @birgire :

Il problema è che si esegue il clientarea_default_ordercallback troppo tardi.

Per risolvere il problema, devi solo cambiare la priorità da quella predefinita che è 10:

add_action( 'pre_get_posts','clientarea_default_order');

alla priorità di 9:

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

Ma in realtà non hai bisogno di due pre_get_postscallback.

Puoi combinarli:

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

dove abbiamo aggiunto un controllo di query principale e un caso switch vuoto .

Esempio n. 2

Ecco un altro approccio, senza la switchparte (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']  );
    }
}

Ottimo, grazie per aver pubblicato una risposta completa e con il merito. +1
Pieter Goosen il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.