现在,我使用以下代码按年份显示所有帖子:
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() ? \'→\' : \'←\';
$next_arrow = is_rtl() ? \'←\' : \'→\';
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; ?>
最合适的回答,由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;
}