WordPress lightningで「前の記事」「次の記事」を同じカテゴリのものだけに

やりたいこと

WordPressのテーマlightningでの投稿の記事の下の方に出る「前の記事」/「次の記事」を同じカテゴリのものだけにしたい。
書いている人は多趣味だったり、いろんな種類の記事を書くだろうが見に来てくれた人は「釣り」のページ見ているのにこの記事のように「サーバーの構築」などの記事が「次の記事」にあっても興味なく、嫌だろう。次の釣りの記事がみたい。

そもそも全然別サイトでもよく、マルチサイトを検討、テストしていたがプラグインが対応してないとか問題があるらしく、試しにやってみたが不安定そうなのと戻すのにDB削除とかしたのででやめた。

いろいろ調べているが、情報が古そうでこれってものがない。テーマはlightningを使っているのでそれを含めて探しているが、それも情報が古い。あと、PHPのコードを見ながら推測しているが、PHPの知識がないので、ちょっとつらい、でもまぁ後出しの言語、基本はCの流れと同じ感じなので読める。色々知識が入ってきたのでつれづれなるままに過程をメモする。

結論:lightningのnext-prev.phpファイルを編集、"$in_same_term"を"true"にする

まずは過程なんてどうでもいい人のために結論を書く。
lightningで「前の記事」「次の記事」に表示している記事と同じカテゴリのもののみを表示する方法はこれだ。

/opt/bitnami/wordpress/wp-content/themes/lightning/_g3/template-parts/next-prev.php
をエディターで開き、下記のように編集して保存する。1行、falseをtrueにします。
(初歩的なサーバーにsshしてsudoでrootで編集するとか、それができないからftpでやるとかは他で調べてください。)

<?php
global $bootstrap;
//$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', false );
$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', true ); //ここかな?
$excluded_terms = apply_filters( 'lightning_prev_next_post_excluded_terms', '' );
$taxonomy       = apply_filters( 'lightning_prev_next_post_taxonomy', 'category' );
?>

<?php
$post_previous = get_previous_post( $in_same_term, $excluded_terms, $taxonomy );
$post_next     = get_next_post( $in_same_term, $excluded_terms, $taxonomy );

上から3行目にget_previous_post( )とget_next_post()への引数の定義$in_same_term をfalseからtrueにします。
そのまま記事をリロードしたらできているのが見えると思います。結果は一番下に書いてますので、よかったら次からの調査過程の記事も読んでみてください。

直接lightningのファイルをいじっているので、おそらくlightningのバージョンアップ(結構頻繁にある)で上書きされるかもしれない、バージョンアップのたびに修正しないといけないのだろう。この編集後のnext-prev.phpはコピーしておこう。Wordpressから指定できる変数にしてほしい。

lightningには世代があり、今この記事を書いている段階ではGeneration3である。おそらく世代が上がっても同じように__g4のところにものがあるのだろう。未来の人はこれ以下の調査過程記録を元に探して見てください。

調査過程

初動の調査でわかったこと:next_postがキーワード

https://sole-color-blog.com/blog/57/

同じカテゴリに絞ったページリンクを付けるには、上記コードの括弧()の中へ引数をセットします。
ポイントは、第3引数の「true」で、この第3引数をtrueにセットすることで、同じカテゴリに絞ったページリンクを付けることができるようになります。

https://sole-color-blog.com/blog/57/

<?php previous_post_link('&laquo; %link', '%title', true , ''); ?>
<?php next_post_link('%link &raquo;', '%title', true , ''); ?>

上記の3つ目の引数をtrueにすることで「次へ」の記事をそのカテゴリと同じものにするみたい
どこに書くか書いてない。
おそらくこれは1からテーマを書いたりする人向けの色々知ってて当然という前提の話。
next_post_linkで検索するとオフィシャルみたいなところでそのとおりの説明がある。

_linkhttps://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/previous_post_link

next_post_link()を探した

grep next_post_link -rl .
nynt@X28k:/var/www/html/$ grep next_post_link -rl .
../wp-includes/link-template.php
../wp-includes/deprecated.php
../wp-content/themes/lightning/_g2/template-parts/post/next-prev.php

ちなみにここらでテスト環境が欲しくてローカルのPCにapache2とWordpress環境を構築している。おかげで調査環境とお試し環境ができた。
ここで、すぐにはわからなかったが(過程省略)、lightningに関しては、__g2=G2=ジェネレーション2では使われていたみたいだが、今=ジェネレーション3では使われていない。
ディレクトリのwp-includeはデフォルトのWordpressの処理、wp-content/thema/lightning/の下はインストールしたテーマlightningの処理のためのPHPファイルだ。

