gpt4 book ai didi

php - 在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?

转载 作者:IT王子 更新时间:2023-10-28 23:53:31 25 4
gpt4 key购买 nike

我设置了一个名为 clientarea 的自定义帖子类型,并在管理区域为它设置了几个自定义列 - 自定义列都是自定义元字段,正如您从我的代码中看到的那样。我想默认按“约会日期”降序排序。

所有列都可以正常工作,并且可以按预期手动排序,但我无法让默认排序顺序正常工作。

如果我将默认排序字段更改为标准字段(例如“标题”),它会按预期工作;当我尝试将自定义列设置为默认排序顺序时,它似乎不起作用。订单有效(即,即使使用自定义列,我也可以在默认情况下在 asc 和 desc 之间切换),但它没有获取 orderby,因此恢复为按自定义帖子发布日期排序。

我错过了什么?

我的代码如下:

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

最佳答案

问题是您运行 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

这是另一种方法,没有 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'] );
}
}

关于php - 在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com