アーカイブページから単一投稿ページに飛んだ場合は
同一カテゴリ内の投稿で遷移するのが理想なのですが、
実現する方法はあるのでしょうか。
next_post_link()
の第3引数が $in_same_cat
ですので、これを true にすれば OK です。single.php に書かれている next_post_link(), previous_post_link()
を修正してみてください。
ただ、単純に書き換えてしまうと、全投稿一覧から単一投稿ページに飛んでも、同一カテゴリーでの遷移になってしまいます。この区別をどう行うかはちょっと難儀です。
アーカイブページから単一投稿へのリンクを the_permalink()
で作るかわりに以下のように作って、$in_same_cat
をどうするかフラグをつける手があります。
$link = get_the_permalink();
$link .= (strpos($link, '?') ? '&' : '?' ) . 'in_same_cat=true';
echo attribute_escape($link);
しかし、next_post_link()
は、生成される URL を加工できないので、in_same_cat フラグを継続して付与できません。一度同一カテゴリーの前後記事に飛ぶと、その次は全投稿の前後記事になってしまうわけです。
そうなると、next_post_link()
をまるごとコピペして似た関数を作り、get_the_permalink()
の部分を修正させるしかないです。ちょっと面倒ですね。
お世話になっております。
早速のお返事、感謝しております。
誠にありがとうございます。
大体の流れは理解しました。
>そうなると、next_post_link() をまるごとコピペして似た関数を作り、
>get_the_permalink() の部分を修正させるしかないです。ちょっと面倒ですね。
こちらの部分ですが
$link = get_the_permalink();
$link .= (strpos($link, '?') ? '&' : '?' ) . 'in_same_cat=true';
echo attribute_escape($link);
こちらの1行目の部分をnext_post_link()の換わりにするため
$link = next_post_link();
$link .= (strpos($link, '?') ? '&' : '?' ) . 'in_same_cat=true';
echo attribute_escape($link);
このような方向で行えばいいのでしょうか。
パラメータが必要ですよね、、。知識不足で申し訳ございません。
お忙しい中、大変恐縮ですが
よろしくお願い致します。
こちらの1行目の部分をnext_post_link()の換わりにするため
ちがいます。next_post_link()
をコピペして作った関数にある get_the_permalink()
を、わたしが提示したものに変更する、ということです。
「同じカテゴリーの前後記事にリンクする」状態を継続させるためには next_post_link()
は使えないため、類似の関数を別途作る必要があります。そのためには、next_post_link()
をコピペして修正すればよく、その修正箇所が get_the_permalink()
の部分であるということです。厳密には、next_post_link()
は adjacent_post_link()
を呼んでいるので、こちらも類似関数を作る必要があります。この関数には
$string = '<a href="'.get_permalink($post).'">';
という箇所があるので、これをいじる、ということですね。wp-includes/link-template.php を見てみてください。
お返事、誠にありがとうございます。
きちんと流れを把握出来ていなかったようですね、、。
申し訳ございません。
まず、archive.phpとindex.php等のthe_permalink()の箇所を
先程教えて頂きました、
$link = get_the_permalink();
$link .= (strpos($link, '?') ? '&' : '?' ) . 'in_same_cat=true';
echo attribute_escape($link);
に置き換えるという認識は間違っておりませんでしょうか。
上記変更とともに
現在single.phpに書かれているnext_post_link()、previous_post_link()の部分を、wp-includes/link-template.phpからコピーペーストしてきた関数を変更したものに
置き換える。
書き換える部分としては、
上記で仰って頂いております
$string = '<a href="'.get_permalink($post).'">';
こちらを変更するという流れでいいのでしょうか。
大変恐縮ですが、よろしくお願い致します。
まず、archive.phpとindex.php等のthe_permalink()の箇所を
先程教えて頂きました、
…中略…
に置き換えるという認識は間違っておりませんでしょうか。
はい。それで OK です。ただし、the_permalink()
関数の部分を3行のコードに置き換えるのは、上手に行なわないと PHP の文法違反になってしまいますので、それが注意点でしょうか。
現在single.phpに書かれているnext_post_link()、previous_post_link()の部分を、wp-includes/link-template.phpからコピーペーストしてきた関数を変更したものに
置き換える。
実際には、お使いのテーマのディレクトリーに functions.php を作成して、そこにコピペした関数を入れて、single.php からはその関数を呼ぶ方がスマートでしょう。当然ながら、関数名は変更する必要があります (同じ関数だと二重定義エラーになる)。
また、WordPress のバージョンアップにともなって、互換性問題が出る可能性があるので、バージョンアップごとに link-template.php の中身を確認しておく必要があります。
お返事頂き、誠にありがとうございます。
やっと流れを掴めました。親切にご対応頂き
感謝しております。
私の知識では少々難易度が高い作業ですが、
なんとかがんばってみたいと思います。
また、分からない点がありましたら、
ご質問させて頂ければと思います。
お世話になっております。
やはり若干不安なので、ご教授頂きたく存じます。
申し訳ございません。
the_permalink()の部分の変更はうまくいきました。
$link = get_the_permalink();だとエラーが出てしまったので
$link = get_permalink();にしてみたのですが
問題はございませんでしょうか。
function.phpの内容ですが
・link-template.phpからコピーしてきた
next_post_linkをnext_post_link_subに変更
・link-template.phpからコピーしてきた
adjacent_post_linkをadjacent_post_link_subに変更
ここまで行いました。
$string = '<a href="'.get_permalink($post).'">';
こちらの部分ですが、
$string = '<a href="'$link = get_permalink($post);$link .= (strpos($link, '?') ? '&' : '?' ) . 'in_same_cat=true';echo attribute_escape($link);'">';
こんなかたちで修正すれば宜しいでしょうか。
お忙しい中、大変恐縮ですが
よろしくお願い致します。