WordPressで同カテゴリー内の前後投稿を取得する方法

はじめに

WordPressの投稿ページ等によくある「前の投稿」「後の投稿」みたいな表示を以前から作っていたのですが、これまでは「親カテゴリー」で前後まとめられていました。

それを今回「子(孫)カテゴリー」つまり親カテゴリーは除外して、同一のカテゴリー内でのみ投稿を呼び出せるようにPHPを編集しました。

当初どのように記述したら良いか分からなかったので色々調べてみたのですが、意外とあまり情報が無かったので紹介してみることにしました。

このページ解説にあたっては、当ページでの設定(特に親カテゴリー「趣味」と、その子カテゴリーの「神社巡り」のカテゴリー)をもとに紹介していますので、参考までにご覧ください。

目次

前後の投稿を取得するPHP

まずは前後の投稿を取得するPHPは次のように記述します。

PHP(1つ前の投稿を取得)

<?php get_previous_post( ) ?>

PHP(1つ後の投稿を取得)

<?php get_next_post( ) ?>

( )の中にはオプションが入り、それぞれ以下のとおりです。

PHP(オプション)

get_previous_post( $in_same_term, $excluded_terms, $taxonomy )
$in_same_term 同じカテゴリの投稿を対象とするか
初期値:false
$excluded_terms 除外するカテゴリーのID
初期値:なし
$taxonomy タクソノミー($in_same_termが有効な場合)
初期値:category

私のサイトの場合、現在、「趣味」に関するカテゴリー構造が以下ようになっています。

  • 趣味 > 神社巡り > 各投稿
  • 趣味 > QOL > 各投稿
  • 趣味 > (今後投稿を作る予定のカテゴリー) > 各投稿

趣味カテゴリーについては、現状「神社巡り」に関する投稿が主で、「QOL」に関する登録は少しだけあります。

その他、まだ投稿はありませんが作りたい子カテゴリーもありますし、今後さらにカテゴリーが増える可能性もあります。

これら「趣味」カテゴリーの投稿のうち、「神社巡り」カテゴリーの前後の投稿には、同じく「神社巡り」カテゴリーの投稿のみが取得されるようにしたいと考えました(前後の投稿データを取得したいが、「神社巡り」以外は除外したい)。

当サイトの場合、「趣味」カテゴリー内の「QOL」のカテゴリーIDは「18」です。同様に(まだ投稿は無いけど)「今後投稿を作る予定のカテゴリー」のIDは「17」です。

カテゴリーID「17」「18」を除外したい場合のPHPの記述は以下になります。

PHP(特定のカテゴリーを除外)

get_previous_post( true,'17,18')
get_next_post( true,'17,18')

カテゴリーが2つ以上ある場合は「,」で区切ります。

上記ソースに変数を付けると以下になります。

$prev_post = get_previous_post(true,'17,18');
$next_post = get_next_post(true,'17,18');

リンクを設定する

次に、先ほど取得した投稿ページへのURLを取得する場合は以下のように記述します。

PHP(対象のURLを取得)

get_permalink( $prev_post->ID )

これをリンクさせる場合は以下にように記述します。

PHP(対象のURLへリンクさせる)

<a href="<?php echo get_permalink( $prev_post->ID ); ?>">テキストなど</a>

前後の投稿が無い場合の処理を作る

投稿したページが「最新」あるいは「最も古い」の場合、当然ですがその前(後)の投稿はありません。

その場合は前(後)のリンクが不要になるので「対象が空の場合」を意味するemptyを使って条件分岐をします。

私の場合は条件分岐で「空じゃない場合」の処理を書いているので、否定演算子の!emptyと記述しました(詳しくは下記のコードをご覧ください)。

PHP(対象が「empty」じゃない時の処理)

if (!empty( $prev_post )):

このように記述し、それ以降に処理を追加していきます。

リンクを設定したい場合は以下のようになります。

PHP(投稿が「最も古い場合」じゃない時の処理)

<?php $prev_post = get_previous_post(true,'17,18');
if (!empty( $prev_post )): ?>
<a href="<?php echo get_permalink( $prev_post->ID ); ?>">前の投稿</a>
<?php endif; ?>

PHPの処理の流れは以下のとおりです。

  • get_previous_postでカテゴリーID「17」「18」以外の同カテゴリー投稿IDを取得する
  • その投稿IDのURLを取得する
  • そのURLをリンクさせる

最後に<?php endif; ?>を付けることで「条件に合わない時(投稿ページが最も古い場合)」は何もしない(リンクを生成しない)、という処理になります。

同様に投稿が「最新」の場合で条件分岐をする場合は、次のようにPHPを記述します。

PHP(投稿が最新じゃない時の処理)

<?php $next_post = get_next_post(true,'17,18');
if (!empty( $next_post )): ?>
<a href="<?php echo get_permalink( $prev_post->ID ); ?>">新しい投稿</a>
<?php endif; ?>

これで同カテゴリーのみで前後の投稿のリンクが作成できます。

あとはサムネイル画像を追加したりCSSで細かなレイアウトの調整をしたり、という作業になります。