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

Posted

技术标签:

【中文标题】在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?【英文标题】:In Wordpress, how do I set the default admin sort order for a custom post type to a custom column? 【发布时间】:2015-10-04 17:28:30 【问题描述】:

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

【问题讨论】:

如果你把这个$query->set('order','desc'); 改成$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;
    

我们在其中添加了一个主查询检查和一个 switch case。

示例 #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']  );
    

【讨论】:

没有开关的好主意。 ;-) 我不喜欢 switch 语法,所以“切换”到这种方法有时可以让生活更轻松 ;-) @PieterGoosen 它确实“打开”了这个主题的灯;-)。我的 PHP 肯定不是很好,所以我必须再说一遍,我学到了一些新东西。 :-)【参考方案2】:

尝试为此更改 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');
    
  

【讨论】:

orderby 应该是 meta_valuemeta_value_num 而不是 extranet_sort_date 在这里

以上是关于在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?的主要内容,如果未能解决你的问题,请参考以下文章

在 wordpress 插件电子商务中使用自定义帖子类型

如何将电子邮件移动到自定义帖子类型?

如何将自定义 javascript 添加到 WordPress 管理员?

如何将自定义帖子类型的帖子重定向到一个网址?

将自定义JavaScript从帖子添加到

如何在 wordpress 中显示自定义帖子类别名称列表