得到按月分组的wordpress帖子

时间:2013-09-27 12:02:08

标签: php wordpress

我想在一个页面上显示所有Wordpress帖子,结果显示如下:

九月(本月)的帖子

1-第一篇文章 2-秒后 3-第三篇文章

下个月的帖子

2-第一篇文章 2-秒后 3-第三篇文章

我已经完成了这个结果,以显示按月订购的所有帖子,但我无法对它们进行分组,并将帖子显示为每个月的一组:

 <?php
$month = date('M');
$arrgs = array('orderby' => $month);
$myposts = get_posts($arrgs);
foreach($myposts as $post) :
setup_postdata($post);
?>
<div class="post-item">
    <div class="post-info">
        <h2 class="post-title">
            <a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
        </h2>
        <p class="post-meta">Posted by <?php the_author(); ?> Published in <strong><?php echo $month; ?></strong></p>
    </div>
</div>
<?php endforeach; wp_reset_postdata(); ?>

2 个答案:

答案 0 :(得分:4)

@zillaofthegods这是我的解决方案:我只使用1个查询来获取我要显示的所有帖子,然后使用PHP来完成繁重的工作。一个好主意是要求将年份和月份作为额外的列,因为我们将来需要这些列。

global $wpdb; // Don't forget

$collection = $wpdb->get_results("
  SELECT YEAR(p.post_date) AS post_year, MONTH(p.post_date) AS post_month, p.*
  FROM {$wpdb->posts} AS p
  WHERE p.post_type = 'post' AND p.post_status = 'publish'
  ORDER BY p.post_date DESC
", OBJECT );

获取结果并使用适当的条件设置一系列循环,以获得具有所需条件的数据。我没试过这个,但我认为它解释了我的观点:

// Loop once to grab the years
foreach ( $collection as $year ):

  // Loop for a second time to grab the months inside a year
  foreach ( $collection as $month ):

    // Continue unless years match
    if ( $month->post_year != $year ) continue;

    // Loop one more time to grab the posts inside the month, inside the year
    foreach ( $collection as $post ):

      // Continue unless months and years match
      if ( $post->post_year != $year || $post->post_month != $month ) continue;

      // You can use the posts data here

    endforeach;

  endforeach;

endforeach;

有什么好处?你打了一次你的数据库,其他一切都由PHP完成,作为模板渲染的一部分,可以很容易地缓存。

答案 1 :(得分:2)

所以,我不确定是否还有其他方法,但我不得不对数据库进行一些直接查询,以实现您正在寻找的内容。这个例子在很多类似的场合对我有用。

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>               
 <ul>
  <?php
   $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE  post_status = 'publish' ORDER BY post_date ASC");

   foreach($years as $year) : ?>

    <h4><li><a href="<?php echo get_year_link($year ); ?> "><?php echo $year; ?></a>
     <ul>
      <?php $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC");

      foreach($months as $month) : ?>

       <h4>
        <li>
         <a href="<?php echo get_month_link($year, $month); ?>"><?php echo date( 'F', mktime(0, 0, 0, $month) );?></a>
         <ul>
          <?php  $theids = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND MONTH(post_date)= '".$month."' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC");

           foreach ($theids as $theid): ?>

            <h4 style= font-style:italic;><li><a href="<?php bloginfo('url'); ?>?p=<?php echo $theid->ID; ?>"><?php echo $theid->post_title; ?></a></li></h4>  

           <?php endforeach; ?>

         </ul>                
        </li></h4>

       <?php endforeach;?>

      </ul>
     </li></h4>

    <?php endforeach; ?>

   </ul>
  </div>
</div>

还有this插件。它工作得很好,但定制水平不在同一水平。它确实有效,对您的情况来说是最快捷,最简单的解决方案。

快乐的编码!