暂停和恢复WP_QUERY结果

时间:2017-05-18 作者:Faisal Khurshid

我有个习惯WP_Query 类似这样:

$query_args = array(
    \'post_type\'         => \'post\',
    \'cat\'               => 12,
    \'posts_per_page\'    => 5
);

$custom_query = new WP_Query($query_args);
现在,我需要将此查询的结果分为3组,第一组只包含第一篇帖子,第二组包含第二篇和第三篇帖子,然后第三组包含第四篇和第五篇帖子。

进行此拆分的原因是,每个集合中的条目将具有不同的外部和内部标记,外部标记如下所示:

<div class="column" data-span="6">1st Post Here</div>   

<div class="column" data-span="3">2nd + 3rd Posts Here</div>

<div class="column" data-span="3">4th + 5th Posts Here</div>
有没有办法在第一个分区打印第一篇文章,暂停查询,然后在第二个分区继续查询,暂停,然后在第三个分区继续查询?

4 个回复
SO网友:Ben HartLenn

我认为实现这一点的最佳方法可能是只运行一次WP\\U查询,然后访问存储的查询结果三次,以输出每个所需的数据集。这将避免您使用多个DB查询,并且通过使用三个单独的循环,您仍然可以根据需要向每组帖子添加父div。以下是我提出的概念:

<div id="main-content">

    <?php 
        $q = new WP_Query([
            \'post_type\' => \'post\',
            \'posts_per_page\' => 6
        ]);

        $posts = $q->posts;
    ?>

    <div id="set_1" class="column" data-span="6">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==1 ) {
                echo $a_post->post_title . " - Post #$c<br>";
                break;
            }
        }
    ?>
    </div>

    <div id="set_2" class="column" data-span="3">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==2 || $c==3 ) {
                echo $a_post->post_title . " - Post #$c<br>";
            }
        }
    ?>
    </div>

    <div id="set_3" class="column" data-span="3">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==4 || $c==5 ) {
                echo $a_post->post_title . " - Post #$c<br>";
            }
        }
    ?>
    </div>

</div><!-- end #main-content -->

SO网友:Aniruddha Gawade

您可以有条件地编写html,使用if 语句来检查索引并在此基础上打印html。

类似于:

$custom_query = new WP_Query($query_args);
$i = 1;
while($custom_query->have_posts()): the_post();
    if($i == 1){?> 
        <div class="column" data-span="6">1st Post Here</div>   <?php }
    elseif($i == 2 || $i == 3){?> 
        <div class="column" data-span="6">1st Post Here</div>   
    <?php }
    else{?> 
        <div class="column" data-span="6">1st Post Here</div>   
    <?php }
endwhile;
如果唯一的区别是data-span 在html中,可以跳过第二个条件并使用

<div class="column" data-span="<?php echo ($i==1)?6:3;?>">your Post Here</div>

SO网友:Patrick Oliveira

尝试以下操作:

您将使用变量$gottenposts保存打印的帖子ID。然后,当您想要显示除已打印的帖子之外的其他帖子时,您将进行新的查询。

您的第一个查询

<?php $gottenposts = array(); //here you will save the posts ids
$args = array(\'post_type\' => \'post\', \'posts_per_page\' => 6); 
$query = new WP_Query($args); 
if($query->have_posts()) : 
 while($query->have_posts()) : 
   $query->the_post();?>
 //your HTML code here
<?php endwhile; endif; ?>
您的第二个查询

<?php $args = array(\'post_type\' => \'post\', \'posts_per_page\' => -1, \'post__not_in\' => $gottenposts ?>
//ETC...
希望这有帮助!

SO网友:Porosh Ahammed

我想你不能用一个查询来实现这一点。您必须对post number使用多个查询。

使用自定义字段段塞会更好。

$slider = new WP_Query(array(
        \'post_type\' => \'post\',
        \'posts_per_page\' => 5,
        \'cat\'               => 12,
        \'post_status\'   => \'publish\',
         \'meta_query\' => array(
                     array(
                        \'key\' => \'slider_key\',
                        \'value\' => \'slider\',
                        \'compare\' => \'IN\'
                    ) 
                )


));

结束