WordPress ナビゲーションメニュー(カスタムメニュー)
柔軟なメニューの出力を可能にする WordPress のナビゲーションメニュー(カスタムメニュー)機能について。register_nav_menus() を使った登録方法や wp_nav_menu() を使ったメニューの出力方法、管理画面でのメニューの作成方法などについて。
更新日:2022年03月13日
作成日:2019年03月31日
ナビゲーションメニュー
WordPress のナビゲーションメニューは、テーマのメニューを管理画面から動的に表示できるようにする機能です。
ナビゲーションメニューはカスタムメニューやカスタムナビゲーションメニューとも呼ばれます。
ナビゲーションメニューの機能を使うと管理画面でメニュー項目を追加したり、それらの表示順を変更したり階層関係をつけたり等メニューを柔軟に管理することができます。
また、メニューは複数設置することができ、テンプレートファイルの表示したい位置に関数を記述すればメニューを表示することができます。
但し、デフォルトではこの機能は有効になっていないので、functions.php にナビゲーションメニューを有効化または登録する以下のいずれかの関数を使って機能を有効化する必要があります。
- add_theme_support():パラメータに 'menus' を指定してナビゲーションメニューを有効化
- register_nav_menu():1つのナビゲーションメニューを登録(及び有効化)
- register_nav_menus():複数のナビゲーションメニューを登録(及び有効化)
※ ここでは register_nav_menu() または register_nav_menus() を使ってナビゲーションメニューを登録して利用する方法について解説しています。
テーマでナビゲーションメニューを有効化していないと以下のように管理画面の「外観」をクリックしてもその下に「メニュー」の項目がまだありません。
有効化または登録すると管理画面の「外観」に「メニュー」の項目が追加されます。
概要
作成するテーマでナビゲーションメニューを利用するためのおおまかな流れは以下のようになります。
-
register_nav_menu() または register_nav_menus() を functions.php に記述してナビゲーションメニューを有効化及び登録します。
以下は「メニューの位置」の識別子がそれぞれ 'main-menu'、'footer-menu' の2つのナビゲーションメニューを有効化及び登録する例です。
「メニューの位置」の識別子は登録したナビゲーションメニューと管理画面で作成するメニュー(表示されるメニュー)を関連付けるものです。
//functions.php function register_my_menus() { register_nav_menus( array( //複数のナビゲーションメニューを登録する関数 //'「メニューの位置」の識別子' => 'メニューの説明の文字列', 'main-menu' => 'Main Menu', 'footer-menu' => 'Footer Menu', ) ); } add_action( 'after_setup_theme', 'register_my_menus' );
詳細は「ナビゲーションメニューの登録」をご覧ください。
-
ナビゲーションメニューを登録すると管理画面の「外観」に「メニュー」の項目が追加されるので以下のような手順でメニューを作成します。
- 「メニュー名」を付けて作成
- 「メニューの位置」を指定して登録したナビゲーションメニューと作成するメニューを関連付け
- メニュー構造(表示されるメニュー項目)を設定
詳細は「メニューの作成」をご覧ください。
-
wp_nav_menu() をテンプレートファイルに記述してメニューを表示します。
<!-- テンプレートファイルのメニューを表示したい場所に記述 --> <?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>
詳細は「ナビゲーションメニューの出力」をご覧ください。
以下は詳細です。
ナビゲーションメニューの登録(有効化)
作成するテーマでナビゲーションメニュー機能を使えるようにするには、register_nav_menu() または register_nav_menus() を使ってナビゲーションメニューを登録します。
register_nav_menu() と register_nav_menus() の違いは、前者はメニューを1つ(ずつ)登録するのに対し後者は一度に複数のメニューを登録することができることです。関数名の最後の menu の部分が単数形か複数形で異なります。
register_nav_menu() または register_nav_menus() を functions.php に記述してナビゲーションメニューを登録します。
//1つのメニューを登録する場合 register_nav_menu( 'main-menu','Main Menu'); //複数のメニューを登録する場合 register_nav_menus( array( 'global' => 'Global Menu', 'footer-menu' => 'Footer Menu', ) );
以下は register_nav_menu() 及び register_nav_menus() の詳細です。
register_nav_menu
ナビゲーションメニューを1つ登録・有効化する関数です。
アクションフックに登録しなくても動作しますが、通常は after_setup_theme アクションフックのタイミングで実行するようにします。
この関数は内部で add_theme_support( 'menus' ) を実行してメニュー機能を有効化しているので、add_theme_support() を別途実行する必要はありません。
register_nav_menu( $location, $description )
- パラメータ
-
- $location(文字列):(必須)「メニューの位置」の識別子を半角英数字で指定。
「メニューの位置」はメニューを作成する際の管理画面での設定項目です。
また、メニューを表示する関数 wp_nav_menu() の引数のキー 'theme_location' に指定する値にもなります。 - $description(文字列):(必須)メニューの説明のための文字列(日本語可)。
管理画面「外観」→「メニュー」での「メニューの位置」に表示される名前(説明)の文字列。(メニュー作成後に表示されます)
- $location(文字列):(必須)「メニューの位置」の識別子を半角英数字で指定。
- 戻り値
- なし
以下がこの関数の定義(ソース)ですが、register_nav_menus() に1つの引数を指定して実行しているだけです。
//register_nav_menu() のソース(定義) function register_nav_menu( $location, $description ) { register_nav_menus( array( $location => $description ) ); }
つまり、以下の2つは同じことです。
register_nav_menu( 'main-menu','Main Menu'); register_nav_menus( array('main-menu' => 'Main Menu') );
また、以下の2つも同じことです。
function register_my_menu() { register_nav_menu( 'main-menu','Main Menu'); register_nav_menu( 'footer-menu','Footer Menu'); } add_action( 'after_setup_theme', 'register_my_menu' ); function register_my_menus() { register_nav_menus( array( 'main-menu' => 'Main Menu', 'footer-menu' => 'Footer Menu', ) ); } add_action( 'after_setup_theme', 'register_my_menus' );
以下はメニューの位置の識別子を 'main-menu'、メニューの説明のための文字列を 'Main Menu' とした1つのナビゲーションメニューを登録する例です。
function register_my_menu() { register_nav_menu( 'main-menu','Main Menu'); } add_action( 'after_setup_theme', 'register_my_menu' );
上記を functions.php に記述すると、管理画面「外観」に「メニュー」が追加されます。
以下はメニュー作成前の時点でのスクリーンショットです。
メニューに名前を付けてメニューを保存すると「メニューの位置」など「メニュー設定」の項目が表示されます。
register_nav_menus
一度に複数のナビゲーションメニューを登録・有効化する関数です(1つだけ登録することもできます)。functions.php に記述します。
アクションフックに登録しなくても動作しますが、通常は after_setup_theme アクションフックのタイミングで実行するようにします。
この関数は内部で add_theme_support( 'menus' ) を実行してメニュー機能を有効化しているので、add_theme_support() を別途実行する必要はありません。
register_nav_menus( $locations )
- パラメータ
- $locations(配列):(必須)以下のような連想配列(キーと値のペア)でそれぞれのナビゲーションメニューの「メニューの位置」の情報を指定します。
-
- キー:「メニューの位置」の識別子になる文字列を半角英数字で指定。
「メニューの位置」はメニューを作成する際の管理画面での設定項目です。
また、メニューを表示する関数 wp_nav_menu() の引数のキー 'theme_location' に指定する値でもあります。 - 値:メニューの説明のための文字列(日本語可)。
管理画面「外観」→「メニュー」での「メニューの位置」に表示される名前(説明)の文字列。(メニュー作成後に表示されます)
- キー:「メニューの位置」の識別子になる文字列を半角英数字で指定。
-
register_nav_menus( array( //各メニューの「メニューの位置」の情報をキーと値のペアで指定 'キー(メニューの位置の識別子)' => '値(メニューの位置に表示される文字列)', 'キー' => '値', ... ) ); //3つのナビゲーションメニューを登録する例 register_nav_menus( array( 'main-menu' => 'メインメニュー', 'footer-menu' => 'フッターメニュー', 'side-menu' => 'サイドメニュー', ) );
- 戻り値
- なし
以下がこの関数の定義(ソース)です。
add_theme_support( 'menus' )が実行され、グローバル変数 $_wp_registered_nav_menus に PHP 関数 array_merge() を使ってパラメータで指定した各メニューの「メニューの位置」の情報の配列($locations)が追加されています。
//register_nav_menus() のソース(定義) function register_nav_menus( $locations = array() ) { global $_wp_registered_nav_menus; add_theme_support( 'menus' ); $_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations ); }
以下は次のような2つのナビゲーションメニューを有効化及び登録する例です。
- 1つめのナビゲーションメニュー
- メニューの位置の識別子:'main-menu'
- メニューの説明のための文字列: 'Main Menu'
- 2つめのナビゲーションメニュー
- メニューの位置の識別子:'footer-menu'
- メニューの説明のための文字列: 'Footer Menu'
function register_my_menus() { register_nav_menus( array( 'main-menu' => 'Main Menu', 'footer-menu' => 'Footer Menu', ) ); } add_action( 'after_setup_theme', 'register_my_menus' );
上記を functions.php に記述すると、管理画面「外観」に「メニュー」が追加されます。
以下はメニュー作成前の時点でのスクリーンショットです。
メニューに名前を付けてメニューを保存すると「メニューの位置」など「メニュー設定」の項目が表示されます。
メニューの作成
ナビゲーションメニューを登録しただけでは実際に表示されるメニュー(及びその内容)は作成されないので、登録したナビゲーションメニューに対応するメニューを管理画面で作成する必要があります。
この例では既にメニューに表示する固定ページやカテゴリーが作成済みであることを前提にしています。
また、この例では以下のように register_nav_menus() を使って2つのナビゲーションメニューを登録してあります。
//functions.php function register_my_menus() { register_nav_menus( array( 'main-menu' => 'Main Menu', 'footer-menu' => 'Footer Menu', ) ); } add_action( 'after_setup_theme', 'register_my_menus' );
2つのナビゲーションメニューを登録する際に指定したパラメータは以下の通りです。
- 1つめのナビゲーションメニュー
- 「メニューの位置」の識別子: 'main-menu'
- 「メニューの位置」に表示される名前(説明): 'Main Menu'
- 2つめのナビゲーションメニュー
- 「メニューの位置」の識別子: 'footer-menu'
- 「メニューの位置」に表示される名前(説明): 'Footer Menu'
メニュー作成の流れは以下のようになります。
- 名前を付けてメニューを作成(メニュー名を付けて作成)
- 作成したメニューと登録したメニューを「メニューの位置」で関連付け(メニューの位置)
- 作成したメニューの構造(表示する内容)を設定(メニュー構造)
メニュー名を付けて作成
管理画面「外観」→「メニュー」で登録したナビゲーションメニューに対応するメニューを作成します。
「メニュー名」にメニューの名前(任意)を入力して「メニューを作成」をクリックします。
「メニュー名」はメニューを出力する関数 wp_nav_menu() のパラメータの1つ「menu」の値(メニューを指定する識別子)として使われます。
また、「メニュー名」はデフォルトで出力されるメニューの HTML 要素の ID やクラス名として使用されるので半角英数字で指定しておくと良いと思います(ID やクラス名は wp_nav_menu() のパラメータで変更することができます)。
この例では1つめのメニューに「main」と言うメニュー名を付けて作成します。
ナビゲーションメニューの登録方法によっては、初回のメニュー作成時に以下のように「メニュー名」に「Menu 1」や「メニュー構造」にメニュー項目などがすでに表示されている場合がありますが、これらは変更することができます。
メニューの位置
「メニュー名」を付けて作成したメニューと functions.php で登録したナビゲーションメニューの関連付けを行います。
メニューを作成後、作成したメニューがどの登録したナビゲーションメニューなのかを「メニューの位置」で指定します。
「メニューの位置」には、登録の際に register_nav_menus() のパラメータで指定した名前(メニューの説明のための文字列)が表示されています(この例では「Main Menu」と「Footer Menu」)。
現在設定しているメニューと登録したナビゲーションメニューとを関連付けさせるために「メニューの位置」の対象のチェックボックスにチェックを入れます。
この例では「Main Menu」にチェックを入れて、メニュー(main)とナビゲーションメニュー(Main Menu)を関連付けます。
「メニューを保存」をクリックして設定を保存します。
「メニューの位置」の指定は左上の「位置の管理」タブを選択して指定することもできます。
「メニューを編集」のタブ画面では作成したメニューの「メニュー項目を追加」や「メニュー構造」などの設定をすることができますが、この例では引き続きもう1つのメニューを作成してしまいます。
新規メニューの作成は「新しいメニューを作成しましょう」をクリックします。
「メニュー名」にメニューの任意の名前(footer)を入力して「メニューを作成」をクリックします。
以下の画面が表示されるので新しく作成したメニュー(footer)の「メニューの位置」を指定(この例では Footer Menu)して「メニューを保存」をクリックします。
2つ目のメニューを作成したので、ページ上部に別のメニューを選択するためのプルダウン「編集するメニューを選択」が表示されます。
メニュー構造
作成したそれぞれのメニューで表示する項目などの出力する内容(構造)を設定します。
この例では、1つ目のメニュー(main)の設定をするので「編集するメニューを選択:」のプルダウンで「main (Main Menu)」を選んで「選択」をクリックします。
メニューで表示する項目は左側の「メニュー項目を追加」の下の「固定ページ」や「投稿」などから選択してメニューに追加します。
右上の「表示オプション」をクリックして表示される項目を指定することができます。
初期状態では表示項目の「タグ」や個別の項目の詳細オプションなどは非表示になっています。
また、最初に表示される際は以下のように「固定ページ」の「最近」のタブが選択され表示されています。
投稿やカテゴリーなどの内容を表示させるには、それぞれのタブをクリックします。
この例ではメニューにメニュー項目としてホームや固定ページ、カテゴリーへのリンクを追加します。
初期状態では固定ページの「最近」のタブが表示されているので、「全て表示」をクリックするとホームが表示されます。
「全て選択」をクリックすると全ての項目にチェックが入ります。不要な項目はチェックを外します。
「メニューに追加」をクリックするとチェックが入っている項目が「メニュー構造」に追加されます。
追加された個々の項目をカスタマイズするには右側のアイコン(▼)をクリックすると項目の詳細設定が表示されます。※ 詳細オプションを表示させるにはページ上部の「表示オプション」から指定します.
以下の例では「ホーム」となっていたナビゲーションラベルを「Home」に変更しています。
項目を削除したり移動する場合にも右側のアイコンをクリックして項目の詳細設定から行えます。
メニュー項目は上下にドラッグして(表示される)順番を入れ替えることができます。
また、メニュー項目は左右にドラッグして階層を設定することもできます。
カテゴリーなども同様の方法でメニューに追加することができます。必要に応じて項目のラベルを変更したり、項目をドラッグして表示順を入れ替えたり、階層を持たせるなどを行います。設定が完了したら「メニューを保存」をクリックして保存します。
もう1つの登録したナビゲーションメニューも同様の方法でメニュー構造を設定して保存します。
カスタムリンク
カスタムリンクを使えばサイト内のページ以外へのリンクをメニュー項目に追加することができます(ホームもカスタムリンクでできています)。
以下の場合、「Google 検索」と言う項目(リンク)がメニューに追加されます。
詳細オプション
ページ右上の「表示オプション」をクリックすると、そのページの表示オプションが表示されます。以下はメニューの編集ページのデフォルトの設定です。
チェックボックスにチェックを入れるとその項目が表示されるようになります。
例えば「タグ」にチェックを入れると、「メニュー項目を追加」の下に「タグ」の項目が表示され、追加できるようになります。
詳細メニューの設定
「詳細メニューの設定を表示」の全ての項目にチェックを入れると設定項目に「タイトル属性」や「リンクを新しいタブで開く」、「CSS class」などの項目が追加さるので、以下のような属性を指定できるようになります。
- タイトルの属性: a 要素の補足情報を示す title 属性の値(リンクにマウスオーバーすると表示される)
- リンクを新しいタブで開く: a 要素の target 属性(target="_blank")
- CSS クラス:li 要素の class 属性の値
日本語版 Codex :管理画面/外観/メニュー
メニューの切り替え
登録してあるナビゲーションメニューの数より多くメニューを作成しておいて、必要に応じて管理画面で出力するメニューを切り替えることができます。
この例では2つのナビゲーションメニューを登録しそれぞれに対応するメニュー(main と footer)を作成しましたが、更にエキストラにメニューを作成すればそのメニューに切り替えることができます。
例えば以下のような tag_list と言う名前のメニューを作成します。
作成したメニューを「位置の管理」の画面でどちらかの(または両方の)ナビゲーションメニューに指定することで、テンプレートファイルを変更せずに出力するメニューを切り替えることができます。
以下は Footer Menu に新しく作成したメニュー(tag_list)を設定する例です。
指定するメニューの項目に新しく作成したメニュー(tag_list)が追加されるので、それを選択して「変更を保存」をクリックします。
register_nav_menu() や register_nav_menus() を使ってナビゲーションメニューを登録してメニューを作成した場合、このように管理画面でメニューを切り替えることで出力するメニューを変更することができます。
これに対して、add_theme_support( 'menus' ) でナビゲーションメニューを有効化してメニューを作成した場合、出力するメニューを変更するには、テンプレートファイルのメニューの出力部分を書き換える必要があります。
add_theme_support( 'menus' ) でナビゲーションメニューを有効化した場合はメニューの作成画面で「位置の管理」のタブは表示されず、「メニューの位置」には何も表示されません。
ナビゲーションメニューの表示
ナビゲーションメニューを表示するには、テンプレートファイルのメニューを表示したい場所に wp_nav_menu() を記述します。
複数のナビゲーションメニューを有効化してある場合は、どのメニューを表示するかを「メニューの位置」や「メニュー名」の値を使って指定します。
register_nav_menu() や register_nav_menus() で(複数の)ナビゲーションメニューを登録してある場合は、'theme_location'(キー) に「メニュー位置」の値を指定します。
以下は、register_nav_menus() でパラメータの「メニューの位置」を意味する theme_location に 'main-menu' を指定して登録したナビゲーションメニューを表示する例です。
<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>
以下は出力されるメニューのマークアップの例です。
<div class="menu-main-container"> <ul id="menu-main" class="menu"> <li id="menu-item-194" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-194"> <a href="http://localhost/wp5/" aria-current="page">ホーム</a> </li> <li id="menu-item-196" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-196"> <a href="http://localhost/wp5/contact/">コンタクト</a> </li> <li id="menu-item-195" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-195"> <a href="http://localhost/wp5/about/">About</a> <ul class="sub-menu"> <li id="menu-item-197" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-197"> <a href="http://localhost/wp5/privacy-policy-2/">プライバシーポリシー</a> </li> </ul> </li> </ul> </div>
wp_nav_menu
ナビゲーションメニューを表示する関数(テンプレートタグ)です。テンプレートファイルでメニューを表示したい場所に記述します。
wp_nav_menu( $args )
- パラメータ
- $args(配列):(オプション) 以下の表のパラメータを連想配列(キーと値のペア)で指定。
(例)array( 'theme_location' => 'main-menu' )
初期値:空の配列
- 戻り値
- 通常はなし(パラメータとして「'echo'=>false」を指定した場合は結果の HTML)
キー | 値の型 | 初期値 | 内容 |
---|---|---|---|
theme_location | 文字列 | なし | register_nav_menu() や register_nav_menus() で登録した際の「メニューの位置」の識別子の値。 |
menu | 文字列 | なし | 出力するメニューの名前(メニューを作成する際に「メニュー名」で設定した名前)。add_theme_support( 'menus' ) でメニューを有効化してメニューを作成した場合に使用。※theme_location を指定した場合は、このキーは使用しない。 |
container | 文字列 | div | メニューの ul 要素を囲む要素(コンテナ)のタグ(要素)名。div または nav(HTML5)のどちらかを指定。コンテナをなしにする場合は false を指定。例: 'container' => false |
container_id | 文字列 | なし | メニューの ul 要素を囲む要素(コンテナ)に割り当てる ID。 |
container_class | 文字列 | menu-{メニュー名}-container | メニューの ul 要素を囲む要素(コンテナ)に割り当てるクラス名 |
menu_id | 文字列 | menu-{メニュー名} | メニューの ul 要素に割り当てる ID |
menu_class | 文字列 | menu | メニューの ul 要素に割り当てるクラス名 |
before | 文字列 | なし | リンクの前に出力する文字列 |
after | 文字列 | なし | リンクの後に出力する文字列 |
link_before | 文字列 | なし | リンク対象文字列の前に出力する文字列 |
link_after | 文字列 | なし | リンク対象文字列の後に出力する文字列 |
depth | 整数 | 0 | 出力するメニューの階層の上限。0 を指定すると全階層を出力 |
fallback_cb | 文字列 | wp_page_menu | メニューが存在しないときに実行する関数名 |
echo | true/false | true | false を指定すると、結果の HTML を出力せずに、戻り値として返す |
日本語版 Codex :wp_nav_menu() パラメータ
メニューの li 要素に割り当てるクラス名
上記の中にはメニューの li 要素に割り当てるクラス名を指定するパラメータはありません。
メニューの li 要素にクラス名を指定するには、メニュー作成の際に詳細メニュー設定を表示させて個別に指定します。
使用例
以下は、パラメータのキー theme_location に値「footer-menu」(登録したナビゲーションの「メニューの位置」)を指定して表示するナビゲーションメニューを特定しています。
また、表示するメニューの ul 要素を囲む要素(container)を <nav> 要素、
その ID(container_id)を「my_footer_container」、
メニューの ul 要素の ID(menu_id)を「my_footer_menu」とする例です。
初期値(デフォルトとして設定されている値)は、値を指定することで変更することができます。
wp_nav_menu( array( 'theme_location' => 'footer-menu', 'container' => 'nav', //コンテナのデフォルト <div> を <nav> に変更 'container_id' => 'my_footer_container', //コンテナの ID を指定 'menu_id' => 'my_footer_menu' //デフォルトの menu-{メニュー名} を変更 ) );
例えば、以下のような HTML としてメニューが出力されます(作成したメニューにより出力される項目は異なります)。
<nav id="my_footer_container" class="menu-footer-container"> <ul id="my_footer_menu" class="menu"> <li id="menu-item-198" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-198"> <a href="http://localhost/wp5/category/news/">お知らせ</a> </li> <li id="menu-item-199" class="my-music menu-item menu-item-type-taxonomy menu-item-object-category menu-item-199"> <a href="http://localhost/wp5/category/music/">音楽</a> </li> <li id="menu-item-200" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-200"> <a href="http://localhost/wp5/category/column/">コラム</a> </li> </ul> </nav>
メニューのスタイル
ナビゲーションメニューはメニュー項目を管理画面から動的に追加したり削除することができます。
このためスタイルでメニュー項目を固定幅を指定していると、その都度変更する必要が出てきてしまう可能性があります。
このような場合、Flexbox を使ってメニュー項目の並びを指定するとそれらの幅の変化に柔軟に対応することができます。
例えば、以下のように container に nav を指定しただけの場合は次のようなメニューのマークアップが出力されます。
<?php wp_nav_menu( array( 'theme_location' => 'main-menu', 'container' => 'nav' ) ); ?>
nav 要素と ul li 要素でマークアップされています。各要素に付与されている class 属性や id 属性はデフォルトのものですが、パラメータの指定で変更が可能です。
<nav class="menu-global-container"> <ul id="menu-global" class="menu"> <li id="menu-item-447" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-447"> <a href="http://localhost/">Home</a> </li> <li id="menu-item-443" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-440 current_page_item menu-item-443"> <a href="http://localhost/news/" aria-current="page">News</a> </li> <li id="menu-item-446" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-446"> <a href="http://localhost/contact/">コンタクト</a> </li> </ul> </nav>
以下は Flexbox を使ってナビゲーションをウィンドウ幅に合わせて伸縮させ、ナビゲーションの各項目を同じ幅にする例です(マージンやパディング、a 要素のスタイルは省略しています)。
/* ul 要素に display: flex を指定 */ nav ul { display: flex; list-style: none; } /* Flex アイテム(li 要素)に「flex-grow: 1」を指定 */ nav li { flex-grow: 1; }
以下は画面幅が640px以下の場合はメニュー項目を2列で表示し、それより大きい画面幅の場合は Flexbox で画面幅に合わせて伸縮する例です(背景色などの装飾は適当です)。
実際にはナビゲーションメニューが複数ある場合などでは、nav 要素などに id や class を指定してスタイルを区別する必要があると思います。
nav { background-color: #142E4D; } nav ul { overflow: hidden; } nav li { width: 50%; float: left; border-bottom: solid 2px #355B8E; } nav li:nth-child(odd) { border-right: solid 2px #355B8E; } nav li a { display: block; color: #B3BDF6; padding: 12px 0; } nav li a:hover { color: white; background-color: #1E81A4; } @media only screen and (min-width:641px) { nav ul { display: flex; } nav li { flex-grow: 1; float: none; border-right: solid 2px #355B8E; border-bottom: none; } nav li:last-child { border-right: none; } }
クラスを使ったスタイルの指定
ナビゲーションメニューでは自動的にコンテキストによって「メニュー項目の ID やクラス」に記載されているクラスがメニュー項目の li 要素に付与されます。
これらのクラスを使ってメニューにスタイルを設定することができます。
例えば、現在表示されているページのメニュー項目には「current-menu-item」と言うクラスが自動的に付与されます。以下のようにスタイルを指定すれば、現在のページのメニュー項目の下にアンダーラインを表示することができます。
nav li.current-menu-item a { text-decoration: underline; }
また、現在表示されている固定ページの親のメニュー項目には current_page_parent と言うクラスが付与されるので、この場合もメニュー項目の下にアンダーラインを表示するには以下のようにします。
nav li.current-menu-item a, nav li.current_page_parent a { text-decoration: underline; }
出力されるメニューの HTML
以下は、register_nav_menus() でパラメータの「メニューの位置」を意味する theme_location に main-menu を指定して登録したナビゲーションメニューを表示する例です。
<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>
以下は出力されるメニューのマークアップ(HTML)の例で、パラメータは theme_location(メニューの位置の識別子)以外は指定していないので、出力内容はデフォルトのマークアップになっています。
-
デフォルトではメニューの ul 要素を囲む要素(コンテナ)は div 要素でマークアップされます。
⇒パラメータ container で nav 要素に変更可能 -
このメニューは「main」と言う「メニュー名」で作成されているので、クラス名や ID 名に class="menu-main-container" や id="menu-main" のように「main」が使われています。
⇒パラメータ container_class や menu_id で変更可能 -
メニュー項目の「このサイトについて」と「プライバシーポリシー」にはメニューを作成する際に階層を設定してあります。そのためそれぞれの項目には以下のようなクラスが付与されています。
- 「このサイトについて」(親項目) li 要素:menu-item-has-children クラス
- 「プライバシーポリシー」(副項目) ul 要素: class="sub-menu"
-
この例は「ホーム」で出力される HTML なのでその li 要素には menu-item-home が付与され、「現在のページ」の current-menu-item や current_page_item が付与されています。
<!-- 出力されるメニューのマークアップ(HTML)の例 --> <div class="menu-main-container"><!-- コンテナ:div 要素 class=container_class --> <ul id="menu-main" class="menu"><!-- id=menu_id class=menu_class --> <li id="menu-item-194" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-194"><!-- ホーム:menu-item-home 現在表示されているページ:current-menu-item current_page_item --> <a href="http://localhost/wp5/" aria-current="page">ホーム</a> </li> <li id="menu-item-196" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-196"> <a href="http://localhost/wp5/contact/">コンタクト</a> </li> <li id="menu-item-195" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-195"><!-- 親項目 menu-item-has-children--> <a href="http://localhost/wp5/about/">このサイトについて</a> <ul class="sub-menu"><!-- 副項目 class="sub-menu" --> <li id="menu-item-197" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-197"> <a href="http://localhost/wp5/privacy-policy-2/">プライバシーポリシー</a> </li> </ul> </li> </ul> </div>
メニュー項目の ID やクラス
wp_nav_menu() で出力されるメニューの HTML に付与されるデフォルトのクラスや ID には以下のようなものがあります(一部抜粋)。
詳細は「日本語版 Codex:メニュー項目の CSSクラス」をご覧ください。
wp_nav_menu() のパラメータで変更可能なものや、メニュー作成時のメニュー項目の詳細メニューオプションで設定できるものもあります。
要素 | ID | 対応パラメータ |
---|---|---|
コンテナ(div または nav 要素) | なし(パラメータで指定可能) | container_id |
メニュー ul 要素 | menu-{メニュー名} | menu_id |
メニュー項目 li 要素 | menu-item-●●(●●はメニュー項目の ID) | なし |
※メニュー名はメニューを作成する際に設定したメニューの名前の文字列です。
メニュー項目(要素) | クラス | 対応パラメータ |
---|---|---|
コンテナ(div または nav) | menu-{メニュー名}-container | container_class |
メニュー ul 要素 | menu | menu_class |
メニュー項目 li 要素 | menu-item | なし |
メニュー項目(li 要素)の種類 | クラス |
---|---|
現在のページのメニュー項目 | current-menu-item |
現在表示されている固定ページのメニュー項目 | current_page_item |
現在のページの親メニュー項目 | current-menu-parent |
現在表示されている固定ページの親メニュー項目 | current_page_parent |
現在のページの先祖メニュー項目 | current-menu-ancestor |
現在表示されている固定ページの先祖メニュー項目 | current_page_ancestor |
フロントページのメニュー項目 | menu-item-home |
カテゴリに対応するメニュー項目 | menu-item-object-category |
タグに対応するメニュー項目 | menu-item-object-tag |
固定ページに対応するメニュー項目 | menu-item-object-page |
カスタムポストタイプやカスタム分類メニュー項目 | menu-item-object-{custom} |
対象要素 | 追加できる属性 |
---|---|
メニュー項目の li 要素 | class |
メニュー項目の a 要素 | title |
メニュー項目の a 要素 | target |