
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()の引数
引数 | 内容 |
---|---|
$items | WP_Post オブジェクトの配列(メニューアイテム) |
$depth | メニューの階層深度(0 で無制限) |
$r | wp_nav_menu() から渡される引数($args )の加工版 |
この関数の主な目的は、ナビゲーションメニューの配列(ツリー構造になっていない状態)を、Walker_Nav_Menu
クラスを使って階層構造の HTML として出力することです。
walk_nav_menu_tree()の役割と動作の流れ
wp_nav_menu()
を呼び出すと、内部で次のような処理が行われます。
- メニューの登録・取得
- メニューアイテム(
$items
)を取得(これは1次元配列) walk_nav_menu_tree()
を実行して、Walker_Nav_Menu
による再帰的なHTML生成を実施- 生成された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_order
や menu_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()
に任せておけば問題ありませんが、より高度なカスタマイズを行う場合には、この関数の仕組みと役割を理解しておくことが不可欠です。