主题里的导航,不是写死在代码里的,而是分两步:
这样换菜单不用改代码,在后台点几下就行。
在 functions.php 里:
register_nav_menu( 'zhudaohang', '网站的顶部导航' );
两个参数:
zhudaohang:位置的“代号”,代码里用它来指定;网站的顶部导航:后台显示的名字,给人看的。注册完,后台“外观 → 菜单”里就会出现“显示位置:网站的顶部导航”这个选项。
如果需要多个菜单位置(顶部一个、底部一个),用 register_nav_menus()(复数):
register_nav_menus( array(
'zhudaohang' => '顶部导航',
'footer' => '底部导航',
) );
在 header.php 里:
wp_nav_menu( array(
'theme_location' => 'zhudaohang',
'container' => false,
'items_wrap' => '%3$s',
) );
三个参数:
theme_location:用哪个位置(就是前面注册的代号);container:外面要不要包一层 div(false 表示不包);items_wrap:菜单项外面包什么(默认是 <ul>%3$s</ul>)。看它的 header.php,导航是这样的:
<ul class="h nav navbar-nav">
<?php wp_nav_menu( array(
'theme_location' => 'zhudaohang',
'container' => 'false',
'items_wrap' => '%3$s',
) ); ?>
</ul>
注意:外面已经有一个 <ul class="h nav navbar-nav"> 了,所以 wp_nav_menu 不能再输出一个 <ul>——否则就是“ul 套 ul”。
'items_wrap' => '%3$s' 的意思就是:只输出菜单项,不包 ul。这样菜单项直接落在外面那个 ul 里,结构合法。
如果你不写这一行,WordPress 会输出 `
`,套在已有的 ul 里,就是非法的嵌套。
进后台“外观 → 菜单”:
如果主题注册了位置,但后台没配菜单,wp_nav_menu 会输出一个默认的“页面列表”。所以有时候你看到导航里莫名其妙出现所有页面,就是没配菜单。
一句话记住:register_nav_menu 注册位置(functions.php),wp_nav_menu 输出菜单(header.php),后台负责填内容。
下一篇讲导航的“当前项高亮”和多级菜单。