我正在尝试使用 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/