Wordpress の機能のひとつ、カスタムメニューをあちこちで有効に使うために、中身をばらして表示するための部品。
Wordpress標準関数である wp_get_nav_menu_object で得られるデータが表示する順番通りに返ってくる事を利用し、指定したタイトルからの1ツリーを表示して終了させるものを作ってみた。
1階層目にある親タイトルを基準とする。
例えば、
+ (example1) | +(example1-1) | +(example1-2) + (example2) | +(example2-1) | +(example2-2) + (example3) + (example4) : : :
指定するタイトル(example1)を渡すと、(example1-2) までを表示して終了。
これを、リストタグを使って表示させる。
テンプレート内で表示する場所に融通を聞かせたいという事と、すでに作ってあるカスタムメニューを2重登録するような面倒くさいことをしたくない。
小さい部品なので、ベタベタしてる。
データがそんなに大きくないこと、DBに問い合わせるまでもなさそうという気もして、こんなモノを作ってみた。
<?php $menu_name = "sitemap"; $menu = wp_get_nav_menu_object($menu_name); $items = wp_get_nav_menu_items($menu->term_id); ?> <ul><?php my_menu_tree($items,"(カスタムメニューに入れた名称)"); ?></ul>
function my_menu_tree($items, $title) { $flg = 0; $dep = array(); $bkpid = 0; $skip = 0; $liopen = 0; $ulopen = 0; $depth = 0; foreach ($items as $item) { // 指定titleまで飛ばす if ($title != $item->title && $skip == 0) { continue; } if ($title == $item->title) $skip = 1; $pid = $item->menu_item_parent; // 1tree 表示したら終了 if ($pid == 0 && $flg == 1) break; if ($pid == 0 && $flg == 0) $flg = 1; if ($bkpid != $pid ) { if (! isset($dep[$pid])) { echo "<ul>\n"; $ulopen = 1; $liopen = 0; $depth++; $dep[$pid] = $depth; } else { $depth--; echo "</ul>\n"; $ulopen = 0; $liopen = 1; unset($dep[$bkpid]); if ($dep[$pid] > $depth) { $n = $depth - $dep[$pid]; for ($i=0;$i<$n;$i++) { echo "</ul>\n"; if ($key = array_search($n,$dep) != false ) { unset($dep[$key]); } } } } } if ($liopen == 1) { echo "</li>\n"; $liopen = 0; } echo "<li>"; $liopen = 1; if ($pid == 0) echo "<h1>"; echo "<a href='".$item->url."'>".strip_tags($item->title)."</a>\n"; if ($pid == 0) echo "</h1>"; $bkpid = $pid; } foreach($dep as $flg) { echo "</li></ul>"; } }
まだバグ取りしないとあかんなーと思いつつ、メモとして上げておく。
しょうもないことなんだけどね。作っておくと使えるんだよ。
タダの少量のテキスト処理ならそうそう重たくならないしな。