他のサイトでのことですが、WordPressでSimplicity2を用いており、
[前ページ][次ページ]のナビ表示(ページネーション/ページ送りナビ)を
同一カテゴリー内に限定しました。
やり方はすぐわかったのですが、実際やってみると表示が変だったので、
それをどのように解決したかの記録です。
(このサイトでそうするかは未定ですが、他の方からも見えるところに残しておきます。)
Wordpress 4.9.6–ja
Simplicity2バージョン: 2.6.7
Simplicity2 childバージョン: 20161002
同一カテゴリー内の記事だけでページ送りを行う方法は、
サポートフォーラムで紹介されていました。
phpに手を加える方法です。
そうしてカスタマイズしなければ表面化しない事象なので、
バグとしてフォーラムに投稿するのは(今のところ)控えています。
以前、別件ですが、フォーラムで質問したことがあります。
その際は、速やかで丁寧な回答をいただき、本当に助かりました。
いつかはお返しをしたいという気持ちはあるので、
修正すべき問題だと自信をもって言えるものなら迷わず報告させていただくのですが、
逆にサポート対象外であれば、
お忙しい皆様にご迷惑をおかけするだけということになります。
それで、ひとまず自分のブログに残しておくことにしました。
同じことでお困りの方にさえ伝わればいいと思って書いていますので、
一から十までの説明にはなっていません。
やりたかったこと
ページ送りナビの対象を、同一カテゴリー内に限定したい。
(サムネイルなしのデフォルト表示で)
ネットで紹介されていた方法
pager-post-navi.phpにおいて、
previous_post_link()などの第3引数をtrueにする。
この方法はネット探せばすぐ見つかりました。
simplicityのフォーラムを始め、他のサイトでも紹介されています。
生じた問題
作成されるページ送りナビのリンク先は正しいが、
リンクの表示がおかしくなることがある。(別記事のタイトルが表示される)
例
- 正しい動作:前ページのタイトルが「あ」、リンク先も「あ」。
- 生じている事象:タイトルが「い」と表示されるが、リンク先は「あ」。
ネット上のあちこちに紹介されている方法ですから、
同じカスタマイズをしている人は少なくないと思います。
ですが、この問題についての情報が見つからなかったんです。
他の方には起こっていないのでしょうか?
私の環境に固有の問題なのでしょうか?
試行錯誤
記事が複数のカテゴリーに属していると、
「同一カテゴリー内の前後の記事」をどう判定されるかりませんから、
1つの記事は1つのカテゴリーにしか属さないようにしてあります。
すべての記事を一旦削除し、
順番を整えて記事を作成し直せば解消しました。
どうやら、カテゴリーが行ったり来たりする順に記事を作成した場合に
この事象が発生しているようです。
(厳密な切り分けまでは行っていません。)
狂っているのはリンクのタイトル表示のみで、リンク先は正しいですし、
サムネイル付きのナビ表示の場合、この事象は生じないことから、
(データベースに保存されているデータの問題ではなく)
pager-post-navi.phpの動作に問題があると考えられます。
どうやらその中のget_previous_post()で取得している
WP_Postオブジェクトのpost_titleが、
意図したものではないようです。
参考情報
WordPress Codex 日本語版の「クラスリファレンス/WP Post」内
「WP_Post オブジェクトへのアクセス」に次のような記載があります。
注: 上記のメソッドは投稿 ID を取得する際には良いですが、
post_content やフィルターされた要素 (post_title など) を
表示するためには使うべきではありません。
代わりにループ内なら the_content を、
ループ外なら apply_filters を使って以下のようにしてください。
同一カテゴリー内に限定した状態で前後のpost_titleを取得するなら、
やり方を変えないといけないのでしょう。
示された方法に修正するのは私には難しそうだったので、
別の方法で対応しました。
実際に行った対策
正しく動作しているサムネイル付きナビで使われるファイルは、
pager-post-navi-thumbnail.phpです。
その中で、前後のページ情報を取得するのには、
get_adjacent_post()が使われています。
おかしな動きをしているサムネイルなしの場合のファイルは、
pager-post-navi.phpであり、
こちらではget_previous_post()が使われています。
それをget_adjacent_post()に置き換えてみたところ、
意図した動作をしてくれました。
具体的なpager-post-navi.phpの変更箇所は次の通りです。
(黄色のマーカーがデフォルトからの変更箇所)
<!– post navigation –>
<div class=”navigation”>
<?php
$prev_post = get_adjacent_post(true, ”, true); //前の記事
if( $prev_post ): ?>
<div class=”prev”><?php previous_post_link(‘%link’, ‘<span class=”fa fa-arrow-left fa-2x pull-left”></span>’.$prev_post->post_title, true); ?></div>
<?php
endif;$next_post = get_adjacent_post(true, ”, false); //次の記事
if( $next_post ): ?>
<div class=”next”><?php next_post_link(‘%link’, ‘<span class=”fa fa-arrow-right fa-2x pull-left”></span>’.$next_post->post_title, true); ?></div>
<?php
endif;
?>
</div>
<!– /post navigation –>
今のところこれで想定通りに動いてくれていますし、
他におかしな影響は出ていません。
ただし、何らかの理由があって、
get_adjacent_post()とget_previous_post()を
使い分けられていたのかもしれませんので、
この方法を使われる方はくれぐれも自己責任でお願いします。
その後
後日、新しくテスト環境を構築し、
余分なことをしないシンプルな状態でテストしてみたところ、
バッチリ再現しました。(上の方法で解決もしました。)
ですから他の方の環境でも生じているはずなんですけど、
皆さん諦めてるんでしょうか。。