使用PRE_GET_POST按值数组对META_KEY进行排序

时间:2016-03-17 作者:RiaanP

Scenario:我有一堆经销商在“经销商”帖子类型下加载。每个经销商都有一个“评级”,这是一个字符串值,如金、铜、银-这表明他们作为经销商的地位。每个经销商也被划分为一个国家。

What I have:我已经使用pre\\u get\\u posts操作按meta\\u值、asc或desc排序。这很好。

function my_pre_get_posts( $query ) {
    // do not modify queries in the admin
    if( is_admin() ) {
        return $query;   
    }

    if( isset($query->query_vars[\'country\']) ) {  
        $query->set(\'orderby\', \'meta_value\');
        $query->set(\'meta_key\', \'partner_status\');   
        $query->set(\'order\', \'ASC\'); 
    }

    return $query;
}

add_action(\'pre_get_posts\', \'my_pre_get_posts\');
相反,我希望能够指定排序顺序,以便黄金经销商首先是白银经销商,然后是青铜经销商,等等。因此,伪代码:

function my_pre_get_posts( $query ) {
    // do not modify queries in the admin
    if( is_admin() ) {
        return $query;   
    }

    if( isset($query->query_vars[\'country\']) ) {  
        $query->set(\'orderby\', [\'Gold\',\'Bronze\',\'Silver\']); // pseudo here
        $query->set(\'meta_key\', \'partner_status\');   
        $query->set(\'order\', \'ASC\'); 
    }

    return $query;
}

add_action(\'pre_get_posts\', \'my_pre_get_posts\');
希望这对某人有意义!:)

1 个回复
最合适的回答,由SO网友:RiaanP 整理而成

经过更多的测试后,很明显,结果实际上并没有进行自然排序。我做了一些改变。很难看。。。但这是可行的。

Okidokes,所以我无法使用Wordpress的排序功能以我想要的方式对其进行排序,所以我确实采用了usort方法,我认为结果非常好。(PHP警告除外apparently a bug.)

这就是我所做的。(我应该提到我正在使用ACF插件。)

存档中。php,就在我循环查询的地方之前:

<?php if (have_posts()) : 
        // here we are going to populate the "menu_order"
        $statusArr = [\'Gold\',\'Silver\',\'Bronze\']; // set up the desired order in which the posts should arrive
        while (have_posts()) : the_post(); // start a loop
            $position = array_search(get_field(\'partner_status\'), $statusArr); // find the index number of the post\'s "partner_status" relevant to everything in the array
            //$post->menu_order = $position; // update the menu order for the post with that index number (thus building a layered reference)
            if ( empty( $post->menu_order ) ) wp_update_post( array(\'ID\'=>$post->ID,\'menu_order\'=>$position) ); // here we physically write a menu order into the post so that on subsequent visits, it will sort correctly
        endwhile;

        function home_orderby( $a, $b ) { // this function does the comparison for the usort
            global $posts;
            $apos = $a->menu_order; // compare menu_orders
            $bpos = $b->menu_order;
            return ( $apos < $bpos ) ? -1 : 1;
        }
        //@usort( $wp_query->posts, "home_orderby" ); // If all you want is to sort by the order, then you could still use this

    rewind_posts(); // rewind posts to use in the main loop that creates the HTML ?>
在函数中。php然后使用pre\\u get\\u posts操作挂钩,如下所示:

function my_pre_get_posts( $query ) {
    // do not modify queries in the admin
    if( is_admin() ) {
        return $query;   
    }

    if( isset($query->query_vars[\'country\']) ) {  
        $query->set(\'orderby\',array( \'menu_order\' => \'ASC\', \'title\' => \'ASC\' ));
    }
}

add_action(\'pre_get_posts\', \'my_pre_get_posts\');
现在,我看到我的自定义帖子类型按照我在$statusArray顶部指定的顺序排序。快乐的日子!

彼得,谢谢你的意见。这让我走上了正确的道路。:)

相关推荐

Orderby定制字段不起作用

此代码是按管理页面中的ACF字段排序的。它实际上按自定义字段过滤,但不按顺序排序。字段中的数据是字符串而不是数字,因此我认为orderby meta\\u值是正确的。我确保这个键不是空的,我尝试了所有这些术语(desc、desc、asc、asc)$query->query_vars[\'order\'] function my_author_filter_results($query){ global $pagenow; if ( $pagenow === \