我有一个自定义的帖子类型event
, 其中有自定义字段start_date
和end_date
. 对于事件存档,我使用添加到pre_get_posts
过滤器,工作正常:
if ( is_post_type_archive( \'event\' ) ) {
$query->set( \'meta_query\', array(
\'relation\' => \'OR\',
array(
\'key\' => \'start_date\',
\'value\' => $today = date( \'Ymd\' ),
\'compare\' => \'>=\'
),
array(
\'key\' => \'end_date\',
\'value\' => $today = date( \'Ymd\' ),
\'compare\' => \'>=\'
),
) );
}
对于搜索查询,我也希望这样做。是否可以将元查询添加到主查询中,并将其仅应用于特定的帖子类型(即。
event
)? 伪代码(我知道这不起作用,但要举例说明):
if ( is_search() ) {
$query->set( \'meta_query\', array(
\'relation\' => \'OR\',
array(
\'key\' => \'post_type\',
\'value\' => \'event\',
\'compare\' => \'!=\',
),
array(
....
}
最合适的回答,由SO网友:Mats Mikkel Rummelhoff 整理而成
如果start_date
自定义字段仅存在于event
post类型,此功能:
$query->set( \'meta_query\', array(
\'relation\' => \'OR\',
array(
\'key\' => \'start_date\',
\'compare\' => \'NOT EXISTS\',
),
array(
\'key\' => \'start_date\',
\'value\' => $today = date( \'Ymd\' ),
\'compare\' => \'>=\',
),
array(
\'key\' => \'end_date\',
\'value\' => $today = date( \'Ymd\' ),
\'compare\' => \'>=\',
),
) );
通过比较
start_date
关键点
NOT EXISTS
, 其他帖子类型不会被过滤掉。显然这不是一个理想的解决方案,所以我仍然很好奇是否有更好的想法。
SO网友:italiansoda
你给出的答案很聪明!!
另一种方法是选择一个只存在于第二个post类型上的新键,并与exists进行比较。
所以你的第二种帖子类型是search
(从您的示例中不完全确定)。您的第一个帖子类型是event
. 如果主查询正在搜索这两种帖子类型,那么此meta\\u查询将包括第二种帖子类型的所有帖子。
$query->set( \'meta_query\', array(
\'relation\' => \'OR\',
array(
\'key\' => \'my_exclusive_meta_key_for_my_other_post_type\',
\'compare\' => \'EXISTS\',
),
...
) );