我已经设置了一个名为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');
}
}
}
推荐阅读
- 在我的WordPress主题文件中不断发现注入垃圾的PHP
- 在首页的每第7个帖子和类别WordPress页面之间插入广告
- 在我的WordPress主题中,如何为博客页面添加分页()
- 在WordPress中包含Fullpage.js(或在一般情况下为JS)
- 迁移wordpress后图像未显示
- Flutter(GridPaper 示例#yyds干货盘点#)
- Go 中实现用户的每日限额(比如一天只能领三次福利)
- String 既然能做性能调优,我直呼内行
- JVM升级篇九(GC篇)