Приостановка и возобновление результатов WP_Query

У меня есть пользовательский WP_Query что-то вроде этого:

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

Теперь мне нужно разделить результаты этого запроса в 3 наборах, первый набор будет иметь только первый пост, второй набор будет содержать 2-й и 3-й позиции, а затем третий набор будет иметь 4-й и 5-й сообщения.

Причиной этого разделения является то, что записи в каждом наборе будут иметь разную внешнюю и внутреннюю разметку, внешняя разметка выглядит примерно так:

 <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> 

Есть ли способ напечатать 1-й пост в первом div, приостановить запрос, затем возобновить запрос во втором div, приостановить и продолжить возобновление запроса в третьем div?

Solutions Collecting From Web of "Приостановка и возобновление результатов WP_Query"

Я думаю, что лучший способ приблизиться к этому может заключаться в том, чтобы запустить WP_Query только один раз, но затем три раза получить доступ к сохраненным результатам запроса для вывода каждого требуемого набора данных. Это избавит вас от использования нескольких запросов БД, и с помощью трех отдельных циклов вы можете добавить родительский 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 --> 

Вы можете написать 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; 

Если в вашем html есть только разность data-span , вы можете пропустить второе условие и использовать

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

Я думаю, вы не можете сделать это с помощью одного запроса. Вы должны использовать несколько запросов с номером сообщения.

Было бы лучше использовать пользовательский полевой пул.

 $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' ) ) ));