やるきなし

2016/05/03 05:48 / WordPress Twenty Sixteen wp_nav_menu

Twenty Twelve とか Twenty Thirteen ぐらいだと,Menu を手動で作成していない状態だと,自動で Menu を生成してくれたような気がするのだが,Twenty Sixteen だと上手くいかない.結局うまく行かないという話なのだが,以下調べた内容.

Twenty Twelve だと wp_nav_menu() location が1箇所,Twenty Sixteenは2箇所.

[wp-content/themes/twentytwelve/functions.php]
register_nav_menu( 'primary', __( 'Primary Menu', 'twentytwelve' ) );

[wp-content/themes/twentysixteen/functions.php]
register_nav_menus( array(
    'primary' => __( 'Primary Menu', 'twentysixteen' ),
    'social'  => __( 'Social Links Menu', 'twentysixteen' ),
) );

適当に以下をすれば(子テーマの function.php に書いておく) Twenty Sixteen の wp_nav_menu() location を1つ(primary)のみにできて,wp-admin/nav-menus.php を開いた時でメニューが存在しない場合に$one_theme_location_no_menus がアサートされて,自動でメニューのテンプレートが作成される(保存はされない).でもこれは比較的どうでもいい.

function remove_social() {
    unregister_nav_menu( 'social' );
}
add_action( 'after_setup_theme', 'remove_social' , 20);

header.phpから呼ばれるwp_nav_menu() (nav-menu-template.php) でメニューを表示するのだが,メニューを作っていない状態だとfallback_cbのwp_page_menu() (post-template.php)が呼び出される.これがメニューを自動で作る部分で,以下のファイルを開いてみたりすると確認できる(wp_nav_menu を wp_page_menu に置き換えたりしてみる).

[test.php]
<?php
require_once( dirname(__FILE__) . '/wp-load.php' );
wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );

メニューを作っていない状態だとやはり Twenty Sixteen ではメニューが表示されない.これは header.php で if ( has_nav_menu( 'primary' ) ) という条件付で wp_nav_menu() が呼び出されるから.ということで,header.php を修正して無理やり wp_nav_menu() を呼び出してみると,メニューは自動で生成されるが,手動で作成したメニューと体裁が異なる(右側に縦積みになってしまう).

手動で作ったメニュー(通常のメニュー)の場合<div class="menu-menu-1-container"> として生成されるが,wp_page_menu() が生成するのは<div class="nav-menu"> で,これで見た目が違ってくるらしい.あまりthemeをいじりたくないので,仕方なく手動でメニューを生成することにして,項目が多くなってきたらなにがしかpluginを導入するしかなさげ.