WordPressで「前の記事へ」や「次の記事へ」を表示する際はget_previous_post()
とget_next_post()
を使って記事リンクなどを表示しますが、
タクソノミー指定もしていないのに全ての記事が順番に表示されず、いくつかの記事を飛ばしてしまうことがあります。
この思わぬ落とし穴と対処方法について解説します。
はじめに結論
記事の「投稿日」を見直してください。
開発中はテスト記事を複製して量産することがあると思いますが、
複製された記事は投稿日が全て同じになります。
複数投稿でこの投稿日時が同じ場合、「前の記事(get_previous_post)」「次の記事(get_next_post)」として判定される投稿は、
同じ投稿日時の記事の中で「前」は一番上(最新)の投稿、「次」は一番下(最後)の投稿だけを表示します。
そのため、不規則にいくつかの記事を飛ばしてしまうような動きをすることがあります。
「前の記事へ」「次の記事へ」を表示する方法
まず、前後記事リンクを表示する際はこのように記述します。
<?php
$prev_post = get_previous_post(); // 前の投稿を取得
$next_post = get_next_post(); // 次の投稿を取得
if( $prev_post || $next_post ): // どちらか一方があれば表示
?>
<nav class="page-nav">
<?php if( $prev_post ): // 前の投稿があれば表示 ?>
<a href="<?php echo get_permalink( $prev_post->ID ); ?>" class="prev-link">
<span>前の記事へ</span><br /><?php echo get_the_title( $prev_post->ID ); ?>
</a>
<?php endif; ?>
<?php if( $next_post ): // 次の投稿があれば表示 ?>
<a href="<?php echo get_permalink( $next_post->ID ); ?>" class="next-link">
<span>次の記事へ</span><br /><?php echo get_the_title( $next_post->ID ); ?>
</a>
<?php endif; ?>
</nav>
<?php endif; ?>
参考) https://hirashimatakumi.com/blog/3764.html
通常はこれで問題なく前後記事リンクが表示されます。
この書き方は間違っていませんのでご安心ください。
しかし、それでも結論で書いたように同一日時の投稿がある場合は全ての記事を順番に表示してくれません。
get_previous_post
とget_next_post
の「前」、「次」の定義
公式にはこのように記載されています。
single.phpget_previous_post( bool $in_same_term = false, int[]|string $excluded_terms = '', string $taxonomy = 'category' )
Retrieves the previous post that is adjacent to the current post.(翻訳:現在の投稿に隣接する前の投稿を取得します。)
https://developer.wordpress.org/reference/functions/get_previous_post/
single.phpget_next_post( bool $in_same_term = false, int[]|string $excluded_terms = '', string $taxonomy = 'category' )
Retrieves the next post that is adjacent to the current post.(翻訳:現在の投稿に隣接する次の投稿を取得します。)
https://developer.wordpress.org/reference/functions/get_next_post/
この書き方がとても曖昧ですが、
「隣接(adjacent)」とは、どうやら同一投稿タイプ内の「投稿日」を基準に隣ということのようです。
そのため、前後は隣接するID基準などではなく、日時的に古い投稿、新しい投稿を指します。
記事複製などで同じ投稿日時がある場合は…
サイト開発時、表示チェックなどで記事を大量に複製してみる場合は、
とても面倒ですが、複製後に手動で投稿日を1分以上ずらしてください。