WordPressで特定のカスタムメニューに追加されているリンクの個数を取得する方法

すごく細かいことなんですが、WordPressの特定カスタムメニューに追加されているリンクの個数を取得したくなりました。

文章だけで表現することがあまりうまくないので、画像付きでどんなことがやりたいのかを以下に書きました。

やりたいこと

例えば、WordPressの管理画面から「外観」→「メニュー」のページを開きます。

wpnavmenucount00

メニューのページでは、下の画像のようにメニュー構造に「3つ」のリンクが追加されていて、メニュー設定では「Global Nav」にチェックが入っているとします。

wpnavmenucount04

このメニュー構造にあるリンクの個数「3」を取得する方法です。

以下のコードで取得できます。

<?php
$menu_object = wp_get_nav_menu_object( ’グローバルナビ’ ); //ナビゲーションの情報取得
echo $menu_object->count; //リンクの個数を表示

コードがやっていること

wp_get_nav_menu_object」を使ってナビゲーションに関する情報を取得して「$menu_object」に格納しています。「$menu_object」に格納されている値の中から「$menu_object->count」で個数を取得、表示しています。

「wp_get_nav_menu_object」の引数にはメニューの名前、スラッグ、IDを指定することができます。上のコードでは名前を指定しました。

応用編:実際の運用を想定して取得しよう

上で紹介した方法で取得できることはわかったけど、メニューの名前は今後の運用次第で変わるかもしれないです。

例えばWordPressで作られたある企業のWebサイトがあったとして、運用はそこで働くスタッフさんが行うとします。

Webに詳しい方なら「グローバルナビ」という文言で「どの位置にあるどのリンクのことなのか」を想像しやすいと思いますが、そうではないこともあります。(「グローバルナビ」はまだまだ浸透していません)

『「グローバルナビ」という名前はパッと見てもどの部分のことなのかわからなくなることがある。なので「ヘッダーメニュー」や「一番上のメニュー」などとした方が意味が通じやすい』ということもあります。スタッフさん側で好きに変えられたほうがいいですね。

実際の運用では、可能な限り柔軟に対応できるようにしておくことが重要だと私は考えていて、メニューの名前は自由に入れられるようにしたほうがいいと判断しています。

メニューの名前を変えることによってスラッグも変わるし、IDもカスタムメニューを追加するタイミングによって違うことが想定されます。よって「wp_get_nav_menu_object」の引数はメニューの名前、スラッグ、IDに依存しないように指定できた方がいいですね。

というわけで、いい方法がCodexに掲載されていますのでご紹介します。ロケーション名から取得する方法です。

ロケーション名から取得する

<?php
$menu_name = 'global_nav'; //ロケーション名を入れる
$locations = get_nav_menu_locations();
$menu_id = $locations[ $menu_name ]; //メニューIDを取得する
$menu_object = wp_get_nav_menu_object($menu_id); //引数にメニューIDを指定して情報を取得する
echo $menu_object->count; //リンクの個数を表示

ロケーション名はどの値を入れるの?

上のコードで指定した「ロケーション名」は「register_nav_menu」で指定したロケーション名を使えばOKです。

<?php
add_action( 'after_setup_theme', 'register_nav' );
function register_nav() {
 register_nav_menu( 'global_nav', 'Global Nav' ); //「global_nav」がロケーション名
}

まとめ

ちょっとしたことですが、WordPressの特定カスタムメニューに追加されているリンクの個数を取得することによってまたやれることが広がりました。

もし同じようなことをされたい場合は、ご参考くださいますと嬉しいです。

著者:bouya Imamura