wp_nav_menuのサブメニュークラス「sub-menu」を変更する方法
WordPressのwp_nav_menu()で出力されるコードのsub-menuクラスを任意のクラスに変更する方法をご紹介します。
wp_nav_menu()は 管理画面 > 外観 > メニューで登録されたナビゲーションメニューを表示するコードです。
//PHP
<?php wp_nav_menu(); ?>
ナビゲーションメニュー構成
- ページタイトル1
- ページタイトル2
- ページタイトル2-1
ナビゲーションメニューが上記の構成だった場合、デフォルトでは下記のHTMLが出力されます。
//出力されるHTMLコード
<div class="menu-(menu名)-container">
<ul id="menu-(menu名)" class="menu">
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-(id)">
<a href="#">ページタイトル1</a>
</li>
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-(id)">
<a href="#" aria-haspopup="true" aria-expanded="false">ページタイトル2</a>
<ul class="sub-menu">
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-(id)">
<a href="#">ページタイトル2-1</a>
</li>
</ul>
</li>
</ul>
</div>
出力コードのクラスを変更する
1番上の階層の<ul class=”menu”>の方はwp_nav_menuのパラメーター(’menu_class’)でクラスの変更ができますが、副項目(サブメニュー)の<ul class=”sub-menu”>のクラスはパラメーターから変更することはできません。
実現するには下記のように記述します。
<?php
echo str_replace('sub-menu', 'subnav subnav-drop', wp_nav_menu( array(
'echo' => false, //(真偽値) (オプション) メニューをHTML出力する(true)か、PHPの値で返す(false)か 初期値: true
) ));
?>
処理の内容は以下の通り。
- wp_nav_menu()でメニューのHTMLコードを文字列で取得
- str_replaceで、HTMLコード内の文字列「sub-menu」を「subnav subnav-drop」に置換
そうすると、以下のコードが出力されます。
<div class="menu-(menu名)-container">
<ul id="menu-(menu名)" class="menu">
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-(id)">
<a href="#">ページタイトル1</a>
</li>
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-(id)">
<a href="#" aria-haspopup="true" aria-expanded="false">ページタイトル2</a>
<ul class="subnav subnav-drop"> //←** 変更箇所 **
<li id="menu-item-(id)" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-(id)">
<a href="#">ページタイトル2-1</a>
</li>
</ul>
</li>
</ul>
</div>
雑記
wp_nav_menu()を使わず、中身をwp_get_nav_menu_items()で取得してforeachで回す形をよく使っていましたが、サブメニューのクラスだけ変更できたらな…というケースがあったので調べました。
上記はシンプルでわかりやすいものの力技です。下記URLにはフィルターを用いた方法などいくつか方法が記述されているので、興味がある方はどうぞ。
(記事の日付が古いため、参考程度が良いかと思います)
wp_nav_menuサブメニュークラス名を変更しますか?- テンプレートタグ/wp nav menu