আমি কাস্টম কলামে কাস্টম পোস্ট প্রকারের জন্য ডিফল্ট অ্যাডমিন সাজানোর অর্ডারটি কীভাবে সেট করব?


16

সমাধান এখানে উপলব্ধ

আমি ক্লায়েন্টেরিয়া নামে একটি কাস্টম পোস্ট প্রকার সেট আপ করেছি এবং প্রশাসকের ক্ষেত্রে এটির জন্য বেশ কয়েকটি কাস্টম কলাম স্থাপন করেছি - কাস্টম কলামগুলি সমস্ত কাস্টম মেটা ক্ষেত্র, আপনি আমার কোড থেকে দেখতে পাচ্ছেন। আমি ডিফল্টরূপে 'অ্যাপয়েন্টমেন্ট তারিখ' অবতরণ করে বাছাই করতে চাই।

সমস্ত কলামগুলি সূক্ষ্মভাবে কাজ করে এবং প্রত্যাশা অনুযায়ী ম্যানুয়ালি বাছাই করা যায় তবে আমি ডিফল্ট সাজানোর ক্রমটি পেতে পারি না।

আমি যদি ডিফল্ট সাজানোর ক্ষেত্রটিকে একটি মান ক্ষেত্রে (উদাহরণস্বরূপ 'শিরোনাম') এ পরিবর্তন করি তবে এটি প্রত্যাশার মতো কাজ করে; কেবলমাত্র যখন আমি কাস্টম কলামটি ডিফল্ট সাজানোর ক্রম হিসাবে সেট করার চেষ্টা করছি তখন এটি কাজ করবে না বলে মনে হয়। অর্ডারটি কাজ করে (যেমন আমি কাস্টম কলাম দিয়েও ডিফল্টরূপে এসএসসি এবং ডেস্কের মধ্যে পরিবর্তন করতে পারি), তবে এটি অর্ডারকে বাছাই করছে না তাই কাস্টম পোস্ট প্রকাশের তারিখ অনুসারে বাছাইয়ে ফিরে আসবে।

আমি কী মিস করছি?

আমার কোডটি নিম্নরূপ:

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 - হ্যাঁ - আমি স্ট্যাক এক্সচেঞ্জে এটি পোস্ট করেছি (কারণ আমার সেখানে একটি অনুগ্রহ নির্ধারণের জন্য যথেষ্ট পরিমাণে প্রতিনিধি ছিল ..) - প্রদত্ত দুটি উত্তরই সঠিক, তবে স্বীকৃত উত্তরটি আরও ব্যাখ্যা দেয় এবং কিছু প্রস্তাবিত কোডের উন্নতি দেয়। stackoverflow.com/questions/31434373/…
SinisterBeard

1
আপনার একটি সঠিক সমাধান যুক্ত করা উচিত। আপনি স্ট্যাক ওভারফ্লো বা আপনার সমস্ত উত্তরগুলির সংমিশ্রণে পোস্টটি থেকে সমাধানটি অনুলিপি করতে পারেন এবং তারপরে কেবল লিঙ্কটি মূল লেখকদের কাছে জমা দেওয়ার জন্য পোস্ট করতে পারেন। আমি জানি যে বিবিরগায়ার ক্রেডিট নিয়ে একটি পোস্ট পোস্ট করবেন ;-)
পিটার গুজন

2
সমস্যাটি যেহেতু এটিকে সাহায্য করেছে শুনে খুব ভাল লাগল, ডাব্লুপিএসইতে কেবল এখানে প্রশ্নটি লক্ষ্য করেছেন। @ পিটারগুজন আপনার পরামর্শের জন্য ধন্যবাদ, "মনে মনে বা না মনে" এই মহাকাব্য প্রশ্ন
ic

উত্তর:


10

@ বিবিরগায়ার থেকে স্ট্যাকএক্সচেঞ্জক্রস পোস্টের উপরে সমাধান :

সমস্যাটি হ'ল আপনি 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অংশটি ছাড়াই এখানে আরও একটি পদ্ধতি রয়েছে (পিএইচপি 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
পিটার গুজন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.