【问题标题】:Wordpress Custom Column Default OrderingWordpress 自定义列默认排序
【发布时间】:2016-03-01 17:06:16
【问题描述】:

我有一个名为“团队成员”的自定义帖子类型以及一些自定义列 - 一个专门设置用于订购自定义帖子。我进行了设置,以便当您第一次访问“团队成员”选项卡时,帖子按“团队顺序”列排序 (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' );   
        }

    }
}

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    试试这个

        //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;    
          }
         }
       }
    

    【讨论】:

    • 谢谢,我试了一下,但似乎没有用。我相信这可能与 $query->get('orderby') 有关,因为这在第一页加载时返回空白。它仅在我单击“团队顺序”列以手动对帖子进行排序后返回一个值,而不是在初始页面加载时返回。知道是什么原因造成的吗?
    【解决方案2】:

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

    要在页面加载时启用列排序,需要检查是否设置了$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的switch条件中添加另外一种情况@答案:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2017-07-30
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      相关资源
      最近更新 更多