Использование rewind_posts для отображения нескольких категорий

Моя цель состоит в том, чтобы отобразить 5 различных категорий, которые упорядочены случайным образом. Я хотел бы просто вызвать их в одной wp_query, чтобы уменьшить нагрузку. Моя проблема в том, что цикл, похоже, не показывает условий, а также сообщения перемотки не следуют предыдущему циклу. Вот мой код.

<?php $original = new WP_Query(); $original ->query('cat=12,13,14&showposts=2');?> <?php while ($original ->have_posts()) : $original ->the_post(); ?> <!-- See if the current post is in category 3. --> <?php if ( in_category('12') ) { ?> <!--content--> <?php } ?> <?php endwhile; ?> <?php rewind_posts(); ?> <?php while (have_posts()) : the_post(); ?> <?php if ( in_category('13') ) { ?> <!--content--> <?php } ?> <?php endwhile; ?> <?php rewind_posts(); ?> <?php if ( in_category('14') ) { ?> <?php while (have_posts()) : the_post(); ?> <!--content--> <?php endwhile; ?> <?php rewind_posts(); ?> <?php if ( in_category('15') ) { ?> <?php while (have_posts()) : the_post(); ?> <!--content--> <?php } ?> <?php endwhile; ?> 

Основная проблема заключается в том, что параметр cat принимает целое число (term_id) как значение, а не строку идентификаторов запятой …

Вы должны использовать аргумент category__in в своем случае.

Читайте здесь для получения дополнительной информации.

Другая проблема заключается в использовании аргумента showposts : если установить его на 2, вы получите 2 сообщения в общей сложности, а не 2 сообщения для каждой категории.

Я предлагаю вам:

если functions.php создает такую ​​функцию:

 function get_posts_for_cat_ordered( $cats = array(), $posts_per_cat = 2 ) { if ( empty($cats) ) return false; $args = array('posts_per_page' => 99, 'category__in' => $cats, 'orderby' => 'rand'); $q = new WP_Query( $args ); $posts_ordered = array(); $done = 0; while ( $q->have_posts() ) : $q->the_post(); global $post; $cats = get_the_category(); $cat = array_shift( $cats ); if ( ! isset($posts_ordered[$cat->slug]) ) $posts_ordered[$cat->slug] = array('term' => $cat); if ( ! isset($posts_ordered[$cat->slug]['posts']) ) $posts_ordered[$cat->slug]['posts'] = array(); if ( count($posts_ordered[$cat->slug]['posts']) == $posts_per_cat ) { $done++; if ( $done == count($cats) ) return $posts_ordered; continue; } $posts_ordered[$cat->slug]['posts'][] = $post; endwhile; wp_reset_postdata(); return $posts_ordered; } 

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

После этого используйте только что созданную функцию:

 $cats = array(12, 13, 14); $posts_per_category = 2; $posts_ordered = get_posts_for_cat_ordered( $cats, $posts_per_category ); if ( ! empty($posts_ordered) ) { foreach ( $posts_ordered as $loop_data) { // Example category heading echo '<h2><a href="' . get_term_link($loop_data['term'], 'category') . '">' . $loop_data['term']->name . '</a></h2>'; global $post; foreach ( $loop_data['posts'] as $post) { setup_postdata($post); ?> <!-- Example post content --> <?php the_title(); ?><br /> <?php the_content(); ?><br /> <?php } wp_reset_postdata(); } } 

Обратите внимание, что я также

  • изменил аргумент showposts (устарел) с posts_per_page
  • добавлен wp_reset_postdata после цикла пользовательских запросов.

Возможные проблемы:

Если сообщение имеет более одной категории, этот код может работать не так, как ожидалось. Но небольшое изменение в функции get_posts_for_cat_ordered может решить эту проблему. Однако, если вам не нужна эта функция, оставьте код как есть, потому что он более эффективен.

Другие проблемы могут возникнуть, если в блоге нет должностей для каждой категории, в каждой из 99 должностей. Это для 'posts_per_page' => 99 в запросе, используемом в функции get_posts_for_cat_ordered . Я использовал этот номер, потому что это разумное количество, и если в блоге тысячи сообщений, fucntion не повлияет на производительность.

Обе эти проблемы не остановят работу функции, но показанные сообщения могут быть меньше ожиданий, если будут описаны описанные ситуации.