按年列出所有帖子并进行分页

时间:2014-09-18 作者:coldpumpkin

现在,我使用以下代码按年份显示所有帖子:

index.php

<?php foreach(posts_by_year() as $year => $posts) : ?>
  <h2><?php echo $year; ?></h2>

  <ul>
    <?php foreach($posts as $post) : setup_postdata($post); ?>
      <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
    <?php endforeach; ?>
  </ul>
<?php endforeach; ?>

functions.php

function posts_by_year() {
  // array to use for results
  $years = array();

  // get posts from WP
  $posts = get_posts(array(
    \'numberposts\' => -1,
    \'orderby\' => \'post_date\',
    \'order\' => \'ASC\',
    \'post_type\' => \'post\',
    \'post_status\' => \'publish\'
  ));

  // loop through posts, populating $years arrays
  foreach($posts as $post) {
    $years[date(\'Y\', strtotime($post->post_date))][] = $post;
  }

  // reverse sort by year
  krsort($years);

  return $years;
}
现在我在管理面板的阅读选项中设置了,我只想每页显示3篇文章。有了这个新代码,按年份显示帖子,它显示所有帖子,分页按钮中有3页。当切换到另一个页面时,它会再次显示相同的内容。

既然我每年都有帖子,我怎么能包括分页呢?我的分页代码是:

<?php if(function_exists(\'wpex_pagination\')) { wpex_pagination(); } ?>
调用函数:

if ( !function_exists( \'wpex_pagination\' ) ) {

  function wpex_pagination() {

    $prev_arrow = is_rtl() ? \'&rarr;\' : \'&larr;\';
    $next_arrow = is_rtl() ? \'&larr;\' : \'&rarr;\';

    global $wp_query;
    $total = $wp_query->max_num_pages;
    $big = 999999999; // need an unlikely integer
    if( $total > 1 )  {
       if( !$current_page = get_query_var(\'paged\') )
         $current_page = 1;
       if( get_option(\'permalink_structure\') ) {
         $format = \'page/%#%/\';
       } else {
         $format = \'&paged=%#%\';
       }
      echo paginate_links(array(
        \'base\'      => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
        \'format\'    => $format,
        \'current\'   => max( 1, get_query_var(\'paged\') ),
        \'total\'     => $total,
        \'mid_size\'    => 3,
        \'type\'      => \'list\',
        \'prev_text\'   => $prev_arrow,
        \'next_text\'   => $next_arrow,
       ) );
    }
  }  
}
我的想法是,我可以设置一些要显示的帖子。不是按年份,而是按职位。因此,如果我有2014年的30个和2013年的20个,并将限制设置为5,它将只显示2014年的前5个。

提前感谢!

EDIT: @彼得

<?php
    $date = 0;
    $newDate = true;
    if (have_posts()) : while (have_posts()) :

        the_post();

    if ($date == 0)
        $date = the_date(\'Y\');
    else if ($date != the_date(\'Y\')) {
        $date = the_date(\'Y\');
        $newDate = true;
    }

    if ($newDate)
        echo $date . \' \';

    $newDate = false; ?>
    <?php get_template_part(\'content\'); ?> 
<?php endwhile; endif; ?>

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

这是我的方法。我理解并接受的是,你需要在每个页面的每个第一篇帖子上显示年份,而且如果年份不同于第一年,你只需要在随后的帖子上显示年份。

我不想使用额外的函数来进行额外的db调用,我还尝试使用通过$wp_query 全球的这就是我想到的

STEP 1

从循环中的当前帖子中获取年表单中的日期。我用过get_the_date() 在这里

STEP 2

您需要从上一篇文章中获取发布日期,除非当前文章不是第一篇文章。为此,您需要访问$wp_query->posts 数组,并获取post_date 上一个中的对象WP_Post 对象为了做到这一点,我使用了$wp_query->current_post 计数器,减去一,并将其用作访问数组的数组键。

STEP 3

隐藏post_date 具有mysql2date 获取上一篇文章发表的年份。

STEP 4

如果当前帖子是第一篇帖子,请显示帖子发布的年份。如果当前职位不是第一个职位,则需要将当前职位的年份与前一个职位的年份进行比较。如果这些值匹配,则不应打印日期,如果这些值不匹配,则打印日期

ALL TOGETHER NOW!!

现在,您可以将此代码放在一起并显示它inside 需要显示它的循环

$current_year = get_the_date(\'Y\');

if( 0 != $wp_query->current_post ) {        
    $f = $wp_query->current_post - 1;       
    $old_date =   mysql2date( \'Y\', $wp_query->posts[$f]->post_date ); 

    if($current_year != $old_date) {
        echo $current_year;
    }
}else{
    echo $current_year;
}

EDIT

如果年份与上一页的最后一篇文章相匹配,则要从后续页面的所有第一篇文章中删除日期,可以执行以下操作

$current_year = get_the_date(\'Y\');

if( 0 != $wp_query->current_post ) {        
    $f = $wp_query->current_post - 1;       
    $old_date = mysql2date( \'Y\', $wp_query->posts[$f]->post_date ); 

    if($current_year != $old_date) {
        echo $current_year;
    }
}elseif( is_paged() && 0 == $wp_query->current_post ) {
    $old_date =   get_the_date( \'Y\', get_next_post()->ID );

    if($current_year != $old_date) {
        echo $current_year;
    }
}else{
    echo $current_year;
}

结束

相关推荐

foreach pagination

我正在寻求有关如何对foreach输出分页的帮助。我查看了其他问题和答案,但找不到适合我的解决方案,也找不到可以自己解决的解决方案。现在,下面的代码将所有内容输出到表行中。当然,我的问题是,它将所有数据转储到一个页面上——因此我需要分页。我想为页面上的每11项分页。这一页是一份杂志档案,每年有11期——因此每一页相当于我们杂志的1年。第一页应该是第1-11期,第二页应该是第12-22期,等等。我们有10年的杂志期。任何帮助都将不胜感激。非常感谢。<table> <tr>&#