web-dev-qa-db-ja.com

メニューが空かどうか確認してください。

ページ上のカスタムフィールドに対応してメニューを設定しています。つまり、カスタムフィールド=> MenuNameの下の3ページにmenu1、menu2、およびmenu3があります。 functions.phpの下に私は持っています:

/* Add Menu Locations */
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
    register_nav_menus(
        array(
            'one-menu' => __('menu1'),
            'two-menu' => __('menu2'),
            'three-menu' => __('menu3'),
            'footerBlocka' => __('Footer Block 1'),
            'footerBlockb' => __('Footer Block 2'),
            'footerBlockc' => __('Footer Block 3'),
            'footerBlockd' => __('Footer Block 5')
        )
    );
}

それから私のページテンプレートで私は持っています:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

A)メニューが存在し、b)メニューに実際にメニュー項目が含まれている限り、これは問題なく動作します。メニューは存在するがメニュー項目がない場合は、サイト上のすべてのメニューからすべてのメニュー項目のリストが奇妙に表示されます。メニューが存在しない場合は、functions.phpにリストされている次のメニューが表示されるだけです。

それで私は私のページテンプレートで私はメニューをチェックする必要があると思います、そしてそれが存在するならばメニューを印刷します。他にもいくつか例を見てきましたが、テーマ領域が存在するのか、メニューが存在するのかがわかります。私は'menu' => get_post_meta( $post->ID, 'MenuName', true),を使ってメニューを動的に呼び出すので、メニューを印刷する前にこの動的メニューをチェックする方法がわかりません。

それでは'menu' => get_post_meta( $post->ID, 'MenuName', true),から呼び出されたメニューをチェックして、それが存在していてメニュー項目を持っているならそれを印刷し、そうでなければ何も印刷しないのですか?

編集:私は以下を試してみました:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'fallback_cb' => false,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

この新しい追加はまだfunctions.php関数からインラインで次のメニューをレンダリングするでしょう。したがって、menu3が存在しない場合は、footerBlockaメニューが印刷されます。私の目標は、MenuNameカスタムフィールドのページIDが存在する場合はそれをチェックし、次にメニューが存在しリンクがあるかどうかをチェックすることです。trueの場合はメニューを印刷します。何かのようなもの:

$menu = get_post_meta($post->ID, 'MenuName');
if($menu){
  if([wp_nav_menu == $menu AND has links]){
      wp_nav_menu(array(...));
  }
}

それが私が必要とすると思う疑似コードです、しかし、私はそれが必要であるものを知るためにWordPressフックについて十分に知りません。

4
o_O

wp_nav_menuには引数fallback_cbがあります。これは、メニューが存在しない場合に呼び出される関数です。これはデフォルトでwp_page_menuに設定されています。そのため、メニューが存在しない場合はページのリストが表示されます。明示的にfalseに設定した場合、メニューが存在しなければ何も出力されません。

編集 -

メニュー名を指定すると、 wp_get_nav_menu_object を使用してメニューオブジェクトをロードできます。これが存在するかどうか、そのIDが何であるか(menu引数として渡すため)、そしてそれがいくつのメニュー項目を持っているかを教えてくれます。

$menu_name = get_post_meta( $post->ID, 'MenuName', true );
$menu = wp_get_nav_menu_object( $menu_name );
if( is_object( $menu ) ){
    echo 'This menu exists!';
    echo 'This menu has ' . $menu->count . ' menu items.';
    echo 'This menu ID is ' . $menu->term_id . '.';
} else {
    echo 'A menu with that name doesn\'t exist';
}
4
Milo