我想我可能是在用这根棍子乞求月亮,但是:
我有一个过滤器shows
自定义帖子类型。过滤器使用附加到的标准分类法shows
, 但也允许用户按场馆过滤,这是每个节目的元值,或者按月份过滤,因为每个节目都附有开始日期。
我遇到的问题是,一些节目可能会跨越几个月;因此,2014年11月开始跑步,12月结束。为此,我将元数据存储如下:
startdate => 20141225
enddate => 20141224
理想情况下,如果有人筛选2014年12月的节目,我希望显示12月内开始、12月底之前结束的节目。问题是,因为我也在检查venue
meta\\u值relation => \'AND\'
, 我想不出一种方法来检查伪代码WHERE venue == \'royal-playhouse\' AND ((startdate BETWEEN array(20141201, 20141231)) OR (enddate BETWEEN array(20141201, 20141231)))
.我用的是pre_get_posts
筛选器以修改通过的$query
参数,值得注意的是,还有几个meta\\u值字段也与过滤器一起使用(例如显示类型、可访问性等)。这是我的代码的简化版本(目前运行良好,但只检查startdate
):
function showDates_orderQuery($query) {
if ($query->is_main_query() && !is_admin() && is_post_type_archive(\'showdates\')) {
$queryVenue = $query->query_vars[\'venue\'];
$queryMonth = $query->query_vars[\'month\'];
$metaQuery = array();
// Venue meta
if ($queryVenue) {
$metaQuery[] = array(
\'key\' => \'venue\',
\'value\' => array($queryVenue),
\'compare\' => \'IN\',
);
}
// Month meta
if ($queryMonth) {
$monthEpoch = strtotime($queryMonth);
$formattedQueryMonth = date(\'Ymd\', $monthEpoch);
$formattedEndOfQueryMonth = date(\'Ymt\', $monthEpoch);
$metaQuery[\'relation\'] = \'AND\'; // Set because we want to check for shows from a venue AND by the given month
$metaQuery[] = array(
\'key\' => \'startdate\',
\'value\' => array($formattedQueryMonth, $formattedEndOfQueryMonth),
\'compare\' => \'BETWEEN\',
\'type\' => \'DATE\'
);
}
if ($metaQuery) {
$query->set(\'meta_query\', $metaQuery);
}
$query->set(\'meta_key\', \'startdate\');
$query->set(\'orderby\', \'meta_value\');
$query->set(\'order\', \'ASC\');
}
}
add_action(\'pre_get_posts\', \'showDates_orderQuery\');
如果您有任何关于如何实现这一目标的想法,我将不胜感激。