■/lightning/_g2/template-parts/post/next-prev.php ...g2なので使用していない
■../wp-includes/deprecated.php:呼び出し元。next_post()から。非推奨 非推奨なのか?使用してない?
■../wp-includes/link-template.php ...関数の定義

さかのぼっていっても、見つからないので、どうもnext_post_link()は使われてなさそう。(この段階では気づかなかったが)

もうちょっと広く探す1:next_postでgrep

nynt@X28k:/var/www/html$ grep next_post -rl ../
../html/wp-includes/link-template.php
../html/wp-includes/deprecated.php
../html/wp-includes/blocks/query-pagination-next.php
../html/wp-includes/blocks/comments-pagination-next.php
../html/wp-includes/blocks/template-part.php
../html/wp-includes/class-wp-query.php
../html/wp-includes/link-template.php~
../html/wp-admin/includes/nav-menu.php
../html/wp-admin/includes/export.php
../html/wp-content/themes/lightning/_g3/template-parts/next-prev.php
../html/wp-content/themes/lightning/_g2/template-parts/post/next-prev.php
../html/wp-content/themes/twentytwenty/inc/template-tags.php
../html/wp-content/themes/twentytwenty/template-parts/navigation.php

"link"を外して引っかかる率を広げてみた。いっぱい出てきたが、なるほど先程のlightning/__g2のnext-prev.phpの__g3用のものもあるのか。

もうちょっと広く探す2:next-prevでgrep

ynt@X28k:/var/www/html$ grep next-prev -rl .
./wp-content/themes/lightning/_g3/assets/_scss/style.scss
./wp-content/themes/lightning/_g3/assets/_scss/project/_next-prev.scss
./wp-content/themes/lightning/_g3/assets/css/style.css
./wp-content/themes/lightning/_g3/template-parts/next-prev.php
./wp-content/themes/lightning/_g3/template-parts/main-singular.php
./wp-content/themes/lightning/_g2/template-parts/post/content.php
./wp-content/languages/themes/lightning-ja.po

これだじゃない?

lightnigでのファイルがいっぱい出てきた。しかも今使っているG3で。スタイルシート=cssも出てきたので、おそらくここらから呼ばれている。
おそらく、
scss/stile.cssから_next-prev.scssのnext-prev.scssが呼ばれ( @import "project/next-prev";の記述)
_scss/project/_next-prev.scss には「.next-prev {」の定義がある。が「vk~」と拡張プラグインっぽい記述のみ?
/style.cssは改行がなく読めないが、上記「.next-prev」の記述があるのでこれが呼び出される
/template-parts/next-prev.phpはこのファイル名自体が関数名になるのだろうか?関数の中身の記述があるget_next_post()を使っている。
これは最初のnext_post_linkでも使っていたのでこれからこれが置き換わって今使っているものと推測もできる。引数で「同じカテゴリ=false」を渡しているので我慢できずにとりあえずここを変えてみる。

./wp-content/themes/lightning/_g3/template-parts/next-prev.phpを修正

<?php
global $bootstrap;
//$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', false );
$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', true ); //ここかな?
$excluded_terms = apply_filters( 'lightning_prev_next_post_excluded_terms', '' );
$taxonomy       = apply_filters( 'lightning_prev_next_post_taxonomy', 'category' );
?>

<?php
$post_previous = get_previous_post( $in_same_term, $excluded_terms, $taxonomy );
$post_next     = get_next_post( $in_same_term, $excluded_terms, $taxonomy );

詳細は冒頭で書いているとおりです。まぁ、これ見たまんまです。

できた!

今表示しているのは「カテゴリー」=「キャンプ」の「釣り&キャンプ 平戸生月島 -キャンプ編-」そして、その前後が「カヤックフィッシング」なんだけど、飛ばして「キャンプ」の「焚き火台」と「宇美町昭和の森キャンプ場」となっている。

ちょっと苦労したけど、きっかけは他サイト頼りでしたがほぼ自力で解決できたのは気持ちいいです。世の中、解決した記事がないのならこの記事は役に立つであろう。検索が下手なだけか?今回わかったキーワードで検索してみよう。

次は「最近の投稿」も同じように同じカテゴリにしたい。親カテゴリ単位にするとか…難しそう。

コメントを残す