我有一个学校时间表作为自定义帖子类型。每个帖子都是一个学校班级,其中包含两个文本字段,用于指定课程以24小时时间格式开始的小时和分钟:
_start_hour
_start_minute
我正在尝试按时间顺序输出帖子,例如
// the args
$args = array(
'post_type' => 'my-cpt',
'meta_key' => '???????',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'posts_per_page' => -1,
);
// The Query
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ) : $the_query->the_post();
// ordered output according to time
endwhile;
在'meta_key'中是否有某种方法可以连接两个元键?
我尝试了'meta_key' => '_start_hour' && '_start_minute'
,但这打破了查询。
答案 0 :(得分:2)
不幸的是,没有,wordpress不支持此功能,您必须在从数据库中获取并在循环之前自行对其进行排序。
免责声明 这是非常丑陋的设计,但这是Wordpress所以你必须玩你得到的东西,你可以减少丑陋如果你自己编写SQL查询,取决于我认为的性能,因为Wordpress可以是一个性能如果处理不当,你应该考虑使用SQL查询来改造它。
// Fetch all posts - (1 SQL Query)
$query = new WP_Query(array(
'post_type' => 'my-cpt',
'order' => 'ASC',
'posts_per_page' => -1,
));
foreach ($query->posts as &$post) { // N queries as the number of posts you have - totally inefficient
$post->meta = get_post_meta($post->ID);
}
usort($query->posts, function($a, $b) {
$a_time = strtotime($a->meta['_start_hour'][0] . ':' . $a->meta['_start_minute'][0]);
$b_time = strtotime($b->meta['_start_hour'][0] . ':' . $b->meta['_start_minute'][0]);
if ($a_time > $b_time)
return 1;
else if ($a_time < $b_time)
return -1;
else
return 0;
}); // Sorting by date
... the_loop ...
请注意,这是完全未经测试的,所以如果你这样做它应该只给你一小时的指针,我再说一遍,你应该重构这个以提前加入元键,这样你或许可以用它来对它进行排序SQL而不是PHP ...