맞춤 게시물 유형의 기본 관리자 정렬 순서를 맞춤 열로 설정하려면 어떻게해야하나요?


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-yep-교차 교환에 이것을 게시했습니다 (바운티를 설정하기에 충분한 담당자가 있기 때문에 ..)-주어진 답변 모두 정확하지만 허용되는 답변은 더 많은 설명과 제안 된 코드 개선을 제공합니다. stackoverflow.com/questions/31434373/…
SinisterBeard

1
적절한 솔루션을 추가해야합니다. 당신은 할 수 귀하의 게시물에서 솔루션을 복사 스택 오버플로 , 또는 모든 대답의 조합 후 바로 원래의 저자에 대한 신용의 형태로 링크를 게시 할 수 있습니다. 나는 @birgire가 신용으로 다시 게시해야한다는 것을 알고있다 ;-)
Pieter Goosen

2
문제에 도움이되었다 니 기쁘다. 여기 WPSE에 관한 질문이있다. "마음에 여부를 마음에"당신의 제안에 대한 감사를 @PieterGoosen 서사시 질문 😃입니다
birgire

답변:


10

A로부터 솔루션 크로스 포스트 에서 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.