Bagaimana cara mengatur urutan sortir admin default untuk jenis posting kustom ke kolom kustom?


14

SOLUSI TERSEDIA DI SINI

Saya telah menyiapkan jenis posting khusus yang disebut clientarea, dan mengatur beberapa kolom khusus untuknya di area admin - kolom khusus adalah semua bidang meta khusus, seperti yang dapat Anda lihat dari kode saya. Saya ingin mengurutkan berdasarkan 'Tanggal Pengangkatan' menurun secara default.

Semua kolom berfungsi dengan baik, dan dapat disortir secara manual seperti yang diharapkan, tetapi saya tidak bisa mendapatkan urutan urutan default untuk bekerja.

Jika saya mengubah bidang pengurutan default ke bidang standar (misalnya 'judul') itu berfungsi seperti yang diharapkan; sepertinya tidak berfungsi ketika saya mencoba mengatur kolom khusus sebagai urutan sortir default. Urutan berfungsi (yaitu saya dapat mengubah antara asc dan desc secara default bahkan dengan kolom khusus), tetapi itu tidak mengambil orderby jadi kembali mengurutkan berdasarkan tanggal posting kustom diterbitkan.

Apa yang saya lewatkan?

Kode saya adalah sebagai berikut:

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

Mengikuti - Saya sudah mencoba ini sebelumnya untuk klien dengan hasil yang beragam. Ingin melihat solusi yang bagus untuk yang satu ini.
jdm2112

Apakah Anda dapat menyelesaikan penyortiran untuk kolom khusus?
jdm2112

@ jdm2112 - ya - Saya mengirim silang ini di Stack Exchange (karena saya punya cukup perwakilan untuk menetapkan hadiah di sana ..) - kedua jawaban yang diberikan benar, tetapi yang diterima memberikan lebih banyak penjelasan dan beberapa perbaikan kode yang disarankan. stackoverflow.com/questions/31434373/…
SinisterBeard

1
Anda harus menambahkan solusi yang tepat. Anda dapat menyalin solusi dari pos Anda di Stack Overflow , atau kombinasi dari semua jawaban dan kemudian hanya mengirim tautan sebagai bentuk kredit kepada penulis asli. Saya tahu @birgire akan berkeberatan dengan repost dengan kredit ;-)
Pieter Goosen

2
Senang mendengarnya membantu dengan masalah, hanya memperhatikan pertanyaan di sini di WPSE. @PieterGoosen terima kasih atas saran Anda, "untuk keberatan atau tidak untuk keberatan" itulah pertanyaan epik 😃
birgire

Jawaban:


8

Solusi dari pos silang di StackExchange dari @birgire :

Masalahnya adalah Anda menjalankan clientarea_default_ordercallback terlambat.

Untuk memperbaikinya Anda hanya perlu mengubah prioritas dari yang default yaitu 10:

add_action( 'pre_get_posts','clientarea_default_order');

dengan prioritas 9:

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

Tetapi Anda sebenarnya tidak membutuhkan dua pre_get_postspanggilan balik.

Anda dapat menggabungkannya:

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

tempat kami menambahkan permintaan utama dan case switch kosong .

Contoh # 2

Berikut pendekatan lain, tanpa switchbagian (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']  );
    }
}

Hebat, terima kasih telah mengirim jawaban lengkap dan dengan pujian. +1
Pieter Goosen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.