数组中的Wordpress orderby元值

时间:2019-05-17 10:36:24

标签: php wordpress sorting customization

我正在尝试使用get_posts按元值获取帖子的排序列表,并且元值的顺序在数组中给出。

这是我目前拥有的。

$stores = get_posts(array(
  'post_type'   => 'stores',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'fields' => 'ids', // I only need the ID's of posts
  'orderby' => 'meta_value',
  'meta_key' => 'state',
  'order' => 'ASC'
));

这将返回由meta_value按字母升序排列的帖子数组。

我有一个'meta_key' => 'state'的可能值数组,即array('State1', 'State2', 'State3')

我想设置顺序,以便首先显示所有具有元值State1的商店,然后再显示State2之后的State3 我不能使用数字值和字母值顺序,因为州名会是随机的。

我发现了一条帖子here,它正在使用mera_query_orderby。我找不到与此相关的任何文档并尝试了它,但是它不起作用。它返回按ID排序的帖子。

任何帮助将不胜感激。谢谢

编辑:

我在functions.php中添加了meta_query_orderby过滤器

我在示例2中使用的更新代码如下:

$stores = get_posts(array(
  'post_type'   => 'stores',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'fields' => 'ids',
  'order' => 'ASC',
  'meta_query' => array(
    array(
      'key'   => 'state', // Custom field key.
      'value' => array("CState1", "AState2", "BState3")
    )
  ),
  'meta_query_orderby' => array(
    array(
      'key'   => 'state', // (required) Custom field key.
      'value' => array("CState1", "AState2", "BState3")
    )
  )
));

2 个答案:

答案 0 :(得分:1)

  

我有一个'meta_key' => 'state'可能值的数组,即   array('State1', 'State2', 'State3')

如果您要按照上述数组中的元数据按确切的顺序对帖子进行排序,则可以使用自定义WP_Query参数(设置元/排序值)和{{1} } filter自定义posts_orderby子句,在该子句中,您将使用MySQL中的ORDER BY函数。

第1步

将此代码添加到您的插件或主题中(如果是主题,则将代码添加到主题功能文件中):

FIELD()

第2步

进行帖子查询时,请将add_filter( 'posts_orderby', 'posts_orderby_meta_value_list', 10, 2 ); function posts_orderby_meta_value_list( $orderby, $query ) { $key = 'meta_value_list'; if ( $key === $query->get( 'orderby' ) && ( $list = $query->get( $key ) ) ) { global $wpdb; $list = "'" . implode( wp_parse_list( $list ), "', '" ) . "'"; return "FIELD( $wpdb->postmeta.meta_value, $list )"; } return $orderby; } 设置为orderby并在查询参数中添加meta_value_list-如果您使用的是meta_value_list,请确保{{1 }}设置为get_posts()

suppress_filters

PS:我在数组中添加了false,以便发布元数据为($stores = get_posts( array( 'post_type' => 'stores', 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', // get just the ID's of posts 'meta_key' => 'state', 'orderby' => 'meta_value_list', 'meta_value_list' => array( 'State1', 'State2', 'State3', '' ), 'suppress_filters' => false, ) ); )的位置(即数据库中存在 ,但该值为空)将被放置在结果的底部

尝试并测试了工作原理,但请注意,以上解决方案仅适用于单个'',这意味着不支持数组。

答案 1 :(得分:0)

/*Display posts of type 'stores', ordered by 'state', and filtered to show only states.*/
$args = array(
    'post_type'  => 'stores',
    'meta_key'   => 'state',
    'orderby'    => 'meta_value_num',
    'order'      => 'ASC',
    'meta_query' => array(
        array(
            'key'     => 'state',
            'value'   => array( 'State1', 'State2', 'State3'),
            'compare' => 'IN',
        ),
    ),
);
$query = new WP_Query( $args );