サポート » テーマ » 固定ページで同じ親の前後リンク(孫カテゴリもある場合)

  • 階層がある固定ページがあります。
    果物─りんご
      ├ぶどう
      │└マスカット
      ├バナナ
      └なし

    ここでりんごなどの子ページに前後リンクをつけたいです。
    例えばりんごなら
    →ぶどう

    ぶどうなら
    ←りんご →マスカット
    という感じです。

    マスカットなら
    ←ぶどう →バナナ

    という感じです。

    いろいろ調べて下記の書き方でいけそうだったんですが、
    マスカットなどの孫カテゴリがなければ無事表示されるんですが、
    孫カテゴリがある場合、表示がうまくいきません。
    このコードをカスタマイズしていけるのか、
    全く違う書き方をすべきなのか、
    分かる方がいらっしゃいましたら教えていただけると幸いです。

    
    <?php
    $nextpage = get_adjacent_post('', '', false); //次の固定ページを取得
    $prevpage = get_adjacent_post('', '', true); //前の固定ページを取得
    $thepost = get_post(); //現在の投稿を取得
    ?>
    <div class="next_prev_page_link">
        <ul>
    <?php if($prevpage->post_parent === $thepost->post_parent) { ?>
            <li class="prev"><a href="<?php echo get_permalink($prevpage->ID); ?>"><?php echo $prevpage->post_title; ?></a></li>
    <?php } if($nextpage->post_parent === $thepost->post_parent) { ?>
            <li class="next"><a href="<?php echo get_permalink($nextpage->ID); ?>"><?php echo $nextpage->post_title; ?></a></li>
    <?php } ?>
        </ul>
    </div>
    
7件の返信を表示中 - 1 - 7件目 (全7件中)
  • 固定ページにカテゴリー(親、子、孫)を使えるようにしてあるのですか? 固定ページ自体に階層があるのは普通ですよね。

    gblsm様

    カテゴリーは使っていないです。デフォルトの機能で階層で作っています。
    すみません、言い方が間違っていました。「孫カテゴリ」ではなく「孫ページ」です。

    どうすれば良いかすぐに思いつきませんが
    少なくとも get_adjacent_post() は、除外対象の固定ページや投稿を指定できません(そういうパラメータがない)。

    ですので、次のような方法かなと思います(検証していません)

    get_adjacent_post() で取得した投稿が孫ページなら、子ページが出てくるまで取得を繰り返す。

    または get_adjacent_post() のフィルターフックを利用して、孫ページを除外する。予めすべての孫ページのIDを探しておき、それを除外指定する。
    参考ページ:
    https://stackoverflow.com/questions/16495117/how-to-skip-certain-links-on-adjacent-posts-in-wordpress

    gblsm様

    ご返信ありがとうございます。
    「すぐに思いつかない」ということは、やりたことは思った以上に複雑なんですね。。

    ご提案いただいた方法は、私にはちょっと高度すぎて自分で実装できそうにありません。
    せっかく書いていただいたのに申し訳ないです。

    こんにちは

    Codex の Next and Previous Links ページの「The Next and Previous Pages」セクションのコードが参考になると思います。

    ishitaka様

    ご返信ありがとうございます。
    さっそくCodexにあるコードを記述してみました。
    結果としては、孫ページがある場合でもうまく表示できました!
    ありがとうございます!

    ただ、Codexの書き方のままだと、親ページをまたいだリンクも表示されてしまいました。。
    下記の例だと、「なし」のページで →動物が出るイメージです。

    果物─りんご
      ├ぶどう
      │└マスカット
      ├バナナ
      └なし
    動物-犬

    これを同じ親だけのリンクに限るにはどう書けばよいのでしょうか?

    先祖の ID をチェックするのではどうでしょうか。

    (省略)
    
    $prevID = $pages[$current-1];
    $nextID = $pages[$current+1];
    
    $ancestors = get_post_ancestors( $post );
    $ancestor = ( $ancestors ) ? $ancestors[count( $ancestors ) - 1] : $post->ID;
    
    $prev_ancestors = get_post_ancestors( $prevID );
    $prev_ancestor = ( $prev_ancestors ) ? $prev_ancestors[count( $prev_ancestors ) - 1] : $prevID;
    
    $next_ancestors = get_post_ancestors( $nextID );
    $next_ancestor = ( $next_ancestors ) ? $next_ancestors[count( $next_ancestors ) - 1] : $nextID;
    
    if ( $prev_ancestor == $ancestor ) {
    	// 前へを表示
    }
    if ( $next_ancestor == $ancestor ) {
    	// 次へを表示
    }
7件の返信を表示中 - 1 - 7件目 (全7件中)
  • このトピックに返信するにはログインが必要です。