Несколько циклов на одной странице без дублирования контента

11 нояб. 2012 г., 16:13:45
Просмотры: 26.1K
Голосов: 0

Я пытаюсь создать страницу с несколькими циклами, где каждый цикл должен отображать предопределенное количество записей из одной и той же категории (каждый цикл отображает X количество записей из категории CATS). При этом нужно, чтобы второй цикл, третий и последующие отображали записи с того места, где остановился предыдущий цикл, без дублирования контента (например: цикл 1 с записи 1 по 5, цикл 2 с записи 6 по 10, цикл 3 с записи 11 по 15 и т.д.). Вот что я пробовал до сих пор (я также пробовал код из WordPress Codex, но ничего не работает)

Можете помочь?

Вот мой код на данный момент:

<?php   if (have_posts()) : ?>
<?php   $mosaics = new WP_Query('category_name=mosaics&posts_per_page=5'); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   if( $post->ID == $do_not_duplicate ) continue; ?>

<?php   echo get_the_content(); ?>
<?php   endwhile; ?>
<?php   endif; ?>
<?php   wp_reset_query(); ?>

<br />

<?php   if (have_posts()) : ?>
<?php   $mosaics = new WP_Query('category_name=mosaics&posts_per_page=4'); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   if( $post->ID == $do_not_duplicate ) continue; ?>

<?php   echo get_the_content(); ?>
<?php   endwhile; ?>
<?php   endif; ?>
<?php   wp_reset_query(); ?>

<br />

<?php   if (have_posts()) : ?>
<?php   $mosaics = new WP_Query('category_name=mosaics&posts_per_page=3'); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   if( $post->ID == $do_not_duplicate ) continue; ?>

<?php   echo get_the_content(); ?>
<?php   endwhile; ?>
<?php   endif; ?>
<?php   wp_reset_query(); ?>

<br />

<?php   if (have_posts()) : ?>
<?php   $mosaics = new WP_Query('category_name=mosaics&posts_per_page=2'); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   if( $post->ID == $do_not_duplicate ) continue; ?>

<?php   echo get_the_content(); ?>
<?php   endwhile; ?>
<?php   endif; ?>
<?php   wp_reset_query(); ?>
2
Комментарии

'попробовал код из WordPress Codex' - вы имеете в виду: http://codex.wordpress.org/The_Loop#Multiple_Loops_in_Action

Michael Michael
11 нояб. 2012 г. 16:32:09

@Michael: да, я пробовал это и другие варианты, но ничего не работает

Martin Aston Martin Aston
11 нояб. 2012 г. 16:45:19
Все ответы на вопрос 5
0

Важно прочитать эту главу Codex до конца, так как основные рекомендации находятся после заголовка 'Примечание для нескольких записей в первой категории';

повторяющийся, утомительный код:

<?php   $do_not_duplicate = array(); ?>
<?php   $mosaics = new WP_Query('category_name=mosaics&posts_per_page=5'); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   $do_not_duplicate[] = $post->ID; ?>

<?php   echo get_the_content(); ?>
<?php   endwhile; wp_reset_postdata(); ?>

<br />

<?php   $mosaics = new WP_Query( array( 'category_name' => 'mosaics', 'posts_per_page' => 4, 'post__not_in' => $do_not_duplicate ) ); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   $do_not_duplicate[] = $post->ID; ?>
<?php   echo get_the_content(); ?>
<?php   endwhile; wp_reset_postdata(); ?>

<br />

<?php   $mosaics = new WP_Query( array( 'category_name' => 'mosaics', 'posts_per_page' => 3, 'post__not_in' => $do_not_duplicate ) ); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   $do_not_duplicate[] = $post->ID; ?>
<?php   echo get_the_content(); ?>
<?php   endwhile; wp_reset_postdata(); ?>

<br />

<?php   $mosaics = new WP_Query( array( 'category_name' => 'mosaics', 'posts_per_page' => 2, 'post__not_in' => $do_not_duplicate ) ); ?>
<?php   while ($mosaics->have_posts()) : $mosaics->the_post(); ?>
<?php   $do_not_duplicate[] = $post->ID; ?>
<?php   echo get_the_content(); ?>
<?php   endwhile; wp_reset_postdata(); ?>
11 нояб. 2012 г. 17:08:54
1

Хотя ответ Майкла работает, выполнение нескольких запросов для этой цели — это растрата ресурсов базы данных, когда можно получить все результаты в одном запросе и обработать разделение вывода в PHP. Смотрите этот ответ, который я дал на другой, похожий вопрос, чтобы достичь тех же результатов с помощью одного запроса к базе данных.

11 нояб. 2012 г. 19:15:45
Комментарии

Я полностью согласен; однако, надеюсь, мой ответ будет полезен как общий подход к тому, как избежать дублирования записей при использовании множества циклов.

Michael Michael
11 нояб. 2012 г. 20:25:46
1

Либо используйте wp_reset_query() после каждого запроса, чтобы очистить результаты предыдущих запросов, либо создавайте экземпляры WP_Query, где циклы будут выполняться через локальные переменные вместо глобальных.

11 нояб. 2012 г. 16:23:19
Комментарии

Нет, только этого не хватит, чтобы предотвратить дублирование записей, потому что одна запись может принадлежать нескольким рубрикам.

fuxia fuxia
11 нояб. 2012 г. 16:25:04
0

Используйте параметр Offset для последующих циклов, это позволит начать отображение записей после указанного вами номера:

// начинаем с 6-й по 10-ю запись
$mosaics = new WP_Query('category_name=mosaics&posts_per_page=5&offset=5');

// начинаем с 11-й по 15-ю запись
$mosaics = new WP_Query('category_name=mosaics&posts_per_page=5&offset=10');
11 нояб. 2012 г. 17:04:20
0

Магия.

 wp_reset_query();

Это можно использовать, чтобы очистить путь для последующих вызовов WP_Query. Или чтобы избежать дублирования из-за неструктурированного вызова цикла, например:

$data = query_posts($args);
6 окт. 2016 г. 23:58:06