我有两个CPT:列表和事件。在事件中,我有用于开始和结束日期的自定义字段。我需要的是一种过滤掉超过当前日期的任何事件的方法。
我现在拥有的是:
function search_pre_get_posts( $query ) {
if ( is_search() && $query->is_main_query() ) {
$currentdate = current_time(\'Ymd\');
global $wp_query;
$args = array_merge(
$wp_query->query_vars,
array(
\'meta_query\'=> array( array(
\'key\' => \'DTEND\',
\'compare\' => \'>=\',
\'value\' => $currentdate,
)),
)
);
query_posts( $args );
}
}
add_action( \'pre_get_posts\', \'search_pre_get_posts\' );
这会过滤掉过去的事件,但也会删除所有列表。我需要的是一种添加
IF
语句仅对“事件”运行此元查询。
有人知道怎么做吗?每当我把IF
语句,使用get_post_type()
, 喜欢\'events\' == get_post_type()
, 它破坏了整个过滤器。
最合适的回答,由SO网友:Jen 整理而成
您可以添加第二个数组来检查是否未设置“DTEND”值:
$args = array_merge(
$wp_query->query_vars,
array(
\'meta_query\'=> array(
\'relation\' => \'OR\',
array(
\'key\' => \'DTEND\',
\'compare\' => \'>=\',
\'value\' => $currentdate,
),
array(
\'key\' => \'DTEND\',
\'compare\' => \'NOT EXISTS\',
)
),
)
);
这样,任何没有
DTEND
也将允许元值。
SO网友:Aaron
好的,@guiniveretoo通过几处编辑完成了它:
好吧,@guiniveretoo,你成功了!
通过一些调整,这就是我所使用的,并且很有效:
function search_pre_get_posts( $query ) {
global $wp_query;
if ( is_search() && $query->is_main_query() ) {
$currentdate = current_time(\'Ymd\');
$args = array_merge(
$wp_query->query_vars,
array(
\'meta_query\'=> array(
\'relation\' => \'OR\',
array(
\'key\' => \'DTEND\',
\'compare\' => \'>=\',
\'value\' => $currentdate,
),
array(
\'key\' => \'DTEND\',
\'compare\' => \'NOT EXISTS\',
)
),
)
);
query_posts( $args );
}
}
add_action( \'pre_get_posts\', \'search_pre_get_posts\' );\'
现在,我只需要找出如何通过元键“DTSTART”对“events”CPT进行排序,以便首先列出即将出现的事件。。。。
SO网友:Manny Fleurmond
@Aaron,这是您的解决方案的另一个版本,包括排序:
function search_pre_get_posts( $query ) {
if ( $query->is_search() && $query->is_main_query() ) {
$currentdate = current_time(\'Ymd\');
$query->set(
\'meta_query\',
array(
\'relation\' => \'OR\',
array(
\'key\' => \'DTEND\',
\'compare\' => \'>=\',
\'value\' => $currentdate,
),
array(
\'key\' => \'DTEND\',
\'compare\' => \'NOT EXISTS\',
)
)
);
$query->set( \'orderby\', \'meta_value\' );
}
}
add_action( \'pre_get_posts\', \'search_pre_get_posts\' );\'
差异很大:
$query
是通过引用传递的,因此您无需调用
$wp_query
或
query_posts
(无论如何你都不应该打电话)。此外,设置
orderby
通过
meta_value
将按元值对帖子进行排序。