表示中の記事ページより新しい記事へのリンクを複数と、古い記事へのリンクを複数 出力する方法です。プラグインは使いません。60行ほどのコードで実装できます。
複数の前後記事を表示する機能は、FC2 ブログでは標準で用意されているのですが、WordPress では次の 1記事、または 前の 1記事へのリンクを出力する next_post_link() と previous_post_link() しかないため、自前で実装することにしました。こんな感じです。

実は、複数の前後記事を表示するのは SEO 対策の意味合いが大きいです。いわゆる内部リンクの整備です。
一つの記事がクロールされたときに、ナビゲーションとして複数の前後記事へのリンクを表示することで、クローラーの巡回を促すわけです。記事ページがクロールされなければ、ページの評価が上がることもありません。SEO 的には極めて重要な施策だと思います。
- SEO内部対策で行うべき20の事(バズ部)
複数の前後記事を出力する PHP コード
早速ですが PHP コードです。
尚、WordPress の多言語化プラグインである Bogo に対応しています。具体的には、表示中の記事と同じ言語の前後記事のみを出力します。
プラグインをお探しですか?
それならば「wordpress 関連記事 プラグイン」で検索がオススメです。内部リンクの整備ならば前後の記事である必要はありません。
single.php のループ内に追加することを想定しています。
<?php
$max_posts = 10; // 偶数で指定 出力する前後記事の合計件数
$post_date = getdate( get_the_date('U') );
$date_arg = array(
'year' => $post_date['year'],
'month' => $post_date['mon'],
'day' => $post_date['mday'],
);
$newer_posts = get_posts(
array(
'numberposts' => $max_posts,
'order' => 'ASC',
'date_query' => array( array(
'after' => $date_arg,
'inclusive' => false,
) ),
'suppress_filters' => false // Bogo 対応 不要ならば削除
)
);
$older_posts = get_posts(
array(
'numberposts' => $max_posts,
'date_query' => array( array(
'before' => $date_arg,
'inclusive' => false,
) ),
'suppress_filters' => false // Bogo 対応 不要ならば削除
)
);
$all = count( $newer_posts ) + count( $older_posts );
$max_posts = ( $all < $max_posts ) ? $all : $max_posts;
$html_newer = ''; $newer = 0;
$html_older = ''; $older = 0;
while ( ($newer + $older) < $max_posts ) {
if ( $newer_posts[$newer] ) {
$p = $newer_posts[$newer++];
$html_newer = '<li><a href="' . get_permalink( $p->ID ) . '">' . $p->post_title . '</a></li>' . $html_newer;
}
if ( $older_posts[$older] ) {
$p = $older_posts[$older++];
$html_older = $html_older . '<li><a href="' . get_permalink( $p->ID ) . '">' . $p->post_title . '</a></li>';
}
}
?>
<nav>
<?php
if ( $newer > 0 ) : ?>
<ul class="newerPosts">
<?php echo $html_newer; ?>
</ul>
<?php endif; ?>
<div class="currentPost"><?php the_title() ?></div>
<?php
if ( $older > 0 ) : ?>
<ul class="olderPosts">
<?php echo $html_older; ?>
</ul>
<?php endif; ?>
</nav>
制限事項と動作仕様
制限事項
日付で前後の判定をしているため、同じ日付で複数の記事を公開している場合には非対応です。若干の改修を加える必要があると思います。
WordPress 3.7以降対応です(それより古いバージョンでは WP_Query が日付パラメータに対応していません)。
動作仕様
$max_posts を 10 に指定した場合、以下の条件に従って前後記事へのリンク(アンカー テキストは記事タイトル)が出力されます。
- 基本的には新しい記事 5件 古い記事 5件が表示される
- 例えば 表示中の記事より新しい記事が 3件しかなかった場合は 新しい記事 3件 古い記事 7件が表示される
- 記事総数が 10 に満たない場合は すべての記事が表示される
実際に出力される HTML は 49行目~最後になります。新しい記事リスト(ul class=”newerPosts”)、現在の記事(div class=”currentPost”)、古い記事リスト(ul class=”olderPosts”)です。ul 要素内の li 要素は 40行目と 44行目で生成しています。このあたりをカスタマイズし、スタイルシートを組み合わせれば柔軟なデザインが可能だと思います。
関連ページ
- WP_Queryの使い方をPHPコードにまとめた便利なコード・スニペット | notnil creation weblog
- WordPress $post, $term and $comment Object Cheat Sheet | Pro Blog Design
- WordPress WP_Query オブジェクトのプロパティ一覧 | Design Hack and Slash
プチ解説
ポイントは、14行目の「’order’ => ‘ASC’」でしょうか。date_query で after を指定する場合には order を ASC にしないと意図した結果を得られません。わりとハマりました。この関係で $newer_posts は古い順で取得されるため、40行目の HTML 生成で逆順にしています。
同じカテゴリの前後記事のみ表示したい場合
get_posts() の取得条件(11~31行目)に category_name または category__in 等を追加すれば可能です。カテゴリ情報は get_the_category() で取得できます。
どなたかのお役に立つことを願いつつ また次回。