我无法正确重置查询

时间:2017-05-09 作者:semidivine

我有一个名为“分类法教师”的自定义分类法归档页面。php“在这里,我显示教师元(标题和描述),然后循环浏览所有教师的对话(音频文件),其中有自定义的post类型‘audiotalk’。”“教师”是“音频谈话”的非继承分类法。一切都很好。

“audiotalk还拥有一个名为“audiotalk类别”的继承人自定义分类法,因此人们可以在网站的其他地方搜索它们。但在这一页上,我不需要这些类别。

问题是:我在这个模板的底部包含了一个显示“相关书籍”的文件。在include中,它有自己的循环,首先查询分类法以确定要显示什么。我想让它显示与“教师”分类法相关的书籍,但实际上它显示的是与“音频对话类别”相关的书籍。所以我一直在尝试用我能在网上找到的每一种方法重置audiotalk循环,但什么都不起作用。

这是我的代码(它有我的一次尝试):

<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\\u reset\\u postdata(),并尝试将wp\\u reset\\u postdata()和wp\\u reset\\u query()放在ifs和whiles中的不同位置。

以下是模板相关产品的代码。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\\u分类法,它总是显示“audiotalk category”,如果我打印\\r($terms\\u list),它会显示该audio talk的分类法,而不是模板的原始分类法。任何帮助都将不胜感激。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

wp_reset_query 用于在query_posts 调用时,仅当使用query_posts. 因为你不应该使用query_posts 要从数据库中获取帖子,绝不应使用此函数。

但是在主循环之后如何清理呢

您不需要,这是一个完整的主post循环示例:

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        // display content
    }
} else {
    // none found
}
怎么样WP_Queryget_posts?有一个类似且更有用的函数,名为wp_reset_postdata. 此函数在以下函数之后进行清理:

  • WP_Query::the_post
  • setup_postdata
因此WP_Query post循环应如下所示:

$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_postdatawhile 循环,但在if 声明,而不是在它之后。只有在需要清理时才重置postdata

如果我需要覆盖循环

使用pre_get_posts filter要修改主循环,请不要创建新的替换查询。

那怎么办get_posts?

如果从未设置postdata,则无需重置它。

结束

相关推荐

Tricky Custom post loop

我正在构建一个以“theretailer”为基础的网站,但我不知道在哪里放置代码来让循环为自定义帖子类型“News”工作?主题使用的循环是 //$wp_query->query(\'posts_per_page=1\'.\'&paged=\'.$paged); $wp_query->query(\'posts_per_page=\'.get_option(\'posts_per_page\').\'&