Cum setez ordinea implicită de sortare pentru administrator într-un tip de postare personalizat către o coloană personalizată?

15 iul. 2015, 13:52:11
Vizualizări: 20K
Voturi: 16

SOLUȚIE DISPONIBILĂ AICI

Am configurat un tip de postare personalizat numit clientarea și am setat mai multe coloane personalizate pentru acesta în zona de administrare - coloanele personalizate sunt toate câmpuri meta personalizate, după cum puteți vedea din codul meu. Aș dori să sortez după 'Data Programării' descendent în mod implicit.

Toate coloanele funcționează bine și pot fi sortate manual după cum era de așteptat, dar nu reușesc să fac să funcționeze ordinea implicită de sortare.

Dacă schimb câmpul implicit de sortare cu un câmp standard (de ex. 'title') funcționează conform așteptărilor; pare să nu funcționeze doar când încerc să setez o coloană personalizată ca ordine implicită de sortare. Ordinea funcționează (adică pot schimba între asc și desc implicit chiar și cu o coloană personalizată), dar nu preia orderby așa că revine la sortarea după data la care a fost publicată postarea personalizată.

Ce îmi scapă?

Codul meu este următorul:

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

Am urmărit - am încercat asta în trecut pentru un client cu rezultate mixte. Dornic să văd o soluție bună la această problemă.

jdm2112 jdm2112
15 iul. 2015 17:44:05

Ai reușit să rezolvi sortarea pentru coloanele personalizate?

jdm2112 jdm2112
21 iul. 2015 23:44:59

@jdm2112 - da - am postat aceeași întrebare pe Stack Exchange (pentru că aveam suficiente puncte pentru a oferi o recompensă acolo..) - ambele răspunsuri primite sunt corecte, dar cel acceptat oferă mai multe explicații și câteva sugestii de îmbunătățire a codului. http://stackoverflow.com/questions/31434373/in-wordpress-how-do-i-set-the-default-admin-sort-order-for-a-custom-post-type-t

SinisterBeard SinisterBeard
27 iul. 2015 11:48:47

Ar trebui să adaugi o soluție corectă. Poți copia soluția din postarea ta pe [so], sau o combinație a tuturor răspunsurilor și apoi doar să postezi link-ul ca formă de credit pentru autorii originali. Știu că @birgire nu ar avea nicio problemă cu o republicare cu creditare ;-)

Pieter Goosen Pieter Goosen
27 iul. 2015 11:53:44

SCUZĂ, Știu că @birgire ar avea o problemă cu o republicare cu creditare TREBUIE SĂ FIE Știu că birgire NU ar avea nicio problemă cu o republicare cu creditare :-)

Pieter Goosen Pieter Goosen
27 iul. 2015 12:05:04

Gata! Nu eram sigur de etichetă.

SinisterBeard SinisterBeard
27 iul. 2015 12:13:46

Mă bucur că a ajutat cu problema, tocmai am observat întrebarea aici pe WPSE. @PieterGoosen mulțumesc pentru sugestii, "a gândi sau a nu gândi" asta este întrebarea epică

birgire birgire
27 iul. 2015 13:28:32

@birgire Te cunosc prea bine ;-)

Pieter Goosen Pieter Goosen
27 iul. 2015 13:33:17
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 1
1
12

Soluție dintr-un post încrucișat de pe StackExchange de la @birgire:

Problema este că rulezi callback-ul clientarea_default_order prea târziu.

Pentru a remedia acest lucru, trebuie doar să modifici prioritatea de la cea implicită care este 10:

add_action( 'pre_get_posts','clientarea_default_order');

la prioritatea de 9:

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

Dar, de fapt, nu ai nevoie de două funcții callback pentru pre_get_posts.

Le poți combina:

Exemplul #1

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

function extranet_orderby( $query ) 
{   
    // Nimic de făcut:  
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modifică părțile 'orderby' și 'meta_key'
    //-------------------------------------------  
    $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 '':  // <-- Cazul implicit gol
            $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;
    }
}

unde am adăugat o verificare pentru interogarea principală și un caz gol în switch.

Exemplul #2

Iată o altă abordare, fără partea switch (PHP 5.4+):

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

function extranet_orderby( $query )
{
    // Nimic de făcut
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modifică părțile 'orderby' și 'meta_key'
    //-------------------------------------------  
    $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']  );
    }
}
27 iul. 2015 12:13:02
Comentarii

Grozav, mulțumesc pentru postarea unui răspuns complet și cu creditare. +1

Pieter Goosen Pieter Goosen
27 iul. 2015 12:21:33