問題描述

我不知道為什麼我的排序功能不排序我的”events” 我的自定義 post-meta 。我有一個名為 wr_event 的 custom-post-type … 我有我的自定義列設置,我的 post-meta 顯示在列中,就像我想要的。 “Event-Date” 手柄已經是一個可排序的鏈接!只有當我點擊 sort-link 的事件日期列表不更新的事情。該功能被觸發,因為我看到頁面重新加載,但它不排序任何。

即使如果我點擊 sort-link,這兩個國家之間的 url 將會切換

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

但是列表總是看起來一樣!

以下是我自定義列的整個代碼:

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

最佳解決方案

這是因為您正在檢查'event_date' == $vars['event_date']不是'event_date' == $vars['orderby]

但不要使用 request 濾波器。代替:

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

… 並且不要手動設置 order,因為您將不會看到在 ASC /DESC 之間切換時的區別。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。