【问题标题】:ACF Relationship Field: parent conditional based on nested conditionalACF 关系字段:基于嵌套条件的父条件
【发布时间】:2025-12-05 22:45:01
【问题描述】:

我有一个名为 Classes 的 CPT。通过 ACF 关系字段,我允许我的客户手动选择要在前端显示的课程。每个班级都有一个到期日。

在 foreach 语句中,我设置了一个条件,将当前日期与到期日期进行比较,并且只显示即将到来的课程。我需要的是在所有选定的课程都超过其到期日期后显示一个说明“没有即将上课的课程”。

ACF 支持建议在 foreach 循环中添加增量运算符,然后检查该值是否为空。他们修改了我的代码如下,但它没有完成这项工作。 ACF 支持提供的其他帮助超出了他们提供的范围,因此我在此处发布以获取指导。谢谢!

<?php 
    $all_classes = get_sub_field('class');
    if( $all_classes ):
?>

    <?php
        $i = 0;
        foreach($all_classes as $post):
        setup_postdata($post);
    ?>

        <?php
            $now = time(); // get today's date
            $expiry_date = strtotime(get_field('class-expiry-date')); // get the expiration date
            if ($now < $expiry_date): // compare the dates and show upcoming classes only
            $i++;
        ?>

            class details

        <?php endif; ?>

    <?php
        endforeach;
        wp_reset_postdata();
    ?>

<?php else: ?>

    <?php
        //check if $i is empty
        if(empty($i)):
    ?>

        There are no upcoming classes.

    <?php endif; ?>

<?php endif; ?>

【问题讨论】:

    标签: php conditional-statements advanced-custom-fields


    【解决方案1】:

    我遇到过很多次。我的方法有点不同。使用普通的WP_Query() 并确保 ACF 关系 postobject 字段不会将精选项目保存为 post object,而是保存为 post ID。 (这只是在自定义字段页面上选择的一个选项)。通过这种方式,我可以利用原生 Wordpress 元查询

    我的 args 数组如下所示,允许查询对等于或更新于今天的特定日期字段进行排序。

     $args = array(
        'post_type'       => 'class', /* (your CPT slug: class or classes) */
        'posts_per_page'  => -1,
        'meta_key'        => 'class-expiry-date',
        'orderby'         => 'meta_value',
        'order'           => 'ASC',
        'post__in'        => array( get_sub_field( 'class' ) ),     
        'meta_query'      => array(
          array(
            'key'     => 'class-expiry-date',
            'value'   => date('Ymd', strtotime('now')),
            'type'    => 'date',
            'compare' => '>=',
          )
        )
      );
    
      $wp_query = new WP_Query( $args );
    
      if( $wp_query->have_posts() ) {
        while( $wp_query->have_posts() ) {
          $wp_query->the_post();
          // Upcoming classes !!
          // echo $post->post_title (example)
        }
      } else {
        // There are no upcoming classes
      }
    
      wp_reset_query();
    

    确保在下面输出自定义到期日期字段 格式化 Ymd(也是自定义字段页面上的一个选项)

    【讨论】:

    • 感谢您的建议!不幸的是,我还不能让它工作。我在代码('classes')中使用了我的 CPT slug,将 ACF 关系字段返回格式设置为 ID,并将到期日期字段设置为 Ymd。但是,我没有返回选定的帖子/课程,而是只看到“没有即将到来的课程”注释。我尝试过的一件事是将array(get_field( 'class-expiry-date')), 用于meta_keykey 而不仅仅是'class-expiry-date'。不确定这是否应该是这样,但它也没有帮助。你还有什么想法可以提供吗?再次感谢!