导航菜单(上):register_nav_menu 与 wp_nav_menu

作者: admin 分类: wordpress主题制作教程 发布时间: 2026-11-06 18:33

导航是怎么“长”出来的

主题里的导航,不是写死在代码里的,而是分两步:

  1. 主题里“注册一个位置”(告诉 WordPress:我这里可以放菜单);
  2. 后台里“往这个位置填菜单”(自己勾选哪些页面/分类)。

这样换菜单不用改代码,在后台点几下就行。

第一步:注册位置

在 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>)。

caogenbj 为什么要写 items_wrap

看它的 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 里,就是非法的嵌套。

后台怎么配

进后台“外观 → 菜单”:

  1. 新建一个菜单;
  2. 左边勾选要放进去的页面、分类、自定义链接;
  3. 底部“显示位置”勾上“网站的顶部导航”;
  4. 保存。

如果主题注册了位置,但后台没配菜单,wp_nav_menu 会输出一个默认的“页面列表”。所以有时候你看到导航里莫名其妙出现所有页面,就是没配菜单。

小结

一句话记住:register_nav_menu 注册位置(functions.php),wp_nav_menu 输出菜单(header.php),后台负责填内容。

下一篇讲导航的“当前项高亮”和多级菜单。

本系列导航

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Powered by 草根站长笔记 © 2015-2026 草根站长笔记 Inc.版权所有,禁止转载