Özel bir yazı türü için varsayılan yönetici sıralama düzenini özel bir sütuna nasıl ayarlarım?


16

BURADA MEVCUT ÇÖZÜM

Clientarea adında özel bir yazı türü ayarladım ve yönetici alanında bunun için birkaç özel sütun ayarladım - kodumdan görebileceğiniz gibi özel sütunların hepsi özel meta alanlardır. Varsayılan olarak azalan 'Randevu Tarihi' ne göre sıralamak istiyorum.

Tüm sütunlar iyi çalışıyor ve beklendiği gibi manuel olarak sıralanabilir, ancak çalışmak için varsayılan sıralama düzenini alamıyorum.

Varsayılan sıralama alanını standart bir alana (örneğin 'başlık') değiştirirsem beklendiği gibi çalışır; yalnızca varsayılan sıralama düzeni olarak özel bir sütun ayarlamaya çalıştığımda çalışmıyor gibi görünüyor. Sipariş çalışır (yani özel bir sütunla bile varsayılan olarak asc ve desc arasında değişebilir), ancak siparişi almıyor, bu yüzden özel yayının yayınlandığı tarihe göre sıralamaya geri dönüyor.

Neyi kaçırıyorum?

Kodum aşağıdaki gibidir:

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

Aşağıdaki - geçmişte karışık sonuçları olan bir müşteri için denedim. Bunun için iyi bir çözüm görmeye istekli.
jdm2112

Özel sütunlar için sıralamanızı çözebildiniz mi?
jdm2112

@ jdm2112 - yep - Ben bunu yığın Exchange (çünkü orada bir lütuf ayarlamak için yeterli temsilcisi vardı ..) çapraz yayınlanmıştır - verilen cevapların her ikisi de doğru, ama kabul edilen daha fazla açıklama ve önerilen bazı kod iyileştirmeleri verir. stackoverflow.com/questions/31434373/…
SinisterBeard

1
Uygun bir çözüm eklemelisiniz. Sen edebilirsiniz senin üzerine görevinden çözüm kopyalamak yığın taşması veya tüm cevaplar bir kombinasyonu ve sadece orijinal yazarlara kredi biçimi olarak bağlantı yayınla. Biliyorum @birgire kredi ;-) ile bir repost umursamaz
Pieter Goosen

2
Soruna yardımcı olduğunu duyduğuma sevindim, sadece WPSE'deki soruyu fark ettim. @PieterGoosen önerileriniz için teşekkürler, "akla ya da akla değil" bu destansı bir soru
😃

Yanıtlar:


10

Bir gelen Çözüm çapraz yazı dan Stack Exchange at üzerinde @birgire :

Sorun, clientarea_default_ordergeri aramayı çok geç çalıştırmanızdır .

Bunu düzeltmek için önceliği yalnızca varsayılan olandan değiştirmeniz gerekir 10:

add_action( 'pre_get_posts','clientarea_default_order');

önceliğine 9:

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

Ama aslında iki pre_get_postsgeri aramaya ihtiyacınız yok .

Bunları birleştirebilirsiniz:

Örnek 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;
    }
}

burada bir ana sorgu kontrolü ve boş bir anahtar durumu ekledik .

Örnek 2

İşte switchkısmı olmayan başka bir yaklaşım (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']  );
    }
}

Harika, eksiksiz bir cevap gönderdiğiniz için teşekkür ederiz. +1
Pieter Goosen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.