it-swarm.com.de

Benutzerdefinierte sortierbare Spalten, sortiert nach Meta-Wert?

Ich habe keine Ahnung, warum meine sortierbare Funktion meine "Ereignisse" und ein benutzerdefiniertes Post-Meta nicht sortiert. Ich habe einen benutzerdefinierten Post-Typ namens wr_event… Ich habe meine benutzerdefinierten Spalten eingerichtet und meine Post-Meta wird in den Spalten angezeigt, so wie ich es möchte. Das "Event-Date" -Handle ist sogar schon ein sortierbarer Link! Nur wenn ich auf den Sortierlink für das Ereignisdatum klicke, wird die Liste nicht aktualisiert. Die Funktion wird ausgelöst, wenn ich sehe, dass die Seite neu geladen wird, es wird jedoch nichts sortiert.

Auch wenn die URL zwischen diesen beiden Zuständen wechselt, wenn ich auf den Sortierlink klicke ...

http://url/wp-admin/edit.php?post_type=wr_event&orderby=event_date&order=desc

http://url/wp-admin/edit.php?post_type=wr_event&orderby=event_date&order=asc

Die Liste sieht jedoch immer gleich aus!

Hier ist mein gesamter Code für die benutzerdefinierten Spalten:

add_filter("manage_edit-wr_event_columns", "wr_event_edit_columns");

function wr_event_edit_columns($columns) {
    $columns = array(
        "cb" => "<input type=\"checkbox\" />",
        "title" => "Event",
        "event_date" => "Event Date",
        "type" => "Type",
    );

    return $columns;
}

add_action("manage_posts_custom_column",  "event_custom_columns");

function event_custom_columns($column) {
    global $post;

    switch ($column) {
        case "event_date":
        $custom = get_post_custom();
        echo $custom['_wr_event_date'][0];
        break;
        case "type":
        echo get_the_term_list($post->ID, 'event_type', '', ', ','');
        break;
    }
}

add_filter("manage_edit-wr_event_sortable_columns", "wr_event_sortable_columns");   

function wr_event_sortable_columns( $columns ) {
    $columns['event_date'] = 'event_date';
    return $columns;
}

add_filter("request", "event_column_orderby");

function event_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'event_date' == $vars['event_date'] ) {
        $vars = array_merge( $vars,
            array(
                'meta_key'  => '_wr_event_date',
                'orderby'   => 'meta_value_num',
                'order'     => 'asc'
            )
        );
    }

    return $vars;
}
6
mathiregister

Das liegt daran, dass Sie 'event_date' == $vars['event_date'] und nicht 'event_date' == $vars['orderby] überprüfen.

Verwenden Sie jedoch nicht den Filter request. Stattdessen:

add_action( 'pre_get_posts', 'event_column_orderby' );  
function event_column_orderby( $query ) {  
    if( ! is_admin() )  
        return;  

    $orderby = $query->get( 'orderby');  

    if( 'event_date' == $orderby ) {  
        $query->set('meta_key','_wr_event_date');  
        $query->set('orderby','meta_value_num');  
    }  
} 

... und stellen Sie die order nicht manuell ein, da Sie dann den Unterschied beim Umschalten zwischen ASC/DESC nicht bemerken.

6
Stephen Harris