Я не могу правильно сбросить запрос


У меня есть пользовательская страница архива таксономии под названием "таксономия-учитель".php", где я показываю мета-данные учителя (название и описание), а затем просматриваю все выступления учителя (аудиофайлы), которые имеют пользовательский тип записи "аудиоталк". "учитель" - это неэрархическая таксономия для "аудиоталка". Все работает отлично.

"аудиоталк также имеет иерархическую пользовательскую таксономию, называемую "аудиоталк-категории", чтобы люди могли искать их в другом месте на сайте. Но на этой странице Мне не нужны эти категории.

Вот в чем проблема: я включаю файл в нижней части этого шаблона, в котором отображаются "связанные книги". В этом случае у него есть свой собственный цикл, который сначала запрашивает таксономию, чтобы определить, что показывать. Я хочу, чтобы он показывал книги, относящиеся к этой таксономии "учитель", но на самом деле он показывает книги, относящиеся к "категориям аудиоталков". Поэтому я пытался сбросить этот цикл аудиосвязи с помощью каждого метода, который я могу найти в Интернете, и ничего не получается работающий.

Вот мой код (в нем есть одна из моих попыток):

<div class="main-col">
    <div class="teacher-header clearfix">
        <h1>Teacher : <?php single_cat_title(); ?></h1>
        <?php echo tag_description(); ?>
    </div>

    <h3><?php single_cat_title(); ?>'s Bodhi Talks:</h3>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); if( get_field('in_sub') == 'yes' ) : ?>
    <div class="list-item">
        <a href="<?php the_permalink(); ?>" class="list-link"><?php the_title(); ?></a>
        <div class="desc">
    <?php if( get_field('talk_description') ) : ?>
            <p><?php the_field('talk_description'); ?></p>
        </div>
        <div class="meta">
    <?php endif; ?>
            <a href="<?php the_permalink(); ?>" class="listen-link">Listen Now &raquo;</a>
        </div>
    </div>
<?php endif; endwhile; endif; wp_reset_query(); ?>

<?php get_template_part('template-related-products'); ?>

</div>

Я также попробовал wp_reset_postdata() и попытался поместить как wp_reset_postdata(), так и wp_reset_query() в разные места в ifs и whiles.

Вот код для template-related-products.php . Он отлично работает везде, где он включен, но я понимаю, что ошибка может быть и здесь:

<?php // Suggested Books
    if ( is_post_type_archive( 'teacher' ) ) :
        $top_taxonomy = 'teacher';
    else :
        $top_taxonomy = 'audiotalk-category';
    endif;

    $terms_list = wp_get_post_terms( $post->ID, $top_taxonomy, array( 'fields' => 'all' ) );

    foreach ($terms_list as $term) :
        $term_id = $term->term_id;
        $taxonomy = $term->taxonomy;
        $tax_query[] = array (
            'taxonomy' => $taxonomy,
            'field' => 'term_id',
            'terms' => $term_id,
        );
    endforeach;

    $tax_query['relation'] = 'OR';

    if ( is_post_type_archive( 'teacher' ) ) :
        $args = array(
            'post_type' => 'related_product',
            'posts_per_page' => 3,
            'orderby' => 'rand',
            'meta_query' => array(
                array(
                    'key' => 'related_product_type',
                    'compare' => '==',
                    'value' => 'book'
                ),
                array(
                    'key' => 'associated_audio_talk_teacher',
                    'compare' => 'LIKE',
                    'value' => $term_id
                )
            )
        );
    else :
        $args = array (
            'post_type' => 'related_product',
            'posts_per_page' => 3,
            'orderby' => 'rand',
            'order' => 'ASC',
            'meta_query' => array (
                array ( 
                    'key' => 'related_product_type',
                    'compare' => '=',
                    'value' => 'book'
                )
            ),
            'tax_query' => $tax_query,
        );
    endif;

    $rp_query = new WP_Query( $args );
?>
<?php if( $rp_query->have_posts() ): ?>
    <h3>Suggested Reading</h3>
    <ul class="related-products">
<?php while( $rp_query->have_posts() ) : $rp_query->the_post(); ?>
        <li class="book-item">
            <div class="prod-img">
                <a href="<?php echo get_field('related_product_store_link'); ?>"><img src="<?php echo get_field('related_product_image'); ?>" alt="<?php echo get_field('related_product_title'); ?>"></a>
            </div>
            <div class="item-deets">
                <h3><a href="<?php echo get_field('related_product_store_link'); ?>"><?php echo get_field('related_product_title'); ?></a></h3>
                <span class="author"><?php echo get_field('related_book_author'); ?></span>
            </div>
        </li>
<?php endwhile; ?>
    </ul>
<?php endif; wp_reset_query(); ?>

Если я повторяю $top_taxonomy, он всегда говорит "аудиоталк-категория", и если я печатаю_r($terms_list), это показывает таксономию для этого аудиовыхода, а не исходную таксономию для шаблона. Любая помощь будет признательна.

Author: semidivine, 2017-05-09

1 answers

wp_reset_query предназначен для очистки после вызова query_posts, вам не нужно вызывать его после стандартного цикла сообщений, только если вы используете query_posts. Поскольку вы никогда не должны использовать query_posts для извлечения записей из базы данных, вы никогда не должны использовать эту функцию.

Но Как Мне Выполнить Очистку После Основного Цикла?

Вы этого не делаете, это пример полного цикла основного сообщения:

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        // display content
    }
} else {
    // none found
}

Как насчет WP_Query или get_posts?

Существует аналогичная и более полезная функция с именем wp_reset_postdata. Эта функция очищается после выполнения следующих функций:

  • WP_Query::the_post
  • setup_postdata

Таким образом, пример цикла публикации WP_Query должен выглядеть следующим образом:

$q = new WP_Query( [ ... ] );
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        // display content
    }
    wp_reset_postdata();
} else {
    // none found
}

Обратите внимание, что я вызвал wp_reset_postdata после цикла while, но внутри оператора if, а не после него. Сбрасывайте постданные только в том случае, если есть что-то, что нужно очистить

А Если Мне Нужно Переопределить Цикл?

Используйте фильтр pre_get_posts для изменения основного цикла, не создавайте новый запрос на замену.

Как насчет get_posts?

Если вы никогда не устанавливали постданные, то вам никогда не придется их сбрасывать.

 1
Author: Tom J Nowell, 2017-05-10 13:06:55