Wie lege ich die standardmäßige Administrator-Sortierreihenfolge für einen benutzerdefinierten Beitragstyp auf eine benutzerdefinierte Spalte fest?


13

LÖSUNG HIER VERFÜGBAR

Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen clientarea eingerichtet und dafür im Administratorbereich mehrere benutzerdefinierte Spalten eingerichtet. Die benutzerdefinierten Spalten sind alle benutzerdefinierten Metafelder, wie Sie in meinem Code sehen können. Ich möchte standardmäßig nach "Termindatum" absteigend sortieren.

Alle Spalten funktionieren einwandfrei und können wie erwartet manuell sortiert werden, aber die Standardsortierreihenfolge funktioniert nicht.

Wenn ich das Standardsortierfeld in ein Standardfeld (z. B. 'title') ändere, funktioniert es wie erwartet. Es scheint nur nicht zu funktionieren, wenn ich versuche, eine benutzerdefinierte Spalte als Standardsortierreihenfolge festzulegen. Die Reihenfolge funktioniert (dh ich kann auch mit einer benutzerdefinierten Spalte standardmäßig zwischen auf und ab wechseln), aber sie nimmt die Reihenfolge nicht auf, und kehrt zurück zur Sortierung nach dem Datum, an dem der benutzerdefinierte Beitrag veröffentlicht wurde.

Was vermisse ich?

Mein Code lautet wie folgt:

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

Folgendes - Ich habe dies in der Vergangenheit für einen Kunden mit gemischten Ergebnissen versucht. Ich bin gespannt auf eine gute Lösung für dieses Problem.
Jdm2112

Konnten Sie Ihre Sortierung für benutzerdefinierte Spalten lösen?
jdm2112

@ jdm2112 - yep - Ich habe dies auf Stack Exchange gepostet (weil ich genug Repräsentanten hatte, um dort ein Kopfgeld zu setzen) - beide Antworten sind korrekt, aber die akzeptierte gibt mehr Erklärungen und einige vorgeschlagene Code-Verbesserungen. stackoverflow.com/questions/31434373/…
SinisterBeard

1
Sie sollten eine geeignete Lösung hinzufügen. Sie können die Lösung von Ihrem Beitrag auf Stack Overflow oder einer Kombination aller Antworten kopieren und dann den Link als Form des Kredits an die ursprünglichen Autoren senden. Ich weiß, @birgire würde eine Umbuchung mit Gutschrift stören ;-)
Pieter Goosen

2
Freut mich zu hören, dass es bei dem Problem geholfen hat, habe gerade die Frage hier auf WPSE bemerkt. @PieterGoosen danke für Ihre Vorschläge, "zu kümmern oder nicht zu kümmern", das ist die epische Frage 😃
Birgire

Antworten:


8

Lösung aus einem Quer Beitrag über bei Stack von @birgire :

Das Problem ist, dass Sie das ausführen clientarea_default_order Rückruf zu spät .

Um dies zu beheben, müssen Sie nur die Priorität von der Standardpriorität ändern, die wie folgt lautet 10:

add_action( 'pre_get_posts','clientarea_default_order');

zur Priorität von 9:

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

Sie brauchen aber eigentlich keine zwei pre_get_postsRückrufe.

Sie können sie kombinieren:

Beispiel 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;
    }
}

Hier haben wir eine Hauptabfrageprüfung und ein leeres Schaltergehäuse hinzugefügt .

Beispiel # 2

Hier ist ein anderer Ansatz ohne den switchTeil (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']  );
    }
}

Vielen Dank für Ihre vollständige Antwort und Ihre Anerkennung. +1
Pieter Goosen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.