Я создал настраиваемый тип сообщений, называемый clientarea, и настроил для него несколько настраиваемых столбцов в области администрирования – пользовательские столбцы – это все настраиваемые мета-поля, как вы можете видеть из моего кода. Я хотел бы сортировать по дате назначения, по умолчанию по убыванию.
Все столбцы работают нормально и могут быть отсортированы вручную, как ожидалось, но я не могу заставить сортировку по умолчанию работать.
Если я изменил поле сортировки по умолчанию на стандартное поле (например, «название»), он работает так, как ожидалось; похоже, что это не работает, когда я пытаюсь установить пользовательский столбец в качестве порядка сортировки по умолчанию. Работа заказа (т. Е. Я могу поменять между 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'); } }
Проблема в том, что вы запустите callback 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
вызова pre_get_posts
.
Вы можете комбинировать их:
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; } }
где мы добавили основную проверку запроса и пустой случай коммутатора.
Вот еще один подход, без части 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'] ); } }
Попробуйте изменить действие и функцию clientarea_default_order для этого:
add_action('pre_get_posts', 'clientarea_default_order', 99); function clientarea_default_order($query) { if ($query->get('post_type') == 'clientarea') { if ($query->get('orderby') == '') { $query->set('orderby', 'extranet_sort_date'); $query->set('meta_key', 'extranet_appointment_date'); } if ($query->get('order') == '') { $query->set('order', 'DESC'); } } }