WP_Query帖子是否在循环之外获取术语列表?

时间:2019-06-13 17:50:41

标签: php wordpress

也许我的解决方法不正确,但是在while循环之外获取信息时遇到了问题:

<?php
    $title  = get_field('car_list_title');
    $field  = get_field('tax_field_selector');

    $query = new WP_Query( array( 
        'post_type'         => 'cars',
        'taxonomy'          =>'make',
        'term'              => $field->name,
        'posts_per_page'    => -1,
        'orderby'           =>'title',
        'order'             =>'ASC'
    ) );
    
    $taxonomy = get_terms( array(
        'taxonomy' => 'location',
        'hide_empty' => true
    ) );

    if ( $field ||  $query->have_posts() ) : 
?>
<div class="c-cars">
    <h2 class="c-cars_title u-t--underline--lightblue">
        <?= $title; ?>
    </h2>
    <?php foreach( $taxonomy as $tax ) : 
        $tax_name = $tax->name;
    ?>
        <div class="c-cars_row">
            <h4 class="c-cars_location-title">
                <?= $tax_name; ?>
            </h4>
            <div class="c-cars_cars">
                <?php while ( $query->have_posts() ) : $query->the_post(); 
                    $title          = get_the_title();
                    $link           = get_permalink();
                    $image          = get_field('car-picture');
                    $image_alt      = get_field('car_alt');
                    $image_title    = get_field('car_title');
                    $post_id        = get_the_ID();
                    $terms          = get_the_terms( $post_id, 'location', array( 'order' => 'DESC', 'hide_empty' => true));
                    $location       = $terms[0]->name;
                ?>   
                    <?php if( $location === $tax_name ) : ?>
                        <div class="c-cars_car">
                            <a href="<?= $link; ?>">
                                <img class="c-cars_car-image" src="<?= $image; ?>" alt="<?= $image_alt; ?>" title="<?= $image_title; ?>">
                            </a>
                            <h4 class="text-center">
                                <a href="<?= $link; ?>">
                                    <?= $title; ?>
                                </a>
                            </h4>
                        </div>
                    <?php endif; ?>
                <?php endwhile; wp_reset_postdata(); ?>
            </div>
        </div>
    <?php endforeach; ?>
</div>
<?php endif; ?>

所以这里发生的是我得到位置列表以及这些位置中的所有汽车:

位置1:

  • 汽车
  • 汽车
  • 汽车

位置2:

  • 汽车
  • 汽车
  • 汽车

位置3:

位置4:

  • 汽车
  • 汽车
  • 汽车

这里的问题是,例如,即使该术语中没有“职位”,也会显示位置3。

while循环仅是特定型号的汽车,按其所在位置分类。

我不太确定如何过滤出空白位置。

我这样做:

<?php if( $location === $tax_name ) : ?>

在循环内部,将其过滤出位置,但仍保留位置标题,因为它在while循环之外。如果我能够在代码中更早地做到这一点,那么它可能会起作用,但是我无法在while循环之外获取活动术语的列表。

我现在有点迷路了。有什么想法或建议吗?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以检查使用条件是否有术语,因此请显示标题为空白,然后在条件下进行尝试,并在注释中提及是否有效。

  

has_terms   https://developer.wordpress.org/reference/functions/has_term/

功能检查帖子中是否有条款。

if( has_term( $location, $tax_name ) ) {
// do something
}

答案 1 :(得分:0)

好的,我已经更新了您的答案,请在代码下方尝试。如果条款有帖子数,请显示条款和适用条件,以便显示条款标题名称或没有条款的帖子数,因此标题将显示为空白。

<?php
    $title  = get_field('car_list_title');
    $field  = get_field('tax_field_selector');

    $query = new WP_Query( array( 
        'post_type'         => 'cars',
        'taxonomy'          =>'make',
        'term'              => $field->name,
        'posts_per_page'    => -1,
        'orderby'           =>'title',
        'order'             =>'ASC'
    ) );
    
    $taxonomy = get_terms( array(
        'taxonomy' => 'location',
        'hide_empty' => true
    ) );

    if ( $field ||  $query->have_posts() ) : 
?>
<div class="c-cars">
    <h2 class="c-cars_title u-t--underline--lightblue">
        <?= $title; ?>
    </h2>
    <?php foreach( $taxonomy as $tax ) : 
        $tax_name = $tax->name;
        $tax_post_count = $tax->count;
    ?>
        <div class="c-cars_row">
           if ( $tax_post_count > 0  ) : ?>
            <h4 class="c-cars_location-title">
                <?= $tax_name; ?>
            </h4> <?php
           else : ?>
           <h4 class="c-cars_location-title">
                <?= $tax_name = ''; ?>
            </h4> <?php
           endif; ?>
            <div class="c-cars_cars">
                <?php while ( $query->have_posts() ) : $query->the_post(); 
                    $title          = get_the_title();
                    $link           = get_permalink();
                    $image          = get_field('car-picture');
                    $image_alt      = get_field('car_alt');
                    $image_title    = get_field('car_title');
                    $post_id        = get_the_ID();
                    $terms          = get_the_terms( $post_id, 'location', array( 'order' => 'DESC', 'hide_empty' => true));
                    $location       = $terms[0]->name;
                ?>   
                    <?php if( $location === $tax_name ) : ?>
                        <div class="c-cars_car">
                            <a href="<?= $link; ?>">
                                <img class="c-cars_car-image" src="<?= $image; ?>" alt="<?= $image_alt; ?>" title="<?= $image_title; ?>">
                            </a>
                            <h4 class="text-center">
                                <a href="<?= $link; ?>">
                                    <?= $title; ?>
                                </a>
                            </h4>
                        </div>
                    <?php endif; ?>
                <?php endwhile; wp_reset_postdata(); ?>
            </div>
        </div>
    <?php endforeach; ?>
</div>
<?php endif; ?>