WordPress文章归档页面分组和分页

WordPress 归档页面是一个网站的历史内容存档,它允许用户浏览网站的过去内容。它的存在有以下几个意义:

  • 为用户提供内容索引和历史参考:用户可以通过归档页面快速浏览网站的历史文章。
  • 提供搜索引擎优化:可以帮助搜索引擎更好地理解网站的内容,从而提高网站在搜索引擎中的排名。
  • 方便用户查找特定时间段的内容:用户可以通过归档页面快速找到特定日期或者月份的文章。
  • 对网站管理员来说,可以帮助管理网站的内容,通过定期归档旧内容,可以保持网站的速度和效率。

归档带分页

在归档页面模板中间内容<?php the_content(); ?>下加入下述代码:

php

代码语言:javascript
复制
<?php
  //设置分页变量
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

//设置查询参数
$args = array(
'post_type' => array('post'),
'posts_per_page' => '80',
'paged' => $paged,
);
query_posts($args);

if (have_posts()) : while (have_posts()) : the_post();
?>
<div class="archive d-flex justify-content-between">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php the_time('Y') ?>年<?php the_time('m') ?>月<?php the_time('d') ?>日
</div>
<? endwhile;endif;?>

<?php
wp_pages(); //分页函数,一般可复制主题目录index.php文件中的,每个主题可能不同,
?>

按年份分组,然后分页

如前文所述,一直想要一个按年份分组,然后再分页,之前折腾时要么如上文一样分页成功了但不显示年份,要么按年份分组成功,分页又混乱了。今天无意在一位博主那里看到了一个方法:

php

代码语言:javascript
复制
<?php
/**

  • Template Name: Archives
    **/

