本文是《WordPress主题开发从入门到精通》系列教程的第四篇。我们将学习如何在主题中注册菜单位置,并在前台调用显示,让网站导航活起来。
到现在为止,我们的网站导航还只能通过点击Logo返回首页。这显然不够用。一个专业的网站必须有清晰的导航菜单,让用户能轻松找到重要页面,比如“关于我们”、“联系我们”、“博客”等。
今天,我们就来让我们的主题支持可自定义的导航菜单。
从“死链接”到“活菜单”的转变
在传统HTML网站中,导航菜单是直接写在代码里的“死链接”:
<nav>
<a href="/">首页</a>
<a href="/about.html">关于我们</a>
<a href="/contact.html">联系我们</a>
</nav>
这种方式有个大问题:每次增加或修改页面,都需要手动修改代码,然后重新上传文件。
而WordPress的菜单系统是动态的、活的。你可以在后台自由地:
- 添加、删除、拖拽排序菜单项
- 创建多级下拉菜单
- 将菜单分配给主题的不同位置(如顶部菜单、页脚菜单)
- 无需修改代码,改动立即生效
这就是我们要实现的目标。
第一步:在主题中注册菜单位置
首先,我们需要告诉WordPress:“我的主题支持菜单功能,并且我在这里预留了一个位置用来显示菜单”。
这个“告知”的过程,叫做注册菜单位置。我们在主题的functions.php文件中完成这个操作。
在主题根目录创建(或编辑)functions.php文件,添加以下代码:
<?php
// 主题功能初始化
function my_first_theme_setup() {
// 注册一个导航菜单位置
register_nav_menus( array(
'primary' => __( '主导航菜单', 'my-first-theme' ),
) );
}
add_action( 'after_setup_theme', 'my_first_theme_setup' );
代码解释:
register_nav_menus():这个函数用于注册一个或多个菜单位置。它接收一个数组作为参数。'primary':这是菜单位置的标识符(slug),在代码中调用菜单时会用到。你可以自定义,如'header_menu'。__( '主导航菜单', 'my-first-theme' ):这是菜单位置在后台显示的名称。__()函数用于国际化(多语言翻译),第二个参数'my-first-theme'需要与style.css中定义的Text Domain一致。
如果你需要多个菜单位置,比如还需要一个页脚菜单,可以这样写:
register_nav_menus( array(
'primary' => __( '主导航菜单', 'my-first-theme' ),
'footer' => __( '页脚菜单', 'my-first-theme' ),
) );
保存functions.php文件后,进入WordPress后台,看看“外观”下是不是多了一个“菜单”选项?
第二步:在后台创建并分配菜单
现在我们去后台实际操作一下:
- 进入 外观 > 菜单
- 点击“创建新菜单”,给它起个名字,比如“主导航”
- 从左侧选择要添加的页面(比如首页、关于我们),点击“添加到菜单”
- 可以通过拖拽调整菜单项的顺序和层级(拖到右边一点可以创建下拉菜单)
- 最重要的一步:在“显示位置”处,勾选我们刚刚注册的“主导航菜单”
- 点击“保存菜单”
至此,菜单数据已经准备好了。下一步就是在前台主题中把它显示出来。
第三步:在主题模板中调用显示菜单
菜单创建好了,我们需要在主题的相应位置“调用”它。通常主导航菜单放在站头header.php里比较合适。
打开header.php文件,在.site-header部分添加菜单的调用代码:
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<?php
if (is_front_page() || is_home()) {
bloginfo('name');
} else {
echo wp_title('') . ' | ' . get_bloginfo('name');
}
?>
</title>
<link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<header class="site-header">
<div class="header-inner">
<!-- 网站Logo和标题 -->
<div class="site-branding">
<h1 class="site-title">
<a href="<?php echo esc_url(home_url('/')); ?>">
<?php bloginfo('name'); ?>
</a>
</h1>
<p class="site-description"><?php bloginfo('description'); ?></p>
</div>
<!-- 主导航菜单 -->
<nav class="main-navigation">
<?php
wp_nav_menu( array(
'theme_location' => 'primary', // 对应注册的菜单位置标识
'menu_class' => 'primary-menu',
'container' => false, // 不包裹外层容器
'fallback_cb' => false, // 如果菜单不存在,不显示回退内容
) );
?>
</nav>
</div>
</header>
wp_nav_menu()函数参数说明:
'theme_location' => 'primary':指定要显示哪个注册的菜单位置。'menu_class' => 'primary-menu':给菜单的<ul>元素添加一个CSS类名。'container' => false:默认情况下,WordPress会用<div>包裹菜单,这里设为false表示不需要。'fallback_cb' => false:如果指定位置没有分配菜单,什么都不显示。如果设为wp_page_menu,则会自动显示一个页面列表作为回退。
现在刷新你的网站前台,应该能看到菜单已经显示出来了!不过可能没有样式,看起来就是普通的链接列表。
第四步:为菜单添加CSS样式
没有样式的菜单缺乏美感。我们来为菜单添加一些基础CSS样式,让它看起来更像一个水平导航栏。
将以下CSS代码添加到style.css文件中:
/* 主导航菜单样式 */
.main-navigation {
margin-top: 1rem;
}
.primary-menu {
display: flex;
list-style: none;
margin: 0;
padding: 0;
gap: 2rem; /* 菜单项之间的间距 */
}
.primary-menu li {
margin: 0;
position: relative;
}
.primary-menu a {
color: #333;
text-decoration: none;
padding: 0.5rem 1rem;
border-radius: 3px;
transition: all 0.3s ease;
font-weight: 500;
}
.primary-menu a:hover {
background-color: #f8f9fa;
color: #007cba;
}
/* 当前页面菜单项高亮 */
.primary-menu .current-menu-item > a {
background-color: #007cba;
color: white;
}
/* 下拉子菜单样式 */
.primary-menu .sub-menu {
display: none;
position: absolute;
top: 100%;
left: 0;
background: white;
min-width: 200px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
list-style: none;
padding: 0.5rem 0;
z-index: 999;
}
.primary-menu li:hover .sub-menu {
display: block;
}
.primary-menu .sub-menu a {
display: block;
padding: 0.75rem 1rem;
}
.primary-menu .sub-menu a:hover {
background-color: #f8f9fa;
}
/* 响应式设计:小屏幕下菜单垂直排列 */
@media (max-width: 768px) {
.primary-menu {
flex-direction: column;
gap: 0.5rem;
}
.primary-menu .sub-menu {
position: static;
box-shadow: none;
}
}
同时,我们也需要调整一下header的布局,让Logo和菜单并排显示:
/* 头部布局调整 */
.header-inner {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
.site-branding {
flex: 1;
}
.main-navigation {
flex: 0 0 auto;
}
/* 移动端头部布局 */
@media (max-width: 768px) {
.header-inner {
flex-direction: column;
text-align: center;
}
.main-navigation {
margin-top: 1rem;
width: 100%;
}
.primary-menu {
justify-content: center;
}
}
现在刷新页面,你应该能看到一个漂亮的水平导航菜单了。尝试悬停在有子菜单的项上,下拉菜单也应该能正常显示。
高级技巧:为菜单项添加图标或描述
WordPress的菜单系统很强大,你甚至可以为菜单项添加自定义字段,比如图标或描述。这需要通过functions.php添加支持:
// 为菜单项添加自定义字段
function my_first_theme_menu_item_custom_fields( $item_id, $item ) {
?>
<div style="clear: both;">
<label for="menu-item-icon-<?php echo $item_id; ?>">
菜单图标(CSS类名)<br>
<input type="text" id="menu-item-icon-<?php echo $item_id; ?>"
name="menu-item-icon[<?php echo $item_id; ?>]"
value="<?php echo esc_attr( get_post_meta( $item_id, '_menu_item_icon', true ) ); ?>" />
</label>
</div>
<?php
}
add_action( 'wp_nav_menu_item_custom_fields', 'my_first_theme_menu_item_custom_fields', 10, 2 );
// 保存菜单项自定义字段
function my_first_theme_save_menu_item_custom_fields( $menu_id, $menu_item_db_id ) {
if ( isset( $_POST['menu-item-icon'][$menu_item_db_id] ) ) {
update_post_meta( $menu_item_db_id, '_menu_item_icon', sanitize_text_field( $_POST['menu-item-icon'][$menu_item_db_id] ) );
}
}
add_action( 'wp_update_nav_menu_item', 'my_first_theme_save_menu_item_custom_fields', 10, 2 );
总结与实践建议
恭喜!你现在已经成功为你的主题添加了完整的菜单功能。让我们回顾一下关键步骤:
- 注册菜单位置:在
functions.php中使用register_nav_menus() - 后台创建菜单:在WordPress后台创建菜单并分配到位置
- 前台调用菜单:在模板中使用
wp_nav_menu()显示菜单 - 添加样式:用CSS美化菜单外观
最佳实践建议:
- 始终为
wp_nav_menu()设置'fallback_cb' => false,避免显示不期望的内容 - 使用语义化的CSS类名,如
main-navigation而不是简单的nav - 一定要做移动端响应式适配
- 考虑无障碍访问,为菜单添加适当的ARIA属性
现在你的网站导航已经活起来了!在下一篇文章中,我们将深入探讨WordPress主题的函数文件(functions.php),学习如何通过它来添加更多强大功能,比如启用文章缩略图、侧边栏等。

评论框