मैं कस्टम पोस्ट प्रकार के लिए डिफ़ॉल्ट स्तंभ के लिए डिफ़ॉल्ट व्यवस्थापक सॉर्ट क्रम को कैसे सेट करूं?


16

समाधान उपलब्ध यहाँ

मैंने एक कस्टम पोस्ट टाइप टाइप किया है, जिसे क्लायंटेरिया कहा जाता है, और एडमिन एरिया में इसके लिए कई कस्टम कॉलम सेट किए हैं - कस्टम कॉलम सभी कस्टम मेटा फील्ड हैं, जैसा कि आप मेरे कोड से देख सकते हैं। मैं डिफ़ॉल्ट रूप से 'अपॉइंटमेंट डेट' के आधार पर क्रमबद्ध करना चाहूंगा।

सभी कॉलम ठीक काम करते हैं, और अपेक्षा के अनुसार मैन्युअल रूप से सॉर्ट किए जा सकते हैं, लेकिन मुझे काम करने के लिए डिफ़ॉल्ट सॉर्ट ऑर्डर नहीं मिल सकता है।

यदि मैं डिफ़ॉल्ट सॉर्ट फ़ील्ड को एक मानक फ़ील्ड (जैसे 'शीर्षक') में बदल देता हूं तो यह अपेक्षित रूप से काम करता है; यह केवल तब काम नहीं करता है जब मैं एक कस्टम कॉलम को डिफ़ॉल्ट सॉर्ट क्रम के रूप में सेट करने का प्रयास कर रहा हूं। ऑर्डर काम करता है (यानी मैं कस्टम कॉलम के साथ डिफ़ॉल्ट रूप से 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 को क्रेडिट के साथ एक रिपॉस्ट का मन होगा ;-)
पीटर

2
यह सुनकर खुशी हुई कि इस समस्या से निपटने में, यहाँ WPSE पर सवाल देखा गया था। @PieterGoosen आपके सुझावों के लिए धन्यवाद, "माइंड टू माइंड ऑर नॉट माइंड" जो कि एपिक प्रश्न है
g

जवाबों:


10

@ क्रॉसबायर से StackExchange पर एक क्रॉस पोस्ट से समाधान :

समस्या यह है कि आप 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
पीटर गोयन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.