不要离开!这不是关于如何按meta\\u值排序的另一个问题!
我有一个帖子类型叫做events
, 我创建的每一篇帖子都有一个我想象中的元域event_dates_wp
它接受多个日期并将其保存为Ymd
总体安排
我有一个WP_Query
返回日期介于两者之间的帖子meta_query
value
s、 像这样:
$args = [
\'post_type\' => \'event\',
\'order\' => \'ASC\',
\'orderby\' => \'meta_value\',
\'meta_key\' => \'event_dates_wp\',
\'posts_per_page\' => -1,
\'meta_query\' => [
[
\'key\' => \'event_dates_wp\',
\'type\' => \'DATE\',
\'value\' => \'20180801\',
\'compare\' => \'>=\'
],
[
\'key\' => \'event_dates_wp\',
\'type\' => \'DATE\',
\'value\' => \'20180831\',
\'compare\' => \'<=\'
]
]
];
这一切都非常有效,并返回包含
event_dates_wp
2018年8月1日至2018年8月31日期间的价值;但结果是“以后为中心”而不是“以日期为中心”——让我自己解释一下:
以上是人们所期望的,但我想做的是列出日期,从8月1日开始,一直到31日,在每个日期下列出每个匹配的帖子,允许它们重复。
例如:
Event A contains dates [20180801, 20180802, 20180803, 20180804]
Event B contains dates [20180803, 20180804, 20180805]
Event C contains dates [20180804, 20180807]
结果如下所示:
20180801 // 1st Aug 2018
Event A
20180802 // 2nd Aug 2018
Event A
20180803 // 3rd Aug 2018
Event A
Event B
20180804 // 4th Aug 2018
Event A
Event B
Event C
20180805 // 5th Aug 2018
Event B
20180806 // 6th Aug 2018
[NO RESULT]
20180807 // 7th Aug 2018
Event C
20180808 // 8th Aug 2018
[NO RESULT]
20180809 // 9th Aug 2018
[NO RESULT]
...
我能想到的唯一方法是一次查询一个日期,然后继续查询下一个日期;这可不是个好主意。有没有一种方法可以实现这种查询基于日期的事件并将其格式化的看似常见的模式?
这种行为的一个很好的例子是Barbican events page, 我相信这是在使用Drupal。肯定有一种WordPress的方式来做这种事情?
感谢阅读!
最合适的回答,由SO网友:Max Yudin 整理而成
我的想法如下。
1. 获取事件的所有元日期的数组。DISTINCT
在MySQL查询中,表示不要包含重复项。
<?php
/*
* From https://wordpress.stackexchange.com/a/9451/11761
*/
function get_all_possible_meta_dates( $key = \'event_dates_wp\', $type = \'page\', $status = \'publish\' )
{
global $wpdb;
$result = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = \'%s\'
AND p.post_status = \'%s\'
AND p.post_type = \'%s\'
", $key, $status, $type ) );
return $result;
}
2. 通过所有具有
event_dates_wp
元键并获取posts对象。你需要一次。
3. 将每个帖子元与可能的日期进行比较。如果有匹配项,请打印出来。
<?php
function print_posts_by_meta_dates()
{
$args = [
\'post_type\' => \'event\',
\'order\' => \'ASC\',
\'orderby\' => \'meta_value\',
\'meta_key\' => \'event_dates_wp\',
\'posts_per_page\' => -1,
];
// all events having `event_dates_wp`
$loop = new WP_Query( $args );
// all posssible event dates
$distinct_meta_dates = get_all_possible_meta_dates();
foreach( $distinct_meta_dates as $event_meta_date ) {
// date header
echo \'<h1>\' . $event_meta_date . \'</h1>\';
// loop through all events
foreach( $loop->posts as $event ) {
// get current event dates array
$event_all_dates = get_post_meta( $event->ID, \'event_dates_wp\', false );
// compare
if( in_array( $event_meta_date, $event_all_dates ) ) {
// post name
echo \'<p>\' . $event->post_name;
}
}
}
}
4. 使用打印帖子列表
print_posts_by_meta_dates()
模板中的函数。
5. 或者创建要在帖子或页面中使用的短代码。
add_shortcode( \'test_shortcode\', \'print_posts_by_meta_dates\' );
您将得到类似的结果:
20180801单独: