サポート » 使い方全般 » next_post_linkの使い方

  • こんにちは。社内のクローズドのプロジェクトでWPを使ったCMSを構築しています。

    単一投稿のページに next_post_linkを付けて、
    ページの移動をし易くしたいと思っています。

    全投稿一覧から単一投稿ページに進んだ場合は
    問題無く動作しています。

    一点悩んでいるのが、
    当たり前のことなのですが
    カテゴリアーカイブページから the_permalinkで単一投稿のページに入った際でも
    「next」ボタンを押すと、単純に全投稿の日付でソートされたものが
    表示されてしまうことです。

    アーカイブページから単一投稿ページに飛んだ場合は
    同一カテゴリ内の投稿で遷移するのが理想なのですが、
    実現する方法はあるのでしょうか。

    以上、お分かりの方がいらっしゃいましたら、
    ご教授の程、よろしくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • モデレーター IKEDA Yuriko

    (@lilyfan)

    アーカイブページから単一投稿ページに飛んだ場合は
    同一カテゴリ内の投稿で遷移するのが理想なのですが、
    実現する方法はあるのでしょうか。

    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() の部分を修正させるしかないです。ちょっと面倒ですね。

    トピック投稿者 iizuka

    (@iizuka)

    お世話になっております。

    早速のお返事、感謝しております。
    誠にありがとうございます。

    大体の流れは理解しました。

    >そうなると、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);

    このような方向で行えばいいのでしょうか。
    パラメータが必要ですよね、、。知識不足で申し訳ございません。

    お忙しい中、大変恐縮ですが
    よろしくお願い致します。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    こちらの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 を見てみてください。

    トピック投稿者 iizuka

    (@iizuka)

    お返事、誠にありがとうございます。

    きちんと流れを把握出来ていなかったようですね、、。
    申し訳ございません。

    まず、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).'">';

    こちらを変更するという流れでいいのでしょうか。

    大変恐縮ですが、よろしくお願い致します。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    まず、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 の中身を確認しておく必要があります。

    トピック投稿者 iizuka

    (@iizuka)

    お返事頂き、誠にありがとうございます。

    やっと流れを掴めました。親切にご対応頂き
    感謝しております。

    私の知識では少々難易度が高い作業ですが、
    なんとかがんばってみたいと思います。
    また、分からない点がありましたら、
    ご質問させて頂ければと思います。

    トピック投稿者 iizuka

    (@iizuka)

    お世話になっております。
    やはり若干不安なので、ご教授頂きたく存じます。
    申し訳ございません。

    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);'">';

    こんなかたちで修正すれば宜しいでしょうか。

    お忙しい中、大変恐縮ですが
    よろしくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「next_post_linkの使い方」には新たに返信することはできません。