ページ上のカスタムフィールドに対応してメニューを設定しています。つまり、カスタムフィールド=> 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フックについて十分に知りません。
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';
}