サポート » 使い方全般 » サイドバーに子ページのリストをカスタマイズして表示したい

  • 解決済 Gangdise

    (@kayamori)


    初めまして。過去ログを検索したのですが、ぴったりのものがなかったようなので質問させていただきます。
    ページA(親)
    -ページa(子レベル)
    –ページa1(孫レベル)
    –ページa2(孫レベル)
    -ページb(子レベル)
    –ページb1(孫レベル)
    –ページb2(孫レベル)
    ページC(親)
    -ページc(子レベル)
    –ページc1(孫レベル)
    –ページc2(孫レベル)
    -ページd(子レベル)
    –ページd1(孫レベル)
    –ページd2(孫レベル)

    という構成だったときに、
    ・ページA(親)のサイドバーには
    ページA(親)
    -ページa(子レベル)
    –ページa1(孫レベル)
    –ページa2(孫レベル)
    -ページb(子レベル)
    –ページb1(孫レベル)
    –ページb2(孫レベル)
    を、
    ・ページC(親)のサイドバーには
    -ページc(子レベル)
    –ページc1(孫レベル)
    –ページc2(孫レベル)
    -ページd(子レベル)
    –ページd1(孫レベル)
    –ページd2(孫レベル)
    を表示させたいという意図です。

    現在サイドバーには、

    <?php
    global $wp_query;
    
    if( empty($wp_query->post->post_parent) ) {
    $parent = $wp_query->post->ID;
    } else {
    $parent = $wp_query->post->post_parent;
    } ?>
    <?php if(wp_list_pages("title_li=&child_of=$parent&echo=0" )): ?>
    <div id="submenu">
    <ul class="lifestream">
    <?php wp_list_pages("title_li=&child_of=$parent" ); ?>
    </ul>
    </div>
    <?php endif; ?>

    と記述しているのですが、これだと
    ページA(親)のサイドバーに
    ページA(親)
    -ページa(子レベル)
    –ページa1(孫レベル)
    –ページa2(孫レベル)
    -ページb(子レベル)
    –ページb1(孫レベル)
    –ページb2(孫レベル)
    ページC(親)
    -ページc(子レベル)
    –ページc1(孫レベル)
    –ページc2(孫レベル)
    -ページd(子レベル)
    –ページd1(孫レベル)
    –ページd2(孫レベル)
    と全ての親レベルが表示されてしまいます。
    どこをどう直せばよいのか、どうぞご教示くださいませ。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • Web全体やリファレンス内を検索すると幸せになれますよ。

    http://wpdocs.sourceforge.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/wp_list_pages

    現在見ているページの子を表示させたいとのことなのですが、
    子ページを表示している際の挙動が考慮されていないので
    kayamoriさんが想定しているようなコードを記述すると、
    子ページを表示しているときの表示がおかしくなりそうです。

    ページA(親)の子(ページaやページc)を表示しているときは、ページA(親)のリストだけ表示させる
    という挙動で大丈夫でしょうか。

    それでしたら
    http://ja.forums.wordpress.org/topic/1056?replies=10
    のやりかたで最上位の親のIDを取得して
    wp_list_pagesのパラメーター「include」に渡してあげれば実現できると思われます。
    (URLの例は最上位の親の子ページだけ表示させたいようなのでchild_ofが使われています)

    #全て検索結果で申し訳ありません。

    nawokiさん

    回答をどうもありがとうございます。
    教えていただいたURLは以前に見て試したのですが、この方法で全てのページが表示されてしまいました。
    書き方がおかしかったかもしれませんので、もう一度書いてみます。

    • 親=中国料理
      • 子=中国料理の種類
        • 孫=北京料理
        • 孫=上海料理
        • 孫=広東料理
        • 孫=四川料理
      • 子=中国茶
        • 孫=中国茶の歴史
        • 孫=茶書
        • 孫=中国茶の種類
          • 曾孫=緑茶
        • 孫=中国の茶器
      • 子=中国酒
        • 孫=中国酒の種類
          • 曾孫=中国酒・黄酒
          • 曾孫=中国酒・白酒

    という構成だったときに、
    1.親=中国料理を表示しているときはサイドバーに全ての子・孫・曾孫のリストを
    2.子=中国茶の種類を表示しているときはサイドバーに子=中国茶に属する孫・曾孫のリストを
    表示したいのです。
    現状だと、孫または曾孫を表示しているときは同じ子に属するページ一覧が表示されるのでOKなのですが、子=中国茶を表示しているときは、親=中国料理に属する全ての子・孫・曾孫が表示されてしまいます。
    わかりにくいかもしれませんが、どうぞよろしくお願いします。

    ごめんなさい。自分の書いた方法では親ページしか出力されませんね(pageID個別の指定なので)
    includeで取りあえず親だけ出力して、child_ofで子を書き出す必要がありました。

    で、えっと、再び書いていただいた内容は最初にご質問された内容と全く違いませんか?^^;
    kayamoriさんの書かれているコードは、見ているページの親の子をだけを表示させるものです。

    A , A-a1 , A-a1-1 , A-A1-2 , A-a2 , A-a3
    B , B-b1 , B-b1-1 , B-b1-2 , B-b2 , B-b3

    という構成だったとしてAやA-a1-1、A-a2を表示したとき、「A-a1 , A-a1-1 , A-A1-2 , A-a2 , A-a3」が出力される、という動作のものです。
    ですので全ての子ページが1つの親に所属していたら、当然全ての子が表示されます。

    最初の書き方では最上位の親が複数あるように書かれていましたが…

    やりたいことはわかりましたので、ちょっと考えてみますね。
    その間に少しお答えいただきたいことがあります。

    1.なぜそのような表示がしたいのですか?

    2.書かれた例以外に最上位の親は複数ありますか? なければ何故全てのページを1つの親にまとめようとするのですか?

    よろしくおねがいします。

    やはりこちら
    http://ja.forums.wordpress.org/topic/1056?replies=10#post-4587
    に書かれていたことが応用できました。

    基本的な手順は上記の質問を参考にしてください。

    fanction.phpに追記

    function ps_get_root_page( $cur_post, $cnt = 0 ) {
    	if ( $cnt > 100 ) { return false; }
    	$cnt++;
    	$post_temp = get_post( $cur_post->post_parent );
    	if ( $cur_post->post_parent == 0 ) {
    		$root_page = $cur_post;
    	} elseif ( $post_temp->post_parent == 0 ) {
    		$root_page = $cur_post;
    	} else {
    		$root_page = ps_get_root_page( get_post( $cur_post->post_parent ), $cnt );
    	}
    	return $root_page;
    }

    以下同様。

    そして、テンプレート内で
    wp_list_pages("title_li=&child_of=$root_page->ID" );
    とすることで現在表示しているページの第二階層(子)のサブページのみリスト化します。

    具体的には、孫=中国の茶器を表示しているとき、
    孫=中国茶の歴史、孫=茶書、孫=中国茶の種類、曾孫=緑茶、孫=中国の茶器
    という内容のリストが表示されます。

    子=中国茶が表示されないのはパラメーター(child_of)の性質上仕方ありません。
    既にroot_page->IDで子=中国茶のIDが取得できているので、それでなんとか出来ると思います。
    (子=中国茶のタイトルとパーマリンクをこのIDで取得してHTML化したものを上記のリストの先頭に追加すればよいかと)

    #そのように記述した場合、親ページを表示しているときも問題なく親、子、孫…のリストが出力されます。
    #親以下のページは出力されませんので、「親を表示しているときは全てのページを出力したい」だとか、また違うことをしたいなら都度条件分岐させてくださいな。

    nawokiさん
    ご丁寧な説明、ありがとうございます!
    やりたいことは、最初の質問内容の通りです。2回目の質問内容は、親の1つをピックアップしたため、2つの質問内容が違っているようになってしまいました。変な書き方をしてしまってすみません・・・。

    ご質問に関する回答が遅くなりましたが、
    1.なぜそのような表示がしたいのですか?
     A:最上位の親が10以上あり、それぞれの親に子が10以上、孫が10以上・・・・とページコンテンツが大量にあるため、各親ページではその親に属する子・孫・曾孫のみ表示させたかったためです。同様に各子ページでもその子に属する孫・曾孫のみ表示させたかった、というわけです。

    2.書かれた例以外に最上位の親は複数ありますか? なければ何故全てのページを1つの親にまとめようとするのですか?
     A:問1の答えのとおり、書いた例以外の親が複数あります。

    なるへそです。なっとくです。やはりそっちでしたか。
    (テーマによっては上部に表示される)メニューバーに表示される項目を少なくしたい、というだけの理由なら別の方法もアリかなとは思ったのですが。

    やりたいことは、最初の質問内容の通りです。2回目の質問内容は、親の1つをピックアップしたため、2つの質問内容が違っているようになってしまいました。

    と、言うことは、表示されているページ以下の階層のみ列挙できればよいのですか?
    自分の読解力不足でした、非常に申し訳ありません。

    それでしたら私が一つ前に書いたコードだとかなり余計な動作をしてますね。
    記述しなければいけないことも多いですし…。

    質問時にkayamoriが提示されたコードは何度かこちらでも試しましたが、
    たしかに指摘されたような動作をしています。

    しかし、

    現状だと、孫または曾孫を表示しているときは同じ子に属するページ一覧が表示されるのでOKなのですが、子=中国茶を表示しているときは、親=中国料理に属する全ての子・孫・曾孫が表示されてしまいます。

    これですが、孫(曾孫)を表示していても、同じ階層の深さにある孫(曾孫)がリスト化されていませんか?
    子を表示すると同じ階層の深さにある子がリスト化されるため、『親=中国料理に属する全ての子・孫・曾孫が表示されてしま』うのですが、それは孫(曾孫)にも言えるハズです。

    話を戻しますが、
    現在表示されているページ以下の階層のみリスト化したいのでしたら、めちゃくちゃ簡単です。

    kayamoriさんのコードをそのまま使うとしたらこうなります

    <?php
    	global $wp_query;
    	$page_id = $wp_query->post->ID;
    
    	if(wp_list_pages("title_li=&child_of=$parent&echo=0" )): ?>
    <div id="submenu">
    <ul class="lifestream">
    <?php wp_list_pages("title_li=&child_of=$page_id" ); ?>
    </ul>
    </div>
    <?php endif; ?>

    nawoki さん

    返信が遅くなりまして、すみません。

    教えていただいた方法で解決致しました!!
    本当にありがとうございました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「サイドバーに子ページのリストをカスタマイズして表示したい」には新たに返信することはできません。