• 解決済 nobuzoh

    (@nobuzoh)


    独自のテーマに
    ヘッダー用のメニュー(header_nav)と
    フッター用のメニュー(footer_nav)を登録し、
    それぞれwp_nav_menuで表示しています。

    header_nav、footer_navともにカテゴリや固定ページなどが含まれています。
    また、どちらもメニュー上の階層は1階層しかありません。
    (もちろん実際は小カテゴリやページがぶら下がっています)
    これは、メニューの編集のみ管理者である私が行い、
    その下のカテゴリやページの追加は誰にでもできるようにと意図しています。

    現在、
    header_navにはpage_a、category_x、category_y、page_bがこの順で登録されており、
    footer_navにはpage_c、category_zがこの順で登録されているとします。

    ここで、内容が自動生成されるサイトマップページを作成したいと思ったのですが、
    1.header_nav、footer_navの順で第一階層表示する
    2.誰かが追加した小カテゴリも階層表示する
    と、これだけの条件を満たす方法が分からずに困っています。
    言葉では伝わり難いかもしれないので、イメージとしては、

    ・page_a
    ・category_x
      |-category_x_1
        |   |_ category_x_1_1
        |_ category_x_2
    ・category_y
      |- category_y_1
      |_ category_y_2
            |_ category_y_2_1
    ・page_b
    ・page_c
    ・category_z
      |_ category_x_1
            |_ category_z_1_1
                |_ category_z_1_1_1

    といった感じで、
    私としては単純なことをやりたいだけなのですが、
    PS Auto Sitemapのようなプラグインを試してもうまくいきませんでした。
    どうすれば実現できるでしょうか?

    ご教授ねがいます。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • wp_nav_menu タグを使えば、メニューを表示することができますが、header_nav と footer_nav を並べて表示するとなると、全体を括る nav タグや ul タグが邪魔になります。

    これは、テンプレートタグのパラメーターの指定で回避できます。

    <?php wp_nav_menu( array( 'theme_location' => 'header_nav', 'container' => false, 'items_wrap' => '%3$s', 'fallback_cb' => false ) ); ?>

    これに加えて、子カテゴリーの自動的にカテゴリーが増えるようにしなければなりません。
    これには、walker_nav_menu_start_el というフックを使って、表示するメニューがカテゴリーだったら、wp_list_categories タグを用いて、子カテゴリーのリストを取得して追加すれば実現できます。

    functions.php

    function add_child_cat_menu( $item_output, $item ) {
    	if ( $item->object == 'category' ) {
    		$child_cat_list = wp_list_categories( 'title_li=&hide_empty=0&show_option_none=&echo=0&parent=' . $item->object_id );
    		if ( $child_cat_list ) {
    			$item_output .= '<ul>' . $child_cat_list . '</ul>';
    		}
    	}
    	return $item_output;
    }

    ただし、add_filter を functions.php に記述してしまうと、ナビゲーションメニューにも影響してしまうため、サイトマップ表示の前後で、add_filterによるフックの追加、表示後に remove_filter でフックの除去を行う必要があります。

    サイトマップ用テンプレートの記述サンプル

    <ul class="sitemap">
    <?php
    add_filter( 'walker_nav_menu_start_el', 'add_child_cat_menu', 10, 2 );
    wp_nav_menu( array( 'theme_location' => 'header_nav', 'container' => false, 'items_wrap' => '%3$s', 'fallback_cb' => false ) );
    wp_nav_menu( array( 'theme_location' => 'footer_nav', 'container' => false, 'items_wrap' => '%3$s', 'fallback_cb' => false ) );
    remove_filter( 'walker_nav_menu_start_el', 'add_child_cat_menu', 10, 2 );
    ?>
    </ul>

    トピック投稿者 nobuzoh

    (@nobuzoh)

    jim912さま

    提示していただいたサンプルでほぼ完璧に表示されました!

    ただ、カテゴリーが2階層目までしか表示されなかったので、
    wp_list_categoriesのパラメータをチェックしたところ、
    日本語codexにはparentというパラメータは確認できませんでした。
    そこでこのparentをchild_ofに変更したところうまく3階層目以降も表示されるようになしました。
    (この対応がまずいようでしたらご指摘願います)

    これで悩みは解決しました!ありがとうございます!!

    フックについては私にとってはまだ未知の領域で正直チンプンカンプンなので、
    これから勉強しようと思います。
    理解できれば更に幅が広がりそうですね。

2件の返信を表示中 - 1 - 2件目 (全2件中)

トピック「メニューからサイトマップを作成したい」には新たに返信することはできません。