bounty还有3天到期。此问题的答案有资格获得+200声望奖励。User_FTW希望引起更多关注这个问题。
我有一个查询,它返回当前事件的帖子标题列表。
<ul class="event-category-list no-margin no-list-style">
<?php
$current_category = get_queried_object();
$args = array(
'post_type' => 'event',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'event-type',
'field' => 'term_id',
'terms' => $current_category->term_id,
),
),
);
$query = new WP_Query($args);
while ($query->have_posts()) : $query->the_post();
?>
<li>
<?php echo the_title(); ?>
</li>
<?php endwhile;
wp_reset_postdata();
?>
</ul>
它工作正常。
此外,每个帖子都有一个名为event_date
(格式为Ymd)的ACF日期转发器子字段,可以有一个或多个日期。
还需要发生什么
我需要我的查询不返回所有event_date
示例都是过去的帖子。
举例说明
假设事件是Foo Fighters音乐会,并且它超过三个日期:20230726、20230727和20230728(ACF日期转发器子字段event_date
具有这三个日期)。
如果所有这些日期都是过去的,则不应返回帖子标题。
1条答案
按热度按时间xuo3flqw1#
而不是直接在 meta_query中使用ACF repeater字段(这需要更复杂的SQL查询,例如使用带有子查询的
JOIN
操作),您可以考虑:在主题的functions.php文件(
wp-content/themes/my-theme/functions.php
)中,您可以添加:wpza_replace_event_date_field()
函数挂接到functions.php
文件中的posts_where
filter using theadd_filter()
function当创建并执行新的
WP_Query
时,WordPress在内部构建SQL查询。在此过程中,它会触发posts_where
过滤器,并且将调用与此过滤器挂钩的任何函数。在本例中,将调用
wpza_replace_event_date_field()
函数,它将修改SQLWHERE
子句以搜索所有与模式event_date_{index}_event_date
匹配的 meta键。这样做可以确保SQL查询包括所有具有代表ACF中继器
event_date
子字段的键的行。循环(
while ($query->have_posts()) : $query->the_post(); ... endwhile;
)检查事件是否至少有一个今天或将来的日期,如果有,则显示事件的标题。wpza_replace_event_date_field()
函数的间接影响是,WP_Query
将返回具有event_date
子字段的帖子,这些子字段与meta_query
中定义的条件相匹配。