WordPress自定义列默认排序


Wordpress Custom Column Default Ordering

我有一个名为"团队成员"的自定义帖子类型以及一些自定义列 - 一个专门设置为用于对自定义帖子进行排序的列。我已经设置了它,以便当您第一次访问"团队成员"选项卡时,帖子按"团队顺序"列排序(ASC)。这很好用,但是,我遇到了一个小问题,如果我单击"团队订单"列以将排序反向转换为 DESC,Wordpress 似乎无法识别它们在页面最初加载时已经排序。相反,它会再次查询帖子,并再次按 ASC 顺序返回它们。然后,如果再次单击列标题,它将按 DESC 顺序返回帖子。如何摆脱点击两次的需要?页面首次加载时,帖子已按升序排序。为什么Wordpress错过了这一点,并在最终进入DESC之前第二次按升序返回它们?

这是我的代码,如果您想查看更多内容,请告诉我。谢谢

//team_members Post Type: sortable columns
add_filter( 'manage_edit-team_members_sortable_columns', 'team_members_sortable_columns' );
function team_members_sortable_columns( $columns ){
    $columns['team_order'] = 'team_order';
    return $columns;
}
//team_members Post Type: sortable columns orderby
add_action( 'pre_get_posts', 'team_members_orderby_columns', 1 );
function team_members_orderby_columns( $query ){
    if( !is_admin() ){
        return;
    }
    $order = $query->get( 'team_order' );
    if( $query->is_main_query() ){
        $query->set( 'meta_key', 'team_order' );
        $query->set( 'orderby', 'meta_value_num' );
        if( $order == '' ){
            $query->set( 'order', 'ASC' );   
        }
    }
}

试试这个

    //team_members Post Type: sortable columns orderby
    add_action( 'pre_get_posts', 'team_members_orderby_columns', 1 );
   function team_members_orderby_columns( $query ){
        if( !is_admin() ){
            return;
        }
     $order = $query->get( 'team_order' );
     if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
      switch( $orderby ) {
        case 'team_order':
            $query->set( 'meta_key', 'team_order' );
            $query->set( 'orderby', 'meta_value_num' );
            if ( ! in_array( $order, array( 'ASC', 'DESC' ) ) )                
             $query->set( 'order', 'ASC' );   
            }
        break;    
      }
     }
   }

那是很久以前的事了,但也许我的解决方案会对某人有所帮助:

要在页面加载时启用列排序,需要检查是否设置了$orderby = $query->get( 'orderby' )。如果未设置自定义顺序。类似这个:

 $orderby = $query->get('orderby');
    if ($orderby === 'team_order') {
        $query->set('meta_key','team_order');
        $query->set('orderby','meta_value_num');
        return;
    }
    if ($orderby === '') {
        $query->set('meta_key','team_order');
        $query->set('orderby','meta_value_num');
    
        if ($query->get('order') === '') {
            $query->set( 'order', 'DESC' );
        }
        return;
    }

或者在 @sastra-nababans 答案中的切换条件中添加另一个案例:

case '': // If orderby is empty
    $query->set('meta_key', 'team_order' );
    $query->set('orderby', 'meta_value_num' );
    if ($query->get('order') === '')                
        $query->set('order', 'DESC');   
    }
    break;