带有REWIND_POST的WP_QUERY创建重复标题

时间:2016-07-11 作者:Gregory Schultz

我有一个WP_Query 具有rewind_posts 我用来过滤属于特定类别的帖子。基本上,如果任何帖子属于First, 它位于列表的顶部。

循环可以做到这一点,唯一的问题是它会创建重复的帖子。在First 类别位于顶部,与组中的其他成员一样。

我的问题示例:

标题-第一标题2标题3标题-第一标题4标题5关于如何解决这个问题,有什么想法吗?这是我用于循环的代码:

<?php $args = array(
\'tax_query\' => array(
array(
    \'taxonomy\' => \'post-status\',
    \'field\' => \'slug\',
    \'terms\' => array (\'post-status-published\')
    )
)
); $query = new WP_Query( $args );?>
<div class="container">
<?php if ( have_posts() ) {
while( $query->have_posts() ) {
    $query->the_post(); ?>

    <?php if (in_category(\'First\') ) { ?>
        <?php the_title();?><br />
    <?php }

}  // end first while loop 

rewind_posts(); // rewind loop so we can rerun it ?>

<?php while( $query->have_posts() ) { // Start second while loop
    $query->the_post(); ?>

     <?php if (in_category(\'Second\') ) { ?>
        <?php the_title();?><br />
    <?php }

}  // end first while loop 

rewind_posts(); // rewind loop so we can rerun it ?>

<?php while( $query->have_posts() ) { // Start second while loop
    $query->the_post(); ?>

    <?php the_title();?><br />

<?php } // end second while loop

rewind_posts(); // rewind loop so we can rerun it

} // End your if statement ?>
谢谢你的帮助。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你有几个问题

您正在检查主查询是否返回了任何帖子,然后循环浏览自定义查询的帖子

  • rewind_posts() 被错误使用。默认情况下,rewind_posts() 回放主查询的循环。您应该回放自定义查询的帖子。

    上一次循环基本上只是再次循环浏览所有帖子,然后显示所有帖子

    如果一篇文章属于多个术语,你可以有重复的。最好进行检查以避免这些

    您的tax_query 真的没有意义。在循环中,您正在检查默认分类法中的术语category 当您从另一个自定义分类法查询帖子时。无论如何,这是你要考虑的

    让我们看看骨架解决方案

    $args = [
        // Your query parameters
    ];
    $query = new WP_Query( $args );
    
    // Test to see if you have posts from the custom query, not main query
    if ( $query->have_posts() ) :
        // Create an array to avoid duplicates
        $duplicates = [];
    
        // Run the loop for the first time
        while ( $query->have_posts() ) :
            $query->the_post();
    
            if ( in_category( \'First\' ) ) :
                // Display what you need
                the_title();
    
                // Save the post ID to avoid duplicates
                $duplicates[] = get_the_ID();
    
            endif;
        endwhile; // End your first loop
    
        $query->rewind_posts(); // Rewind the custom loop
    
        // Start the second loop
        while ( $query->have_posts() ) :
            $query->the_post();
    
                if ( in_category( \'Second\' ) ) :
                    // Make sure the post is not duplicated
                    if ( in_array( get_the_ID(), $duplicates ) )
                        continue;
    
                // Post is not duplicate, display it
                the_title();
    
                // Save the post ID to $duplicates
                $duplicates[] = get_the_ID();
    
            endif;
        endwhile; // End second loop
    
        $query->rewind_posts(); // Rewind second custom loop          
    
        // Run your loop one more time
        while ( $query->have_posts() ) :
            $query->the_post();
    
                // Check if the post is already displayed, if so, skip it
                if ( in_array( get_the_ID(), $duplicates ) )
                    continue;
    
                // Display the post
                the_title();
    
        endwhile; // Close the last loop
        wp_reset_postdata(); // Reset $post global
    endif;