在同一页面上查询两次自定义帖子类型

时间:2016-09-27 作者:Jakob Krogh

我正在尝试创建一个显示Custom Post Type

我需要所有帖子显示两次。一次在产品列表中,一次作为模式。我可以在页面上显示产品列表,但我无法获得modals的第二个post查询。

Products page:

<div>
    <main>
      <?php
        if ( have_posts() ) : ?>

            <header class="page-header">
                <?php
                    the_archive_title( \'<h1 class="page-title">\', \'</h1>\' );
                    the_archive_description( \'<div class="archive-description">\', \'</div>\' );
                ?>
            </header> <!-- .page-header -->

      <?php
            /* Start the Loop */
            $args = array( \'post_type\' => \'kollektion\' );
            $loop = new WP_Query( $args );

            if( $loop ->have_posts() ) :
                while( $loop->have_posts() ) : $loop->the_post();
                    get_template_part( \'template-parts/content-kollektion\', get_post_format() );
                endwhile;
            endif;

            the_posts_navigation();

        else :

            get_template_part( \'template-parts/content-kollektion\', \'none\' );

        endif; 

        wp_reset_postdata();
      ?>
    </main> <!-- #main -->
</div> <!-- #primary -->

<!-- modal Kollektion 02 -->
<div class="modalDialog">
    <section class="kollektion-slider">

      <?php
        rewind_posts(); 

        /* Start the Loop */
        $args = array( \'post_type\' => \'kollektion\' );
        $loop = new WP_Query( $args );

        if( $loop ->have_posts() ) :
            while( $loop->have_posts() ) :
                $loop->the_post();
                get_template_part( \'template-parts/content-kollektion-modal\', get_post_format() );
            endwhile;
        endif;

        wp_reset_postdata();
     ?>
    </section>
</div>
content-kollektion-modal.php:

<div id="post-modal<?php the_ID(); ?>">
<div>
    <a href="#close" title="Close" class="close">X</a>
    <h2>Modal Box</h2>
     <img src="<?php the_field(\'image_collection\'); ?>" />
</div>
</div>

3 个回复
最合适的回答,由SO网友:Naresh Kumar P 整理而成

您可以在同一页面中查询很多时间,并且无论您选择的自定义帖子类型如何,您执行的所有查询都将工作正常。

注意:在第一次完成Wp\\U查询后,您需要reset 这个Wp_Query 代码执行后。

wp_reset_query(); // This will reset all the global variables to "".
wp_reset_query() 将$wp\\U查询和全局post数据恢复到原始主查询。如果必须使用该函数,则应在query\\u posts()之后调用该函数。如以下示例所述,强烈建议在进行查询之前使用pre\\u get\\u posts过滤器来更改查询参数。

不仅通过此方法,您还可以重置Wp_Query 您还可以使用其他方法重置post data 以及$args.

有关重置查询选项的快速参考。

  1. wp_reset_query()- 最好在query\\u posts循环后使用,以重置自定义查询wp_reset_postdata() - 最好在使用WP\\U查询创建自定义或多个循环后使用rewind_posts() - 最适合在同一页上重复使用同一查询
我希望这是一篇关于何时&;的有用综述;如何重置/回放WordPress循环

wp_reset_postdata()

$random_post = new WP_query(); 
$random_post->query(\'cat=3&showposts=1&orderby=rand\'); 
while ($random_post->have_posts()) : $random_post->the_post(); 
<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
    <img src="<?php echo get_post_meta($random_post->ID, \'featured\', true); ?>">
</a>
endwhile;
wp_reset_postdata();
何时使用:最好在使用WP\\U查询创建自定义或多个循环之后使用。

wp_reset_query()

<?php query_posts(\'posts_per_page=3\');
if (have_posts()) : while (have_posts()) : the_post(); ?>

<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>

<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
何时使用:最好在查询后使用\\u posts循环在自定义查询后重置内容。

rewind_posts()

if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<?php endwhile; endif; ?>

<?php rewind_posts(); ?>

<?php while (have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
所以,虽然wp_reset_querywp_reset_postdata 重置整个查询对象,rewind\\u posts只会重置post计数,如中的函数所示wp-includes/query.php 文件:

// rewind the posts and reset post index
function rewind_posts() {
    $this->current_post = -1;
    if ( $this->post_count > 0 ) {
        $this->post = $this->posts[0];
    }
}
何时使用:最适合在同一页面上重复使用同一查询。

SO网友:rudtek

除了重置post数据,我还将重置整个查询:

 wp_reset_query();   // Restore global post data stomped by the_post().
将该行添加到post data reset下方(或将post data reset替换为该行)

我相信你不需要倒带帖子。

SO网友:mlimon

@Michael已经在他的评论中提到了,你读到关于使用rewind_posts() 使用自定义查询??如果你不这样做,请自己阅读并试着找出答案。

反正你做错了rewind_posts(), 因为您使用了自定义查询。所以像这样使用。

<?php
// rewind_posts(); 

// /* Start the Loop */
// $args = array( \'post_type\' => \'kollektion\' );
// $loop = new WP_Query( $args );

$loop->rewind_posts();

if( $loop ->have_posts() ) :
    while( $loop->have_posts() ) :
        $loop->the_post();
        get_template_part( \'template-parts/content-kollektion-modal\', get_post_format() );
    endwhile;
endif;
?>
但这并不是查询CPT乘以同一页面的唯一方法。先看这里wp_reset_postdata() or wp_reset_query() after a custom loop?

您只需在使用新WP\\U查询的辅助查询循环之后,通过使用wp_reset_postdata() .

/* Start the Loop */
$args = array( \'post_type\' => \'kollektion\' );
$loop = new WP_Query( $args );

if( $loop ->have_posts() ) :
    while( $loop->have_posts() ) : $loop->the_post();
        get_template_part( \'template-parts/content-kollektion\', get_post_format() );
    endwhile;
    wp_reset_postdata(); 
endif;
将这个循环替换为你的两个循环,它就会成功。

打开WP_DEBUG 到WordPress网站,然后再做一些事情。它会一直帮助你

相关推荐