Сообщения WP_Query получают список терминов вне цикла? - PullRequest
0 голосов
/ 13 июня 2019

Возможно, я говорю об этом неправильно, но у меня проблема с получением информации вне цикла 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 отображается, хотя его нет "posts "в этом термине.

Цикл while - это только автомобили определенной модели, отсортированные по местоположению.

Я не совсем уверен, как отфильтровать пустые места.

Я делаю:

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

Внутри цикла и отфильтровывает их из локаций, но все равно оставляет заголовок локации, потому что он находится вне цикла while.Если бы я смог сделать это раньше в коде, это могло бы сработать, но я не смогу получить список активных терминов вне цикла while.

Я сейчас немного потерялся.Есть идеи или предложения?Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Хорошо, я обновил ваш ответ, пожалуйста, попробуйте его ниже кода. Я просто получаю количество сообщений по условиям и применяемому условию, если у терминов есть количество сообщений, поэтому покажите название заголовка терминов или если нет количества сообщений, чтобы заголовок отображался пустым.

<?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; ?>
0 голосов
/ 14 июня 2019

вы можете проверить, используя условие, если у него есть термин, поэтому покажите заголовок, либо он будет пустым, попробуйте его ниже условия и упомяните в комментарии, если он работает, или нет.

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

функция проверки наличия в сообщении терминов.

if( has_term( $location, $tax_name ) ) {
// do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...