按自定义字段值对查询进行分组

时间:2018-03-15 23:29:47

标签: php wordpress plugins advanced-custom-fields

我正在使用FacetWP进行事件位置页面的网站上工作,而且一个关键功能无效。去年,另一个开发人员设置了一个自定义解决方案来列出FacetWP帖子,并根据他们所处的状态对它们进行排序。他们使用了自定义分类法,但从那时起,插件和地图附加组件都有更新,打破了这个解决方案。

FacetWP背后的开发人员一直在帮我修改自定义解决方案,但他现在还不行,我还需要一些帮助。他指示我重做查询以删除自定义分类并使用自定义字段代替状态名称,因为这样可以更好地使用插件。因此,此模板的查询如下所示:

<?php
return array(
  'post_type' => 'location',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'order' => 'ASC',
  'meta_key' => 'state',
  'orderby' => array(
    'meta_value' => 'ASC',
    'title' => 'ASC',
  ),
);

这部分很有效,解决了我早先遇到的问题。我重建了模板的显示代码,如下所示:

<?php
while ($query->have_posts()) {
    $state = get_field('state');
    $show_header = (empty($prev_state) || $state != $prev_state);
    $prev_state = $state;

    $query->the_post();
    $post_id = get_the_ID();
    $title = get_the_title($post_id);
    $distance = facetwp_get_distance($post_id);
    $distance = (false !== $distance) ? round($distance, 1) . ' miles away' : '';
    $coords = get_post_meta($post_id, 'location', true);
    $content = get_the_content();
    ?>
  <?php if ($show_header): ?>
  <h1 class="state-name"><?php echo esc_html($state); ?></h1>
  <?php endif;?>

  <div class="post-item" data-title="<?php echo esc_attr($title); ?>"
      data-latitude="<?php echo $coords['lat']; ?>" data-longitude="<?php echo $coords['lng']; ?>"
      data-distance="<?php echo $distance; ?>">
    <div class="post-item-content">
      <h2><?php echo $title; ?></h2>
      <?php echo $content; ?>
    </div>
  </div>
  <?php
}

    wp_reset_query();
?>

您可以从the staging server where I'm testing this看到它几乎正常工作,但不是100%正确。帖子没有按州正确列出,州名称在列表上方不正确。

这是漫长的一天,我的大脑只是没有看到我需要做些什么来纠正这个问题。我当然可以在正确的方向上轻推一下。

1 个答案:

答案 0 :(得分:0)

我终于解决了它:

<?php

    $state_posts = array();

    while ($query->have_posts()) {
        $query->the_post();
        $state = get_post_meta(get_the_ID(), 'state', true);
        $state_posts[$state][] = $post;
    }

    wp_reset_query();

    foreach ($state_posts as $state_post => $state_title) {
?>
  <h1 class="state-name"><?php echo esc_html($state_post); ?></h1>
<?php
  foreach ($state_title as $listing => $single_listing) {
    setup_postdata($single_listing);
    $post_id = $single_listing->ID;
    $title = get_the_title($post_id);
    $distance = facetwp_get_distance($post_id);
    $distance = (false !== $distance) ? round($distance, 1) . ' miles away' : '';
    $coords = get_post_meta($post_id, 'location', true);
    $content = get_the_content();
?>
  <div class="post-item" data-title="<?php echo esc_attr($title); ?>" data-latitude="<?php echo $coords['lat']; ?>" data-longitude="<?php echo $coords['lng']; ?>" data-distance="<?php echo $distance; ?>">
    <div class="post-item-content">
      <h2><?php echo $title; ?></h2>
      <?php echo $content; ?>
    </div>
  </div>
<?php
  }
  wp_reset_postdata();
}

我在the_title循环中有the_contentwhile等帖子数据,当我在最后foreach循环中需要它时,为了应用这些数据仅限个别职位。