walk_nav_menu_tree()

walk_nav_menu_tree()
目次

walk_nav_menu_tree()とは?

walk_nav_menu_tree() は、WordPress のナビゲーションメニューの内部処理において重要な役割を果たす関数であり、wp_nav_menu() でメニューを表示する際の「階層構造のツリー化(ツリー状に展開されたHTML出力)」を実現するために使用されます。

walk_nav_menu_tree()の基本概要

walk_nav_menu_tree()の関数定義

walk_nav_menu_tree( $items, $depth, $r )

walk_nav_menu_tree()の引数

引数内容
$itemsWP_Post オブジェクトの配列(メニューアイテム)
$depthメニューの階層深度(0で無制限)
$rwp_nav_menu() から渡される引数($args)の加工版

この関数の主な目的は、ナビゲーションメニューの配列(ツリー構造になっていない状態)を、Walker_Nav_Menu クラスを使って階層構造の HTML として出力することです。

walk_nav_menu_tree()の役割と動作の流れ

wp_nav_menu() を呼び出すと、内部で次のような処理が行われます。

  1. メニューの登録・取得
  2. メニューアイテム($items)を取得(これは1次元配列)
  3. walk_nav_menu_tree() を実行して、Walker_Nav_Menu による再帰的なHTML生成を実施
  4. 生成されたHTMLが wp_nav_menu() の戻り値または echo で出力される

つまり、walk_nav_menu_tree() は「メニューアイテムの配列 → ネスト構造のHTML出力」への変換を行う重要なステップです。

Walker クラスとの関係

この関数は内部で Walker_Nav_Menu クラスの walk() メソッドを呼び出します。

$walker = (!empty($args->walker)) ? $args->walker : new Walker_Nav_Menu;
return $walker->walk( $items, $depth, $args );

この walk() メソッドによって以下の順に処理されます。

  • start_lvl()(リスト開始)
  • start_el()(リストアイテム開始)
  • end_el()(リストアイテム終了)
  • end_lvl()(リスト終了)

このように、ツリー構造の再帰的レンダリング処理の中心は Walker クラスですが、それをトリガーする関数が walk_nav_menu_tree() なのです。

walk_nav_menu_tree()の使用される場面

開発者が直接 walk_nav_menu_tree() を使うことは少なく、主に以下のような場面で自動的に呼び出されます。

  • wp_nav_menu()
  • wp_get_nav_menu_items()(メニューアイテムを取得後にカスタム出力をしたい場合)
  • custom_walker を利用して独自のメニューHTMLを構築したいとき

ただし、wp_nav_menu() を使わずにカスタムな出力を作る際には、自分で walk_nav_menu_tree() を呼び出すケースもあります。

walk_nav_menu_tree()の使用例(独自出力)

たとえば、特定のメニューだけを独自形式で出力したい場合:

$menu_items = wp_get_nav_menu_items('main-menu');

$args = (object) array(
    'walker' => new Walker_Nav_Menu(), // またはカスタムWalker
    'theme_location' => 'main-menu',
);

echo walk_nav_menu_tree( $menu_items, 0, $args );

depth の役割

depth に数値を渡すことで、どの階層までHTMLを出力するかを制御できます。

  • 0: 全階層を出力(デフォルト)
  • 1: 第1階層(トップレベル)のみ出力
  • 2: 第2階層まで出力(サブメニューまで)

たとえばドロップダウンメニューを作りたいときは depth => 2 にすることで、親と子の階層まで対応できます。

カスタムWalkerとの組み合わせ

wp_nav_menu()walk_nav_menu_tree() に独自の walker クラスを渡すことで、自由な HTML 構造を作成できます。

class My_Custom_Walker extends Walker_Nav_Menu {
    function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
        $output .= '<li class="custom-item">' . $item->title . '</li>';
    }
}

使用例:

$args = (object) array(
    'walker' => new My_Custom_Walker(),
);
echo walk_nav_menu_tree( $menu_items, 0, $args );

walk_nav_menu_tree()の出力のカスタマイズが必要なケース

  • <ul> タグを使わず <div> でメニューを出力したい
  • クラス名や属性を動的に付与したい
  • アイコンや説明文を追加したい
  • Bootstrap や Foundation といった CSS フレームワークと連携したい

上記のような要件では、walk_nav_menu_tree() と独自 Walker を組み合わせることが有効です。

walk_nav_menu_tree()のよくある誤解

walk_nav_menu_tree() を使えば自動的に階層になる」

誤解です。
$items がすでに適切な menu_ordermenu_item_parent を持っている必要があります。これらは通常、wp_get_nav_menu_items() で取得すると正しく整列されています。

「walker を使わないと深い階層は出力できない」

誤解です。
デフォルトの Walker_Nav_Menu でも、depth を指定すれば階層付きのHTML出力が可能です。

walk_nav_menu_tree()のまとめ

項目内容
関数名walk_nav_menu_tree()
主な目的メニュー配列を HTML の階層構造に変換
よく使われる場所wp_nav_menu() 内部、または独自メニュー出力時
関連クラスWalker_Nav_Menu、カスタムWalker
注意点$items が正しくソート・親子関係を持っている必要あり

walk_nav_menu_tree() は WordPress のメニューシステムにおける基礎的かつ重要な関数であり、メニューの階層構造の出力処理を担っています。通常は wp_nav_menu() に任せておけば問題ありませんが、より高度なカスタマイズを行う場合には、この関数の仕組みと役割を理解しておくことが不可欠です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

初めてホームページを作成したのは1996年。
2000年よりフリーランスで主に中小企業、学校、各種公的団体、個人事業主のWordPressを活用したホームページ制作を行っています。WordPressテーマはそれぞれのクライアントに合わせて作成しています。
WordPressを活用したサイト運営のための情報発信をしていきます。

目次