在WordPress中,如何将自定义帖子类型的默认管理排序顺序设置为自定义列()

我已经设置了一个名为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'); } }

#1问题是你运行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这是另一种方法, 没有开关部分(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']); } }

#2【在WordPress中,如何将自定义帖子类型的默认管理排序顺序设置为自定义列()】尝试为此更改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'); } } }

    推荐阅读