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