WordPressのテーマを自作しよう! get_previous_post()を使って同カテゴリ内の前後リンクを取得する方法
ハメカメ師匠
WordPressの同カテゴリ内の前後リンクでハマってしまいました・・・
複数のカテゴリで前後リンクがまったくうまくいかずでして・・・
こんな感じのやつなのですが・・・
初歩の初歩じゃな・・
get_previous_post()
とget_next_post()
を使い、前後の記事の投稿記事IDを取得してget_permalink(ID値)
とすれば
前後のリンクを取得することが出来るじゃろう・・・ほんでなんたらかんたら・・・・・・ちんたらかんたら・・
・・・であろう!
相変わらず・・ もっさいのぅ・・・
・・・・
すみません。。
しかし、ネットで調べてみても色々な情報が錯綜しており
コードをコピペしてもうまく動作がしなくて・・・
なるほどのぉ・・・
おそらく、それはカテゴリの構造が参考ページと違ったり
get_previous_post()の仕様をキチンと理解せず
なんとなく使用しているからうまく動作しないのであろう・・・
なるほど・・・
少しこのget_previous_post()
をスペシャルマンレベルと舐めていました・・・
一度キチンと整理してみます・・・
get_previous_post()の仕様
仕様ですが
get_previous_post( bool $in_same_term = false, int[]|string $excluded_terms = ”, string $taxonomy = ‘category’ )
となります。
分かりやすくすると
get_previous_post(
【第1引数】同カテゴリに限定するかのフラグ、
【第2引数】除外するカテゴリID、
【第3引数】タクソノミー
)
となります。
今回はカテゴリページで使うので【第3引数】タクソノミーの初期値は’category’で問題ないので何もしなくても大丈夫です。
【第1引数】同カテゴリに限定するかのフラグ
限定する場合はtrue、限定しない場合はfalse
【第2引数】除外するカテゴリID値
配列 : [カテゴリID値1,カテゴリID値2,カテゴリID値3] か
文字列 : ‘カテゴリID値1,カテゴリID値2,カテゴリID値3’ で指定します。
はまりポイント
カテゴリ構造が少し複雑になり、あまり仕様を理解せず適当に使っていたせいでまったくうまく動作しませんでした。その原因として一つのカテゴリだけでなく複数のカテゴリで限定する必要があったからです。
第1引数である同カテゴリに限定するかのフラグをtrueにしているとすでにカテゴリが限定されている状態なので除外もへったくそれもない状態なのです・・
カテゴリを限定したい時は除外するのではなく限定したいカテゴリIDを指定するほうがすごくしっくりくるのですが僕だけですかね。。。。
get_previous_post()の正しい使い方
下記のようなカテゴリ構造があります。
これを用いて正しい使い方をマスターしようと思います。
あなたは今、アイドル超人カテゴリページにいます。
アイドル超人カテゴリページだけの同カテゴリ前後リンクを設置するにはどうしたらいいでしょうか?
PHP
コピー
$prev_post = get_previous_post(true);
$next_post = get_next_post(true);
これだけで大丈夫です。
すごく簡単ですね。。
ここから僕は少しハマりました・・・
あなたは今、同じくアイドル超人カテゴリページにいます。
アイドル超人と残虐超人カテゴリページの複数カテゴリの同カテゴリ前後リンクを設置するにはどうしたらいいでしょうか?
PHP
コピー
$prev_post = get_previous_post(true,'2,3');
$next_post = get_next_post(true,'2,3');
これでうまく動作するでしょうか?
これでは正常に動作しません。
第2引数は除外するカテゴリIDなのです。
PHP
コピー
$prev_post = get_previous_post(true,'5,6');
$next_post = get_next_post(true,'5,6');
これでうまく動作するでしょうか?
これでも正常に動作しません。
アイドル超人カテゴリページにいて第1引数の同カテゴリフラグをtrueにしているのでアイドル超人のみの同カテゴリ前後リンクが設置されてしまいます。
複数カテゴリをまたぐ同カテゴリ前後リンクを作成したい場合は第1引数の同カテゴリフラグは必ずfalseにしないといけません。
そして除外するカテゴリを指定します。
PHP
コピー
$prev_post = get_previous_post(false,'5,6');
$next_post = get_next_post(false,'5,6');
全体から必要ないカテゴリを除外して必要であるカテゴリを残すという棒崩しのような回りくどい仕様なのですね。。。 すごく直感的に必要なカテゴリ値を指定したい・・・
前後記事のリンクを作成
正しい同カテゴリ前後の記事の情報を取得できたらあとは比較的簡単な作業となります。
前後記事のリンクを作成するのみです。
PHP
コピー
$prev_post = get_previous_post(任意);
$next_post = get_next_post(任意);
$prev_post
と$next_post
に必要な前後記事の情報が入っているのでその中からID値を取得。
$prev_post->ID
$next_post->ID
がぞれぞれのID値となります。
リンクURLを取得
PHP
コピー
$prev_link = get_permalink($prev_post->ID);
$next_link = get_permalink($next_post->ID);
ID値を元にリンクURLを取得。get_permalink()
!!!
タイトルを取得
PHP
コピー
$prev_title = get_the_title($prev_post->ID);
$next_title = get_the_title($next_post->ID);
ID値を元にタイトルを取得。get_the_title()
!!!
全PHP
今回はget_previous_post()
のまとめがメインですので参考程度に。。。
「前の記事へ」と「次の記事へ」は最初と最後は存在しないのでempty
で存在チェックしてif
文で振り分け。
PHP
コピー
<?php
$prev_post = get_previous_post(任意の設定);
$next_post = get_next_post(任意の設定);
$prev_link = get_permalink($prev_post->ID);
$next_link = get_permalink($next_post->ID);
$prev_title = get_the_title($prev_post->ID);
$next_title = get_the_title($next_post->ID);
?>
<ul class="next-prev__list">
<li class="-prev">
<?php if (!empty( $prev_post )): ?>
<a href="<?php echo $prev_link; ?>">
<span class="next-prev__list-txt">前の記事へ</span>
<span class="next-prev__list-ttl"><?php echo $prev_title; ?></span>
</a>
<?php endif;?>
</li>
<li class="-next">
<?php if (!empty( $next_post )): ?>
<a href="<?php echo $next_link; ?>">
<span class="next-prev__list-txt">次の記事へ</span>
<span class="next-prev__list-ttl"><?php echo $next_title; ?></span>
</a>
<?php endif;?>
</li>
</ul>
まとめ
- ・get_previous_post()は第1引数をtrueにすると第2引数は必要がなくなり現在の該当カテゴリ内のみ。
- ・全体から必要ないカテゴリを除外して必要であるカテゴリを残すという棒崩しのような回りくどい仕様。
というのを忘れずに構築すれば問題ないかと思われます。
ブラボー ブラボー
なんかたまに正常に動作しないと思ったらそんな仕様だったのか!
ヒューヒューだよ。サトケン。
・・・
え・・・ マスターしてなかったんですか??
・・・
・・・・・・