【问题标题】:WP_Query inside foreach loop returning same value for all optionsforeach 循环中的 WP_Query 为所有选项返回相同的值
【发布时间】:2020-03-20 17:19:42
【问题描述】:

我有以下查询,它根据所选过滤器获取正确的帖子,但它对所有选项显示相同的结果。

foreach 循环基于一种分类法,该分类法显示代表一周中每一天的列:周一至周日。

例如,它正在返回:

星期一:发布一个 周二:发布一个 周三:发布一个 ...

但实际上它应该返回:

星期一:发布一,发布二 周二:发布三 周三:发布四 ...

根据两种分类法过滤 WP_Query 并在 foreach 循环中显示查询的最佳方法是什么。

如果有人能指出我正确的方向,那就太好了。我花了几天时间尝试不同的选择,但没有运气!我可以让它正常工作的唯一方法是完全删除 foreach 循环,因为我需要一周的列,所以我不能这样做。

add_action('wp_ajax_classfilter', 'load_posts_by_ajax_callback');
add_action('wp_ajax_nopriv_classfilter', 'load_posts_by_ajax_callback');

function load_posts_by_ajax_callback() {

  check_ajax_referer('load_more_posts', 'security');

  $calendarDays = get_terms([
    'taxonomy' => 'calendar-day',
    'hide_empty' => false,
  ]);

  foreach($calendarDays as $day) {

$args = array(
  'post_type' => 'calendar',
  'post_status' => 'publish',
  'meta_key' => 'classes_entry_start_time',
  'orderby' => 'meta_value_num',
  'order' => 'ASC',
  'tax_query' => array(
    array(
      'taxonomy' => 'calendar-day',
      'field' => 'id',
      'terms' => $day->term_id
    )
  )
);

if( isset( $_POST['theClass'] ) )
$args['tax_query'] = array(
  array(
    'taxonomy' => 'calendar-class-type',
    'field' => 'id',
    'terms' => $_POST['theClass']
  )
);

$loop = new WP_Query($args);

if($loop->have_posts()) {
  echo '<div class="classes-col">';
  echo '<strong>' . $day->name . '</strong>';
  echo '<ul>';
  while($loop->have_posts()) : $loop->the_post();
    get_part('classes-item', ['classesEntry' => get_field('classes_entry')]);
  endwhile;
  wp_reset_postdata();
  echo '</ul>';
  echo '</div>';
} 
else {
  echo '<div class="classes-col">';
  echo '<strong>' . $day->name . '</strong>';
  echo '</div>';
}

  }

wp_die();
}

【问题讨论】:

  • 没人能帮忙吗? : /

标签: php wordpress foreach


【解决方案1】:

如果有人对如何实现我发布的问题的结果感兴趣,我设法解决了!

作为我们显示的正确结果,但对于 foreach 循环的每次迭代而不是特定日期,我设法通过使用 if (is_object_in_term($class->ID, ' calendar-day', 'monday') && $day->term_id == 6) 。 is_object_in_term 检查 $taxonomy 是否根据对象的术语 term_ids、名称和 slugs 以及每一天的 $day->term_id 检查。如果没有,则不显示任何内容。

我不得不对一周中的每一天和生成结果的代码进行硬编码。我知道这不是最好的 D.R.Y 方法,但目前我对目前的胜利感到满意!

add_action('wp_ajax_classfilter', 'load_posts_by_ajax_callback');
add_action('wp_ajax_nopriv_classfilter', 'load_posts_by_ajax_callback');

function load_posts_by_ajax_callback() {

  check_ajax_referer('load_more_posts', 'security');

  $days = get_terms([
    'taxonomy' => 'calendar-day'
  ]);

  // Loop over days of the week
  foreach ($days as $day ) {

    $classesTable .= '<div class="response classes-col">';

    $classesTable .= '<strong>' . $day->name . '</strong>'; // Day name

    // Query arguments based on day of the week
    $args = array(
      'post_type' => 'calendar',
      'meta_key' => 'classes_entry_start_time',
      'orderby' => 'meta_value_num',
      'order' => 'ASC',
      'numberposts' => '-1',
      'tax_query' => array(
        array(
          'taxonomy' => 'calendar-day',
          'field' => 'id',
          'terms' =>  $day->term_id
          // 'terms' => array('6', '7', '8', '9', '10', '11', '12')
        )
      ),
    );

    if(isset( $_POST['theClass'])) {
      $args['tax_query'] = array(
        array(
          'taxonomy' => 'calendar-class-type',
          'field' => 'id',
          'terms' => $_POST['theClass']
        )
      );
    }

    $query_classes = get_posts( $args );
    $classesArray = array();

    // Loop over query classes posts
    foreach ($query_classes as $key => $class ) {

      // Check if object has term: Monday
      if (is_object_in_term($class->ID, 'calendar-day', 'monday') && $day->term_id == 6):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else: 
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Tuesday
      if (is_object_in_term($class->ID, 'calendar-day', 'tuesday') && $day->term_id == 7):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Wednesday
      if (is_object_in_term($class->ID, 'calendar-day', 'wednesday') && $day->term_id == 8):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Thursday
      if (is_object_in_term($class->ID, 'calendar-day', 'thursday') && $day->term_id == 9):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Friday
      if (is_object_in_term($class->ID, 'calendar-day', 'friday') && $day->term_id == 10):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Saturday
      if (is_object_in_term($class->ID, 'calendar-day', 'saturday') && $day->term_id == 11):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;

      // Check if object has term: Sunday
      if (is_object_in_term($class->ID, 'calendar-day', 'sunday') && $day->term_id == 12):
        // $classesArray[] .= 'YES';
        $start_time = get_field('classes_entry_start_time', $class);
        $end_time = get_field('classes_entry_end_time', $class);
        $classesEntry = get_field('classes_entry', $class);
        // Create class item
        $classesArray[] .= '<li>';
        $classesArray[] .= '<a href="' . $classesEntry['booking_app_link'] . '" target="_blank" class="classes-item">';
        $classesArray[] .= '<span>' . $classesEntry['start_time'] . '</span>';
        $classesArray[] .= '<span>' . $class->post_title . '</span>';
        $classesArray[] .= '<span>' . $classesEntry['duration'] . '</span>';
        $terms = get_the_terms( $class->ID , 'calendar-class-type' );
        if ($terms): foreach ( $terms as $term ):
        $classesArray[] .= '<span>' . $term->name . '</span>';
        endforeach; endif; 
        $classesArray[] .= '</a>';
        $classesArray[] .= '</li>';
      else :
        // Show nothing
        // $classesArray[] .= 'NO';
      endif;


    }

    // Display all queried class results
    $classesTable .= '<ul>' . implode(' ', $classesArray) . '</ul>';

    $classesTable .= '</div>'; // END classes-col
  }

  echo $classesTable;

    wp_die();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多