カスタムメニューが設定されているかの判定に加え、項目が空かどうかも判定する分岐処理

  • 更新日:
  • 公開日:

カスタムメニューが設定されているかの判定、そして項目が空かどうかも判定する分岐処理について。

カスタムメニューの設定の有無は、WordPressが用意している関数has_nav_menu()を使えば判定できます。例えば以下のようにカスタムメニューを設定している場合、

register_nav_menus( array(
 'primary' => ' プライマリーメニュー',
 'footer' => 'フッターメニュー'
) );

プライマリーメニューが設定されているかどうかを判定するにはこのように記述します。

<?php if( has_nav_menu('primary') ) : ?>
 <p>プライマリーメニューは設定されています。</p>
<?php else : ?>
 <p>プライマリーメニューは設定されていません。</p>
<?php endif; ?>

 メニュー項目の有無を判定

カスタムメニューに項目が設定されているかどうかを判定する関数は、WordPressでは用意されていません(多分)。

そこで、この「項目が有るのか、無いのか」を判定してくれる関数を用意してくれた方がいるのでありがたく使わせていただきましょう。こちらのWordPressフォーラムで公開してあります。

まず、関数を使えるようにするためfunctions.phpにソースコードを追記します。

function is_active_nav_menu($location){
    if(has_nav_menu($location)){
        
        $locations = get_nav_menu_locations();
        $menu = wp_get_nav_menu_items($locations[$location]);
        
        if(!empty($menu)){
            return true;
        }
    }
    
    return false;
}

これをfunctions.phpに記述しておけば以下のように使って項目の有無まで判定できます。

<?php if( is_active_nav_menu('primary') ) : ?>
 <p>プライマリーメニューは設定されています。</p>
<?php else : ?>
 <p>プライマリーメニューの設定、もしくは項目の登録がされていません。</p>
<?php endif; ?>

ただ、もう少し細かく分岐処理したくなる場合もあると思います。例えば

  1. メニューは設定されている
  2. メニューは設定されているが、項目は空
  3. メニューは設定されていない

という3つの条件で振り分けたい、など。その場合は上記2つの関数を組み合わせて使いましょう。以下に例を示します。

<?php if( has_nav_menu('primary') ) : ?>
    
    <?php if(is_active_nav_menu( 'primary' )) : ?>
        
        <p>メニューは設定されている</p>
    
    <?php else : ?>
        
        <p>メニューは設定されているが、項目は空</p>
    
    <?php endif; ?>

<?php else : ?>
    
    <p>メニューは設定されていない</p>

<?php endif; ?>

以上です。


is_active_nav_menu()をちょっと改良し、引数で3つの条件を振り分けた方が判定の重複が無くなって良いかもしれません。

書いた人

Symbol Mark

Ryoichi(しつ)

除菌ティッシュを買い込んで使いきれずによく乾かす人。

療養目的で退職し、どうやって生きていくか模索中。最近は勉強目的でLaravelやVue.js弄ったり、趣味で音で遊んでます。

※2019年10月16日現在ブログリニューアル中です。崩れなどが発生していたらすみません。

うぇぶ: @s_ryone