【WordPress】前後の投稿へのリンクを作成する方法|同カテゴリー限定とthe_post_navigation

記事の下に「前の記事」「次の記事」へのリンクを表示すると、読者がブログ内を回遊しやすくなります。この記事では previous_post_link() / next_post_link() の基本と、見落とされがちな既定の挙動、そして1回で両方出力できるthe_post_navigation() まで解説します。

この記事でわかること

  • previous_post_link() / next_post_link() の基本
  • 既定では全投稿を時系列で辿る(同カテゴリー限定にする方法)
  • the_post_navigation() でまとめて出力する(推奨)
  • カスタム投稿タイプでの前後リンク
スポンサーリンク

前後の投稿へのリンクを表示する(基本)

single.php などのループ内に追加します。1つの .pagination にまとめて、前後のリンクを並べます。

テンプレート:前後のリンクをまとめて表示
<div class="pagination">
  <div class="prev-post">
    <?php previous_post_link('%link', '&laquo; 前の記事へ'); ?>
  </div>
  <div class="next-post">
    <?php next_post_link('%link', '次の記事へ &raquo;'); ?>
  </div>
</div>
最初・最後の記事では何も出力されない
previous_post_link() / next_post_link() は、前後の投稿が存在しない場合は自動的に何も出力しません(内部で get_previous_post() / get_next_post() をチェックしています)。空のリンクや壊れたリンクが表示される心配はありません。

既定では「全投稿」を時系列で辿る(同カテゴリー限定にする)

カテゴリーをまたいで移動するのが既定の挙動
previous_post_link() / next_post_link() は、第3引数 $in_same_term の既定値が false のため、カテゴリーを問わず全投稿を公開日時順に辿ります。「同じカテゴリー内の前後記事だけ移動したい」と思って実装すると、想定外の別カテゴリーの記事にリンクしてしまうことがあります。同カテゴリー限定にしたい場合は、第3引数に true を渡してください。
テンプレート:同じカテゴリー内の前後記事だけに限定
<div class="pagination">
  <div class="prev-post">
    <?php previous_post_link('%link', '&laquo; 前の記事へ', true); ?>
  </div>
  <div class="next-post">
    <?php next_post_link('%link', '次の記事へ &raquo;', true); ?>
  </div>
</div>

the_post_navigation() でまとめて出力する(推奨)

WordPress標準の the_post_navigation() を使うと、前後のリンクを1回の呼び出しでまとめて出力できます。<nav> タグやスクリーンリーダー向けのラベルも自動で付き、マークアップが簡潔になります。

テンプレート:the_post_navigationでまとめて出力
<?php
the_post_navigation(array(
  'prev_text' => '&laquo; %title',
  'next_text' => '%title &raquo;',
  'in_same_term' => true, // 同カテゴリー限定にする場合
));
?>

カスタム投稿タイプで前後リンクを使う

previous_post_link() / next_post_link() / the_post_navigation()通常の投稿(post)を前提としています。同じ投稿タイプ内であれば、そのままカスタム投稿タイプのテンプレートでも動作します。異なる投稿タイプをまたいで前後を辿りたい場合は、自前で WP_Query を組んで日付順に前後の投稿を検索する必要があります。

投稿IDやタイトルなど記事情報の取得方法全般は記事の情報を取得する方法(完全ガイド)にまとめています。

よくある質問(FAQ)

Qprevious_post_link()の引数の意味を教えてください。
A第1引数は全体のフォーマット(%link がリンク部分に置き換わります)、第2引数はリンクの中身のフォーマット(%title でタイトルを挿入できます)、第3引数は true にすると同じカテゴリー内の記事だけを対象にします(既定は false で全投稿が対象)。
Q前後記事のタイトルをリンクテキストに含めるには?
A第2引数に %title を含めます。previous_post_link('%link', '&laquo; %title'); のようにすると、「← 前の記事のタイトル」という形でリンクが表示されます。
Qカスタム投稿タイプでも前後記事リンクを使えますか?
A同じ投稿タイプ内であれば previous_post_link() / next_post_link() / the_post_navigation() がそのまま使えます。異なる投稿タイプをまたいで前後を辿るリンクが必要な場合は、自前で WP_Query を組んで実装します。

まとめ

  • 基本previous_post_link() / next_post_link()(1つの.paginationにまとめる)
  • 注意:既定は全投稿が対象。同カテゴリー限定にするには第3引数を true
  • 推奨the_post_navigation() でまとめて簡潔に出力
  • 存在しない場合:関数側で自動的に何も出力しない(空リンクの心配なし)

既定の挙動(全投稿が対象)を理解した上で、必要に応じて同カテゴリー限定に切り替えましょう。