我有一个我试图分类的课程列表。为了进行排序,我想使用两个高级自定义字段。首先选择字段class_day
包含日期:
1 : Mon
2 : Tue
3 : Wed
4 : Thu
5 : Fri
6 : Sat
7 : Sun
第一个值专门设置为一个数字,以使其易于排序,而第二个标签值将在前端显示。第二个字段是简单的文本字段
class_start
使用数字,例如。
19:00
. 现在我想按
class_day
字段,如果当天发生事件,则根据
class_start
文本字段。问题是如果我只按
class_day
:
$args = array(
\'post_type\' => \'courses\',
\'posts_per_page\' => -1,
\'meta_key\' => \'class_day\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
或由
class_start
:
$args = array(
\'post_type\' => \'courses\',
\'posts_per_page\' => -1,
\'meta_key\' => \'class_start\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
每次帖子都被正确分类。一天一次,另一天一次。但如果我尝试将两者合并
meta_query
这根本不起作用。
$args = array(
\'post_type\' => \'courses\',
\'meta_query\' => array(
\'relation\' => \'OR\',
array(\'key\' => \'class_day\'),
array(\'key\' => \'class_start\')
),
\'meta_key\' => \'meta_value\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
使用
\'relation\' => \'OR\'
帖子只按天排序,但在第二步中,当天的帖子没有按时间正确排序。如果我使用
\'relation\' => \'AND\'
因为我遇到了
else
回路的情况:
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
我的目标是得到一个排序列表,如:
Mon 13:00
Tue 12:30
Tue 16:00
Sat 12:00
但不是:
Mon 13:00
Tue 16:00
Tue 12:30
Sat 12:00
Update:以下自定义查询(未使用wp\\u query函数)实现了该技巧:
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2
WHERE wposts.ID = wpostmeta1.post_id
AND wposts.ID = wpostmeta2.post_id
AND wpostmeta1.meta_key = \'class_day\'
AND wpostmeta2.meta_key = \'class_start\'
AND wposts.post_type = \'courses\'
AND wposts.post_status = \'publish\'
ORDER BY wpostmeta1.meta_value ASC,
wpostmeta2.meta_value ASC
";
Update 2:对第一次更新的代码进行微小更新。我添加了
AND wposts.post_status = \'publish\'
. 防止显示草稿和其他状态。这样,只显示和排序已发布的帖子。