【问题标题】:Wordpress orderby meta values in arrayWordpress orderby 数组中的元值
【发布时间】:2019-10-04 16:24:21
【问题描述】:

我正在尝试使用 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")
    )
  )
));

【问题讨论】:

  • 我已经检查了您提供的链接并在我的本地系统上执行了测试,它适用于 post 帖子类型。能否请您提出您针对参考链接修改的代码,以便我可以尝试帮助您。?
  • @MominIqbal 我已经添加了我在示例帖子中使用的代码。我使用get_posts 而不是WP_Query。我认为这不应该是它不起作用的原因。
  • 删除所有字母 - array('State1', 'State2', 'State3')array(1, 2, 3),然后就可以轻松订购了。

标签: php wordpress sorting customization


【解决方案1】:
/*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 );

【讨论】:

  • 不幸的是它没有。
  • 请根据数据库表修改代码
  • 顺便说一句,您的答案是基于数字元值,在我的问题中,这些值是按字母顺序排列的,并且顺序在数组中指定
  • @AkashK。请阅读此referencehttps://codex.wordpress.org/Class_Reference/WP_Query 我们可以根据需要修改wp_query。我们需要检查数据库keyvalueswp_postmeta 表中。我们可以根据key 修改查询,如statevalues 中你想要的results
  • 你也可以试试这个:use meta key like a state 'meta_key' => 'state' and use array like array('State1', 'State2', 'State3', 'State5', 'State6')
【解决方案2】:

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

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

第 1 步

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

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

第 2 步

在进行帖子查询时,将orderby 设置为meta_value_list 并将meta_value_list 添加到查询参数中——如果您使用get_posts(),请确保suppress_filters 设置为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,
) );

PS:我将'' 添加到数组中,以便将元数据所在的帖子 ('')(即数据库中存在,但值为空)放置在结果的底部

经过试验和测试工作,但请注意,上述解决方案仅适用于单个orderby,这意味着不支持数组。

【讨论】:

  • 感谢您关注suppress_filters。我分享的链接也有效,只是我没有将suppress_filters 添加到get_posts 参数中。不过我没有测试你的代码,谢谢你的帮助。
  • 顺便说一句,对于其他参考,当您说解决方案是针对单个 orderby 时,您的意思是单个值,我们不能将此方法与多个 meta_fields(数组)一起使用,对吧?
  • 你可以,但是orderby 不能是一个数组,或者解决方案不能(尽管它可以)与该数组一起工作。 IE。例如,'orderby' => [ 'meta_value_list' => 'ASC', 'date' => 'DESC' ] 不受该解决方案的支持。请尝试解决方案(对于问题中的单个orderby),不过..
  • 我测试了你的代码,它工作正常。但是有一个问题,在 [here] (wordpress.stackexchange.com/questions/329972/…) 中提到。我在functions.php中添加了这个函数,它工作得很好。可能是缓存问题。
  • (我已经删除了我以前的 cmets)wp_parse_list 功能仅在 WP 5.1.0 之后可用。要使其在早期版本上运行,您可以复制函数源 here 并将其放入函数文件 - if ( ! function_exists( 'wp_parse_list' ) ) { function wp_parse_list( $list ) { ... } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2013-12-27
相关资源
最近更新 更多