Làm cách nào để đặt thứ tự sắp xếp quản trị viên mặc định cho loại bài đăng tùy chỉnh thành cột tùy chỉnh?


14

GIẢI PHÁP CÓ TẠI ĐÂY

Tôi đã thiết lập một loại bài đăng tùy chỉnh được gọi là clientarea và thiết lập một số cột tùy chỉnh cho nó trong khu vực quản trị - các cột tùy chỉnh là tất cả các trường meta tùy chỉnh, như bạn có thể thấy từ mã của tôi. Tôi muốn sắp xếp theo 'Ngày hẹn' giảm dần theo mặc định.

Tất cả các cột hoạt động tốt và có thể được sắp xếp theo cách thủ công như mong đợi, nhưng tôi không thể có thứ tự sắp xếp mặc định để hoạt động.

Nếu tôi thay đổi trường sắp xếp mặc định thành trường tiêu chuẩn (ví dụ: 'title') thì nó hoạt động như mong đợi; có vẻ như nó không hoạt động khi tôi đang cố gắng đặt một cột tùy chỉnh làm thứ tự sắp xếp mặc định. Thứ tự hoạt động (nghĩa là tôi có thể thay đổi giữa asc và desc theo mặc định ngay cả với một cột tùy chỉnh), nhưng nó không chọn thứ tự nên đang quay trở lại sắp xếp theo ngày bài đăng tùy chỉnh được xuất bản.

Tôi đang thiếu gì?

Mã của tôi là như sau:

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

Theo dõi - Tôi đã thử điều này trong quá khứ cho một khách hàng có kết quả hỗn hợp. Mong muốn nhìn thấy một giải pháp tốt cho việc này.
jdm2112

Bạn có thể giải quyết việc sắp xếp của bạn cho các cột tùy chỉnh không?
jdm2112

@ jdm2112 - vâng - Tôi đã đăng bài này trên Stack Exchange (vì tôi có đủ đại diện để đặt tiền thưởng ở đó ..) - cả hai câu trả lời đã cho đều đúng, nhưng câu trả lời được chấp nhận sẽ đưa ra nhiều lời giải thích và một số cải tiến mã được đề xuất. stackoverflow.com/questions/31434373/
Mạnh

1
Bạn nên thêm một giải pháp thích hợp. Bạn có thể sao chép giải pháp từ bài đăng của mình trên Stack Overflow hoặc kết hợp tất cả các câu trả lời và sau đó chỉ cần đăng liên kết dưới dạng tín dụng cho các tác giả ban đầu. Tôi biết @birgire sẽ quan tâm đến việc đăng lại bằng tín dụng ;-)
Pieter Goosen

2
Rất vui khi biết nó đã giúp giải quyết vấn đề, chỉ cần chú ý câu hỏi ở đây trên WPSE. @PieterGoosen cảm ơn những lời đề nghị của bạn, "để tâm hay không bận tâm" đó là câu hỏi sử thi 😃
birgire

Câu trả lời:


8

Giải pháp từ một bài đăng chéo tại StackExchange từ @birgire :

Vấn đề là bạn chạy clientarea_default_ordergọi lại quá muộn.

Để khắc phục rằng bạn chỉ phải thay đổi mức ưu tiên từ mặc định đó là 10:

add_action( 'pre_get_posts','clientarea_default_order');

ưu tiên của 9:

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

Nhưng bạn không thực sự cần hai pre_get_postscuộc gọi lại.

Bạn có thể kết hợp chúng:

Ví dụ 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;
    }
}

trong đó chúng tôi đã thêm một kiểm tra truy vấn chính và một trường hợp chuyển đổi trống .

Ví dụ # 2

Đây là một cách tiếp cận khác, không có switchphần (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']  );
    }
}

Tuyệt vời, cảm ơn vì đã đăng một câu trả lời đầy đủ và với tín dụng. +1
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.