php 不要返回已通过ACF meta日期子字段的帖子(WordPress)

nmpmafwu  于 2023-05-16  发布在  PHP
关注(0)|答案(1)|浏览(117)

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具有这三个日期)。

如果所有这些日期都是过去的,则不应返回帖子标题。

xuo3flqw

xuo3flqw1#

而不是直接在 meta_query中使用ACF repeater字段(这需要更复杂的SQL查询,例如使用带有子查询的JOIN操作),您可以考虑:

  • 获取所有事件而不通过查询本身中的event_date子字段过滤它们,
  • 然后使用PHP中的循环过滤结果。
<ul class="event-category-list no-margin no-list-style">
<?php
    $current_category = get_queried_object();
    $today = date('Ymd'); // Get today's date in the same format as the ACF subfield

    $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();
        // Loop through the event_date repeater subfield
        $event_dates = get_field('event_date');
        $is_future_event = false;

        foreach ($event_dates as $event_date) {
            if ($event_date >= $today) {
                $is_future_event = true;
                break;
            }
        }

        // Only display the title if the event has at least one date today or in the future
        if ($is_future_event) {
    ?>

        <li>
            <?php echo the_title(); ?>
        </li>

    <?php 
        } 
    endwhile;
    wp_reset_postdata();
?>
</ul>

在主题的functions.php文件(wp-content/themes/my-theme/functions.php)中,您可以添加:

function wpza_replace_event_date_field( $where ) {
    $where = str_replace( "meta_key = 'event_date_$", "meta_key LIKE 'event_date_%", $where );
    return $where;
}
add_filter( 'posts_where', 'wpza_replace_event_date_field' );

wpza_replace_event_date_field()函数挂接到functions.php文件中的posts_where filter using the add_filter() function
当创建并执行新的WP_Query时,WordPress在内部构建SQL查询。在此过程中,它会触发posts_where过滤器,并且将调用与此过滤器挂钩的任何函数。
在本例中,将调用wpza_replace_event_date_field()函数,它将修改SQL WHERE子句以搜索所有与模式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中定义的条件相匹配。

相关问题