ฉันจะตั้งค่าลำดับการจัดเรียงเริ่มต้นของผู้ดูแลระบบสำหรับประเภทโพสต์ที่กำหนดเองเป็นคอลัมน์ที่กำหนดเองได้อย่างไร


16

ทางออกที่มีอยู่ที่นี่

ฉันได้ตั้งค่าประเภทโพสต์ที่กำหนดเองที่เรียกว่า clientarea และตั้งค่าคอลัมน์ที่กำหนดเองหลายรายการในพื้นที่ผู้ดูแลระบบ - คอลัมน์ที่กำหนดเองเป็นเขตข้อมูลเมตาแบบกำหนดเองทั้งหมดตามที่คุณเห็นจากรหัสของฉัน ฉันต้องการจัดเรียงตาม 'วันที่นัดหมาย' จากมากไปหาน้อยโดยค่าเริ่มต้น

คอลัมน์ทั้งหมดทำงานได้ดีและสามารถจัดเรียงได้เองตามที่คาดไว้ แต่ฉันไม่สามารถรับลำดับการจัดเรียงเริ่มต้นให้ทำงานได้

หากฉันเปลี่ยนฟิลด์การเรียงลำดับเริ่มต้นเป็นฟิลด์มาตรฐาน (เช่น 'ชื่อ') มันจะทำงานได้ตามที่คาดไว้ ดูเหมือนว่าจะไม่ทำงานเมื่อฉันพยายามตั้งค่าคอลัมน์ที่กำหนดเองเป็นลำดับการเรียงเริ่มต้นเท่านั้น การสั่งซื้อใช้งานได้ (เช่นฉันสามารถเปลี่ยนระหว่าง asc และ desc โดยค่าเริ่มต้นแม้จะมีคอลัมน์ที่กำหนดเอง) แต่ก็ไม่ได้รับการสั่งซื้อดังนั้นจึงย้อนกลับไปที่การเรียงลำดับตามวันที่โพสต์ที่กำหนดเองได้รับการเผยแพร่

ฉันกำลังคิดถึงอะไร

รหัสของฉันเป็นดังนี้:

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

กำลังติดตาม - ฉันเคยลองทำสิ่งนี้ในอดีตสำหรับลูกค้าที่มีผลลัพธ์ที่หลากหลาย กระตือรือร้นที่จะเห็นทางออกที่ดีสำหรับสิ่งนี้
jdm2112

คุณสามารถแก้ไขการเรียงลำดับสำหรับคอลัมน์ที่กำหนดเองได้หรือไม่
jdm2112

@ jdm2112 - อ๋อ - ฉันข้ามโพสต์สิ่งนี้ใน Stack Exchange (เพราะฉันมีตัวแทนมากพอที่จะตั้งค่าความโปรดปรานที่นั่น .. ) - คำตอบทั้งสองที่ให้นั้นถูกต้อง แต่คำตอบที่ยอมรับนั้นให้คำอธิบายเพิ่มเติม stackoverflow.com/questions/31434373/…
SinisterBeard

1
คุณควรเพิ่มโซลูชันที่เหมาะสม คุณสามารถคัดลอกโซลูชันจากโพสต์ของคุณบนStack Overflowหรือการรวมกันของคำตอบทั้งหมดจากนั้นเพียงโพสต์ลิงก์เป็นรูปแบบเครดิตไปยังผู้เขียนดั้งเดิม ฉันรู้ว่า @ Birgire จะรังเกียจ repost ด้วยเครดิต ;-)
Pieter Goosen

2
ดีใจที่ได้ยินว่าช่วยด้วยปัญหาเพียงสังเกตคำถามที่นี่ใน WPSE @PieterGoosen ขอบคุณสำหรับคำแนะนำของคุณ "อย่าลืมหรือไม่สนใจ" นั่นเป็นคำถามที่ยิ่งใหญ่😃
birgire

คำตอบ:


10

โซลูชันจากการโพสต์ข้ามที่ StackExchange จาก@birgire :

ปัญหาคือคุณรันการclientarea_default_orderโทรกลับช้าเกินไป

หากต้องการแก้ไขว่าคุณต้องเปลี่ยนลำดับความสำคัญจากค่าเริ่มต้นที่10:

add_action( 'pre_get_posts','clientarea_default_order');

ถึงลำดับความสำคัญของ9:

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

แต่คุณไม่จำเป็นต้องpre_get_postsโทรกลับสองครั้ง

คุณสามารถรวมพวกเขา:

ตัวอย่างที่ 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;
    }
}

ที่เราเพิ่มการตรวจสอบแบบสอบถามหลักและกรณีสวิตช์ว่าง

ตัวอย่างที่ 2

นี่เป็นอีกวิธีหนึ่งโดยไม่มีswitchส่วน (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']  );
    }
}

ดีมากขอบคุณสำหรับการโพสต์คำตอบที่สมบูรณ์และด้วยเครดิต +1
Pieter Goosen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.