// 获取当前页面的标题和内容
global $post;
post_title = post->post_title;
post_content = apply_filters(&#39;the_content&#39;, post->post_content);

// 获取文章列表的分页和数据信息
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$posts_per_page = 15;
post_data = sola_get_posts_by_year( paged, $posts_per_page );
post_list = post_data[0] ?? false;
max_page = post_data[1] ?? 0;

// 开始显示模板
get_header(); ?>
<div id="content" class="site-content">
<div id="primary" class="s-container">

  &lt;div class=&#34;entry-content&#34;&gt;

    &lt;!-- 输出当前页面的标题和写在编辑器里的内容 --&gt;
    &lt;h1&gt;&lt;?php echo esc_html($post_title); ?&gt;&lt;/h1&gt;

    &lt;?php echo $post_content;?&gt;

    &lt;!-- 输出文章列表 --&gt;
    &lt;?php
    if( is_array($post_list) &amp;&amp; sizeof($post_list) ){

      foreach( $post_list as $year =&gt; $post_items ){

        echo &#39;&lt;h3 class=&#34;article-list__year&#34;&gt;&#39;,esc_html($year),&#39;&lt;/h3&gt;&#39;;
        echo &#39;&lt;div class=&#34;article-list&#34;&gt;&#39;;

        foreach( $post_items as $post_item ) {
          sola_render_post_item( $post_item, &#39;article-list__item&#39; );
        }
        echo &#39;&lt;/div&gt;&#39;;

      }

    }
    ?&gt;
    
    &lt;?php sola_pagination($paged, $max_page); ?&gt;
    
  &lt;/div&gt;
&lt;/div&gt;

</div>

<!-- 自定义样式 -->
<style>
.article-list__year {
border-bottom: 2px solid #000;
}

.article-list {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -ms-flex-wrap: wrap;
        flex-wrap: wrap;
    --spacing: 1em;
    -webkit-box-pack: justify;
        -ms-flex-pack: justify;
            justify-content: space-between;
}

.article-list__item {
    width: calc(50% - var(--spacing));
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex ;
    margin-bottom: calc(var(--spacing ) * 1.5 );
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
        -ms-flex-direction: column;
            flex-direction: column;
}

.article-list__item .post-title {
    -webkit-box-ordinal-group: 3;
        -ms-flex-order: 2;
            order: 2;
    line-height: 1.7;
}

.article-list__item .post-date {
    color: #666;
    font-size: 0.68em;
}

.page-numbers {
    padding-left: 0;
}

.page-numbers li {
    display: inline-block;
    margin: 0 24px 12px 0;
}
@media (max-width: 481.9px){
  .article-list__item{
    width: 100%;
  }
}

</style>

<?php
function sola_pagination( paged = &#39;&#39;, max_page = '' ){
$big = 999999999; // need an unlikely integer
if( ! $paged )
$paged = get_query_var('paged');
if( ! $max_page )
max_page = wp_query->max_num_pages;

echo paginate_links( array(
    &#39;base&#39;       =&gt; str_replace($big, &#39;%#%&#39;, esc_url(get_pagenum_link( $big ))),
    &#39;format&#39;     =&gt; &#39;?paged=%#%&#39;,
    &#39;current&#39;    =&gt; max( 1, $paged ),
    &#39;total&#39;      =&gt; $max_page,
    &#39;mid_size&#39;   =&gt; 10,
    &#39;prev_text&#39;  =&gt; __(&#39;«&#39;),
    &#39;next_text&#39;  =&gt; __(&#39;»&#39;),
    &#39;type&#39;       =&gt; &#39;list&#39;
) );

}

function sola_get_posts( paged = 1, posts_per_page = 20 ){
/** 获取该页面的标题和内容 */
global $post;
post_title = post->post_title;
post_content = apply_filters(&#39;the_content&#39;, post->post_content);

/** 用WP_Query获取posts */
$args = array(
'posts_per_page' => absint($posts_per_page),
'paged' => $paged,
'post_type' => array( 'post' ),
'post_status' => array( 'publish'),
'ignore_sticky_posts ' => false,
'orderby' => 'date',
'order' => 'DESC',
);

return new WP_Query( $args );
}

function sola_get_posts_by_year( paged = 1, posts_per_page = 20 ){

$post_items = array();
post_list = sola_get_posts( paged, $posts_per_page );
max_page = post_list->max_num_pages;

if ( $post_list->have_posts() ){
while ( post_list-&gt;have_posts() ) : post_list->the_post();

  $year = date(&#39;Y&#39;, get_post_time());
  $post_item = array(
    &#39;title&#39;     =&gt; get_the_title(),
    &#39;permalink&#39; =&gt; get_permalink(),
    &#39;year&#39;      =&gt; $year,
    &#39;datetime&#39;  =&gt; get_the_date(),
  );
  
  $post_items[$year][] = $post_item;

endwhile;

}

wp_reset_postdata();

return [post_items, max_page];
}

function sola_render_post_item( post_item , item_class ){
if( $item_class ){
item_class = &#39;class=&#34;&#39;.esc_attr(item_class).'"';
}
?>
<div <?php echo $item_class; ?>>
<!-- 带连接的文章标题 -->
<span class="post-title">
<a href="<?php echo esc_url($post_item['permalink']) ?>"
title="<?php printf( '%s发布于%s', esc_attr(post_item[&#39;title&#39;]), esc_html( post_item['datetime']) ); ?>"
target="_blank">
<?php echo esc_html($post_item['title']); ?>
</a>
</span>
<!-- 显示发布日期 -->
<span class="post-date"><?php echo esc_html( $post_item['datetime']); ?></span>
</div>

<?php
} ?>
<?php get_footer(); ?>

将需要调用的php函数放到结尾,方便查阅模板主体逻辑。分组原理是按照时间由晚到早的顺序查询posts,每页查询数量由变量$posts_per_page决定,遍历查询结果时,提取文章的年份,并创建一个key为年份,value为属于该年的文章组成的数组,最后循环输出这个数组的内容即可。

方法来源: https://www.solagirl.net/wordpress-paged-article-list.html

为了保持和自己的主题一致,分页函数可以根据前面分页方法一样改为自己主题的,大家可以根据自己的需求扩展或精简。

至此,终于又解决了一个自己网站一直实现的一个功能,在此要特别感谢那位博主。Yeah……