使用REWIND_POST显示多个类别

时间:2013-09-16 作者:Jayson Pimentel

我的目标是显示随机排列的5个不同类别。我只想在一个wp\\u查询中调用它们,以减轻负载。我的问题是循环似乎没有显示条件,而且回放帖子也没有遵循之前的循环。这是我的密码。

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

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

你的主要问题是cat param接受整数(term\\u id)作为值,而不是逗号分隔的id字符串。。。

你必须使用category__in 你的论点。

阅读here 了解更多信息。

另一个问题是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_pagewp_reset_postdata 在自定义查询循环之后


Possible issues:

如果一个帖子有多个类别,则此代码可能无法按预期工作。但是在get_posts_for_cat_ordered 函数可以解决此问题。然而,如果您不需要此功能,请保持代码不变,因为它的性能更高。

如果在最后99篇文章中,博客中没有足够的文章来满足每个想要的类别,则可能会出现另一个问题。这是给\'posts_per_page\' => 99 中使用的查询中的参数get_posts_for_cat_ordered 作用我使用这个数字是因为这是一个合理的高数字,如果这个博客有数千篇文章,这个功能不会影响性能。

这两个问题都不会使功能停止工作,但如果出现所描述的情况,显示的帖子可能会比预期的少。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post