php - WordPress 按数组中的元值排序

标签 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 按 ASCENDING 字母顺序排序的帖子数组。

我有一个 '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")
    )
  )
));

最佳答案

I have an array of possible values for 'meta_key' => 'state', i.e. 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,这意味着不支持数组。

关于php - WordPress 按数组中的元值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184677/

相关文章:

javascript - 在 Javascript 中随机播放嵌套数组

php - Google Analytics v3 绕过身份验证

php - 如何将 PHP 数组编码为 JSON 数组,而不是对象?

php - 如果用户已登录,登录页面无法重定向到另一个页面

php - 在数据库中存储 MySQL 查询 (MySQL)

php - Docker-PHP不使用分配的资源

iphone - 在 iOS 中显示来自 JSON 的 wordpress 帖子

php - 严格的标准:仅应在第116行的wordpress/wp-includes/class-oembed.php中通过引用传递变量

javascript - MVC Webgrid,javascript 在排序和分页后停止工作

使用 apply 函数对排序后的数据集进行排名