ここはちょっと見せられない

ぜったいぜったい見せられない

すでに登録してあるカスタムメニューをばらして使いたい

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>";
    }
}


まだバグ取りしないとあかんなーと思いつつ、メモとして上げておく。
しょうもないことなんだけどね。作っておくと使えるんだよ。
タダの少量のテキスト処理ならそうそう重たくならないしな。