WordPressでは、外観 > メニューでヘッダーやフッター等のナビゲーションを登録できますよね。これらを表示する時に使うのが、WordPressのテンプレートタグ「wp_nav_menu()」です。

当記事では、この関数の基本的な使い方〜カスタマイズ方法までご紹介します。記事の最後には、wp_nav_menu()の汎用性の高いパラメータを指定したテンプレを用意してますので、ぜひ参考にしてください。

ナビゲーションメニューの基本的な設定方法を知りたい方は以下をご覧ください。

wp_nav_menu()とは?

外観 > メニューで設定されたナビゲーションメニューをHTML形式で取得・出力できるWordPressのテンプレートタグです。

この関数1つでナビゲーションメニューをもとに以下のようなHTMLを自動で作成してくれるので、非常に便利です。また、引数には多くのパラメータが用意されており、その値を変えるだけで様々なカスタマイズが可能となっています。

<div class="menu-【メニュー名】-container">
  <ul id="menu-【メニュー名】" class="menu">
    <li id="menu-item-【メニュー項目ID】" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-【メニュー項目ID】">
      <a href="#">ナビゲーションラベル</a>
    </li>
    ︙
  </ul>
</div> 

wp_nav_menu()の基本的な使い方

それではナビゲーションメニューを表示するまでの基本的な流れを試してみましょう。今回は、外観 > メニューの下部に存在する「メニューの位置」にチェックを入れたナビゲーションをサイト上に表示していきたいと思います。

メニューの位置

外観 > メニューの「メニューの位置」の場所

WordPressテーマで基本とされる動きですね。この機能は以下の2ステップで実装できます。

  • 「メニューの位置」を新規登録
  • サイト上にナビゲーションを出力

「メニューの位置」を新規登録

まずは「メニューの位置」に新しく項目を登録します。これにはregister_nav_menus()を使います。

functions.phpに以下を記述して、管理画面の外観 > メニューをご覧ください。

add_action( 'after_setup_theme', function(){
  register_nav_menus( array(
  // 例 'メニューの位置を示す固有名称' => 'このメニューの位置の名称'
  'global-nav' => 'グローバルメニュー',
  ) );
} );

グローバルメニューのチェックボックスが表示されているはずです。

複数追加したい時は、引数の配列の中身を増やすことで対応できます。以下は、グローバルメニューとフッターメニュー、ドロワーメニューの3つを登録する場合の書き方です。

add_action( 'after_setup_theme', function(){
  register_nav_menus( array(
  // 例 'メニューの位置を示す固有名称' => 'このメニューの位置の名称'
  'global-nav' => 'グローバルメニュー',
  'footer-nav' => 'フッターメニュー',
  'drawer-nav' => 'ドロワーメニュー'
  ) );
} );

サイト上にナビゲーションを出力

次は、wp_nav_menu()を使って、先程登録した「global-nav」をサイト上に表示していきます。今回は「メニューの位置」の中からどれを利用するか指定できる「theme_location」だけを設定していきます。

以下の記述をheader.phpなどに記述してみて、ご確認ください。

<?php wp_nav_menu( array( 'theme_location' => 'global-nav' ) ); ?>

サイト上に外観 > メニューの「グローバルメニュー」に指定されたナビゲーションが表示されればOKです。

wp_nav_menu()のカスタマイズ

wp_nav_menu()では、引数に様々なパラメータを指定できます。以下は指定できるすべてのパラメータと初期値です。

wp_nav_menu( array(
  'menu' => '',
  'menu_class' => 'menu',
  'menu_id' => '',
  'container' => 'div',
  'container_class' => '',
  'container_id' => '',
  'container_aria_label' => '',
  'fallback_cb' => 'wp_page_menu',
  'before' => '',
  'after' => '',
  'link_before' => '',
  'link_after' => '',
  'echo' => true,
  'depth' => 0,
  'walker' => '',
  'theme_location' => '',
  'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
  'item_spacing' => 'preserve'
) );

wp_nav_menu()を使うときは、すべてのパラメータを記載する必要はありません。省略した場合は初期値が反映されますので、変更したい箇所だけ記載してあげればOKです。

以下に各パラメータについて表形式で解説してますので、ぜひ参考にしてください。

menu メニュー名やIDを指定(オブジェクトも可)
上記に基づいたナビゲーションメニューを表示
menu_class ナビゲーションのulのクラス名を指定
例)’p-global-nav’を指定すると<ul class=”p-global-nav”>
menu_id ナビゲーションのulのid名を指定
例)’js-global-nav’を指定すると<ul id=”js-global-nav”>
container ul要素を囲むHTML要素の名称を指定
例)’nav’を指定すると<nav></nav>でulを囲む
container_class containerで指定したHTML要素のclass名を指定
例)’p-global-nav-container’を指定すると<div class=”p-global-nav-container”>
container_id containerで指定したHTML要素のid名を指定
例)’js-global-nav-container’を指定すると<div id=”js-global-nav-container”>
container_aria_label containerで’nav’を指定した場合にaria-label属性を指定
例)’global menu’を指定すると<nav aria-label=”global menu”>
fallback_cb メニューが存在しな時に実行される関数名を指定
初期値のままだと固定ページの名称が一覧で表示されるため、何も表示したくない方はfalseを指定
before リンク(aタグ)の前に任意の要素を挿入可能
例)'<span class=”before”></span>’を指定すると<span class=”before”></span><a href=””>
after リンク(aタグ)の後に任意の要素を挿入可能
例)'<span class=”after”></span>’を指定すると</a><span class=”after”></span>
link_before リンクテキスト(aタグ内の文字列)の前に任意の要素を挿入可能
例)'<span class=”before”></span>’を指定すると<a href=””><span class=”before”></span>リンクテキスト</a>
link_after リンクテキスト(aタグ内の文字列)の後に任意の要素を挿入可能
例)'<span class=”after”></span>’を指定すると<a href=””>リンクテキスト<span class=”after”></span></a>
echo ナビゲーションのHTMLを出力するかどうか
出力するならtrue、変数に格納するならfalse
depth 指定した数値までナビゲーションの階層を制限する(0の場合は全階層表示)
例)2を指定すると、2階層までのナビゲーションを表示
walker 任意のwalkerクラス名を指定してWalker_Nav_Menuを拡張できる
HTML構造をかなり柔軟にカスタマイズできるが自分でカスタムウォーカークラスを定義する必要アリ
theme_location メニューの位置を指定して特定のナビゲーションを表示
冒頭で解説したオプション
items_wrap 各メニュー項目を囲むulを変更可能
%1$s:menu_id、%2$s:menu_class、%3$s:メニュー項目
item_spacing HTMLタグを改行させるかどうか
改行させたくなければ’discard‘と入力

まとめ

wp_nav_menu()を使ってナビゲーションメニューを表示する方法について解説しました。パラメータが豊富に用意されているので、ちょっとしたカスタマイズであれば、すぐに対応できるのが非常に魅力的です。

以下は、汎用性を考えてパラメータを指定したwp_nav_menuのテンプレになります。基本的なテーマ開発であれば、以下で対応できると思いますので、ぜひ使いまわしてください。

wp_nav_menu( array(
  'menu_class' => 'ulのclass名',
  'container' => 'nav',
  'container_class' => 'navのclass名',
  'fallback_cb' => false,
  'echo' => true, // 変数に格納するならfalse
  'depth' => 0, //  x階層まで制限するなら数値を入力
  'theme_location' => '登録したメニューの位置',
) );