web-dev-qa-db-ja.com

メニューが存在するかどうかを確認する方法

私は現在、親ページのタイトルに基づいてナビゲーションメニューを取得しています。ページに親がない場合は、自分のタイトルになります。

global $post;
$page_title;

if ($post->post_parent) {
    $page_title = get_the_title($post->post_parent);
}  else {
    $page_title = get_the_title($post);
}

$sidebar_title = 'Sidebar - '.$page_title;
wp_nav_menu(array( 'menu' => $sidebar_title));

最初に親をチェックするのではなく、最初にページに固有のメニューがあるかどうかをチェックしたいと思います。これは私が書いたものですが、うまくいきません。

global $post;
$page_title = get_the_title($post);
$sidebar_title = 'Sidebar - '.$page_title;

if ( !wp_nav_menu(array( 'menu' => $sidebar_title, 'echo' => false )) ) {

    $page_title = get_the_title($post->post_parent);
    $sidebar_title = 'Sidebar - '.$page_title;
}

wp_nav_menu(array( 'menu' => $sidebar_title ));

TLDR:メニューが存在するかどうかをどうやって確認しますか?

3
justlemons

カスタムNavメニューが正しく実装されていると仮定します。

  1. ナビゲーションメニューテーマ位置の登録:

    register_nav_menus( array(
        'parent_page' => "Parent Page",
        'page_a' => "Page A",
        'page_b' => "Page B", //etc
    ) );
    
  2. wp_nav_menu()を正しく呼び出す:

    wp_nav_menu( array(
        'theme_location' => 'page_a'
    );
    

...次に、 has_nav_menu()条件式 を使用して、テーマロケーションにメニューが割り当てられているかどうかを判断できます。

if ( has_nav_menu( 'page_a' ) ) {
    // do something
}

あなたの特定のケースでは、あなたはそのようなことをすることができます:

if ( has_nav_menu( 'page_a' ) ) {
    wp_nav_menu( array( 'theme_location' => 'page_a' ) );
} else {
    wp_nav_menu( array( 'theme_location' => 'parent_page' ) );
}
5
Chip Bennett

私はOPと同じようなことをしていると思います。クライアント(wp adminユーザー)にMenus(WP-Admin> Appearance> Menus)を作成させます。一対一の関係。

代わりに、これらのメニューは現在のページの上位の祖先の名前に基づいて(カスタムウィジェットによって)動的に表示されます。その名前が既存のメニューの名前と一致する場合は、(htmlの前後に標準ウィジェットでラップされた)メニューを表示します。しかし、一致するものがなければ、何も出力しません。

そのため、ウィジェットの出力を開始する前に、メニューが存在するかどうかを確認する必要がありました。

$args = array(
    'menu' => $menu_name, // from top-ancestor of current page
    'echo' => 0,  // true or 0
    'theme_location' => '__fake', // fake value, to prevent display of 1st real menu
    'fallback_cb' => false  // prevent display of 1st real menu
);
$menu = wp_nav_menu( $args );
if ($menu){ 
    # output
    echo $before_widget; // Before
    echo $before_title . $title . $after_title; // Title
    echo $menu;  
    echo $after_widget; // After
}
0
tzeldin88