2个循环,两个循环中仅显示1个循环

时间:2013-04-03 作者:Joe Bobby

我有两个循环,电影预告片和游戏预告片,但游戏预告片显示在电影预告片和游戏预告片下面。每个循环都会显示标记为Movie TrailerGaming Trailer.

我如何在电影区域下获得贴有“电影预告片”的帖子,以及在游戏区域下获得贴有“游戏预告片”的帖子?

Heres the loops:

<div class="section-header clearfix">
    <h2>Movie Trailers</h2>
    <div class="section-filter">
        <ul>
            <li><a class="active" href="http://site.com/videos/">Recent</a></li>
            <li><a href="http://site.com/tag/movie-trailers/">More Movie Trailers</a></li>
        </ul>
    </div>
</div>
<?php if ( have_posts() ) : ?>

<?php  ?>
<?php add_action( \'pre_get_posts\', \'display_movie_trailers\' ); ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php
        get_template_part( \'content-videos\', get_post_format() );
    ?>
<?php endwhile; ?>


<?php else : ?>

    <?php get_template_part( \'no-results\', \'index\' ); ?>

<?php endif; ?>




<div class="section-header latest-gaming-trailers clearfix">
    <h2>Gaming Trailers</h2>
    <div class="section-filter">
        <ul>
            <li><a class="active" href="http://site.com/videos/">Recent</a></li>
            <li><a href="http://site.com/tag/gaming-trailers/">More Gaming Trailers</a></li>
        </ul>
    </div>
</div>
<?php if ( have_posts() ) : ?>

<?php  ?>
<?php add_action( \'pre_get_posts\', \'display_gaming_trailers\' ); ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php
        get_template_part( \'content-videos\', get_post_format() );
    ?>
<?php endwhile; ?>


<?php else : ?>

    <?php get_template_part( \'no-results\', \'index\' ); ?>

<?php endif; ?>

Functions.php

//Display Movie Trailers
    function display_movie_trailers( $query ) {
        if ( $query->is_category() && $query->query_vars[\'category_name\'] == \'videos\') {
            $query->set( \'tag\', \'movie-trailers\' );
        }
    }
    add_action( \'pre_get_posts\', \'display_movie_trailers\' );

    //Display Gaming Trailers
    function display_gaming_trailers( $query ) {
        if ( $query->is_category() && $query->query_vars[\'category_name\'] == \'videos\') {
            $query->set( \'tag\', \'gaming-trailers\' );
        }
    }
    add_action( \'pre_get_posts\', \'display_gaming_trailers\' );

2 个回复
最合适的回答,由SO网友:Jake 整理而成

不能在循环之前添加pre\\u get\\u posts操作。你必须在函数中完成。php。必须在站点实际查询db以设置循环之前进行设置,循环发生在加载模板文件之前。

您所做的是在完全相同的查询中循环两次,因为pre\\u get\\u posts在发生后无法更改查询。在这种情况下,更改它的最简单方法是query\\u posts来设置一个全新的查询。或者使用WP\\u query手动构建查询。

理想的情况可能是对一个循环使用pre\\u get\\u posts,对另一个循环使用新查询,但简单的解决方案如下:

<div class="section-header clearfix">
    <h2>Movie Trailers</h2>
    <div class="section-filter">
        <ul>
            <li><a class="active" href="http://site.com/videos/">Recent</a></li>
            <li><a href="http://site.com/tag/movie-trailers/">More Movie Trailers</a></li>
        </ul>
    </div>
</div>
<?php 
$movie_trailers = new WP_Query( array(
    \'category_name\' => \'videos\',
    \'tag\' => \'movie-trailers\'
) );
if ( $movie_trailers->have_posts() ) : ?>

<?php while ( $movie_trailers->have_posts() ) : $movie_trailers->the_post(); ?>
    <?php
        get_template_part( \'content-videos\', get_post_format() );
    ?>
<?php endwhile; ?>


<?php else : ?>

    <?php get_template_part( \'no-results\', \'index\' ); ?>

<?php endif; ?>




<div class="section-header latest-gaming-trailers clearfix">
    <h2>Gaming Trailers</h2>
    <div class="section-filter">
        <ul>
            <li><a class="active" href="http://site.com/videos/">Recent</a></li>
            <li><a href="http://site.com/tag/gaming-trailers/">More Gaming Trailers</a></li>
        </ul>
    </div>
</div>
<?php 
$gaming_trailers = new WP_Query( array(
    \'category_name\' => \'videos\',
    \'tag\' => \'gaming-trailers\'
) );
if ( $gaming_trailers->have_posts() ) : ?>
<?php if ( have_posts() ) : ?>

<?php while ( $gaming_trailers->have_posts() ) : $gaming_trailers->the_post(); ?>
    <?php
        get_template_part( \'content-videos\', get_post_format() );
    ?>
<?php endwhile; ?>

SO网友:vancoder

我想你误解了pre_get_posts(). 您通常会在函数中使用它。php-你是,某种程度上-但你的模板中也有它,这是不正确的。还有,函数中的版本。php都检查相同的类别(视频)。

也就是说,我根本不会尝试在这个场景中使用pre\\u get\\u posts,因为您在一个页面上有多个循环。相反,您应该使用WP_Query

结束

相关推荐

Modifying a Loop to Show More

此循环显示主题选项中指定的特定类别中超过4个帖子标题的一篇特色帖子。我想做的是显示4个标题中的所有4个帖子,在4个标题之上。这4个标题来自这段代码<a class=\"listtitle\" href=\"<?php the_permalink() ?>\" rel=\"bookmark\" title=\"<?php printf( esc_attr__( \'Permalink to %s\', \'wpnewspaper\' ), the_title_attribute( \