WordPress 导航菜单

Aug 28th, 2008 Add Comment

导航菜单早已 "深入民心", 在博客上的应用日益重要且多样. 从本文开始, 我将开展几个关于 WordPress 导航菜单的话题, 讨论如何在 WordPress 上使用和加强导航菜单, 话题间有一定的承接关系, 难度也会逐步增加.

WordPress 菜单栏

WordPress 上的导航菜单一般有两种, 页面导航菜单和分类导航菜单.
可曾记得? WordPress 是可以撰写独立页面的, 页面导航菜单就是以首页和各个独立页面组成的菜单. 而分类导航菜单则是以首页和各个分类组成的菜单.

这是效果演示

相关话题:

WordPress 导航菜单
二级导航菜单
淡出淡入导航菜单
滚动导航菜单
多级导航菜单
jQuery 导航菜单
点选式导航菜单 (待定话题)

作业分析:

既然菜单由首页和独立页面列表或首页和分类列表所组成, 我们就需要处理两个环节, 即首页菜单项和其他菜单项.
另外, 我们还需要处理菜单项的三个状态, 即一般状态, 当前菜单项状态 (如: 在首页中, 首页菜单项就是当前菜单项) 和选中菜单项状态.
也就是说, 我们共需要处理 3 个事情:
1. 首页外的其他菜单项
2. 首页菜单项
3. 菜单项处于不同状态时的视觉效果

预想结构:

<div id="menubar">
	<ul class="menus">
		<li class="..."><a href="http://.../">Home</a></li>
		<li class="..."><a href="http://.../">菜单项1</a></li>
		<li class="..."><a href="http://.../">菜单项2</a></li>
		<li class="..."><a href="http://.../">菜单项3</a></li>
		...
	</ul>
</div>

页面导航菜单:

1. 独立页面列表作为菜单项
调用 wp_list_pages 获取独立页面列表, 并使用以下参数:
depth: 列表深度(层的最大数量), 本文讨论的是一级菜单, 故最大深度为 1
title_li: 标题字符串, 这里不需要, 设为 0
sort_column: 列表项的排序方式, 根据创建页面时所设定的 order 进行升序排列
打印独立页面菜单项的语句是:

<?php wp_list_pages('depth=1&title_li=0&sort_column=menu_order'); ?>

2. 首页菜单项
由于一般独立页面的 class 是 page_item, 当前独立页面的 class 是 current_page_item. 当页面是首页时, 首页菜单项的 class 应该是 current_page_item, 其他情况则是 page_item. 为此, 我们需要一段分支代码来为它确定 class:

<?php
 
// 如果是首页, class 是 current_page_item
if (is_home()) {
	$home_menu_class = 'current_page_item';
// 如果不是首页, class 是 page_item
} else {
	$home_menu_class = 'page_item';
}
 
?>

打印首页菜单项的语句是:

<li class="<?php echo($home_menu_class); ?>">
	<a title="Home" href="<?php echo get_settings('home'); ?>/">Home</a>
</li>

3. 菜单的样式
这是一个从普遍到特殊的处理过程, 一般菜单项的样式放前面, 当前和选中菜单项的样式放在后面, 当后者条件满足就会覆盖前者的样式, 从而改变外观.

/* 菜单项 */
#menubar ul.menus li {
	float:left; /* 靠左浮动 */
	list-style:none; /* 清空列表风格 */
	margin-right:1px; /* 右侧的间隔 */
}
/* 菜单项链接 */
#menubar ul.menus li a {
	padding:5px 10px; /* 内边距 */
	display:block; /* 显示为块 */
	color:#FFF; /* 文字颜色 */
	background:#67ACE5; /* 背景颜色 */
	text-decoration:none; /* 没有下横线 */
}
/* 当前菜单项链接 */
#menubar ul.menus li.current_page_item a {
	background:#5495CD; /* 背景颜色 */
}
/* 选中菜单项链接 */
#menubar ul.menus li a:hover {
	background:#4281B7; /* 背景颜色 */
}

分类导航菜单:

1. 分类列表作为菜单项
调用方法 wp_list_categories 获取分类列表, 并使用以下参数:
depth: 列表深度(层的最大数量), 本文讨论的是一级菜单, 故最大深度为 1
title_li: 标题字符串, 这里不需要, 设为 0
orderby: 列表项的排序方式, 根据创建页面时所设定的 order 进行升序排列
show_count: 是否显示该分类的文章数量, 这里不需要显示, 设为 0
打印分类菜单项的语句是:

<?php wp_list_categories('depth=1&title_li=0&orderby=name&show_count=0'); ?>

2. 首页菜单项
与页面导航菜单相似, 只是菜单项的 class 有所不同.
page_item 更改为 cat-item
current_page_item 更改为 current-cat

3. 菜单的样式
因为菜单项的 class 略有不同, 所以也需稍作修改.
current_page_item 更改为 current-cat

演示主题:

以 WordPress 自带主题 default 为基础, 仅做学习参考使用, 修改过的文件有 header.phpstyle.css
主题已包含了页面导航菜单和分类导航菜单两个菜单栏. 为了演示方便, 我使用了 class="menubar" 来定义两个菜单栏的样式. 而正式使用只有一个菜单栏, 用 id 定义更为合适.

下载主题: default_with_menubar.zip

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 导航菜单

  1. http://0.gravatar.com/avatar/8b75ff08c58b106d7bc748919816093f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    恩,我就是修改自己的导航了

  2. http://1.gravatar.com/avatar/573b17b5f5ba8f2b149a2eb09f400f7b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    谢谢 终于改好了~ 以前一直错位 一直以为改CSS会有用,在我的主题下 CSS 一点作用都不起

  3. http://0.gravatar.com/avatar/02e0955acb8652bd7bbaf4a24108118f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    when I do as the lecture,I did realise the effect. I hope the code be more thorough。

    thanks a lot

  4. http://1.gravatar.com/avatar/3859d4c103e0df8025b189e4ccfbb095?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不懂,不懂...哭啊..

  5. http://1.gravatar.com/avatar/52795c6ff05bbe2ed7b788fa40afdeef?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  6. http://1.gravatar.com/avatar/72244829c26239f60d641ef187e67a5f?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不解啊,不了解

  7. http://1.gravatar.com/avatar/120985980aed2dae7ed33f51bce2796f?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    在我的导航菜单上,既有分类目录,又有页面

    请问,怎么让分类目录在页面的前面?

  8. http://0.gravatar.com/avatar/692e6ea87b8ff831741e4eec6e5e9d3c?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请教下,为什么我的分类导航,首页、独立页面可以打开,就是点击各文章类别链接的时候,都跳转到首页了。很奇怪,请大侠帮忙

  9. http://1.gravatar.com/avatar/78c8159a7efa323517813c32800542f9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    恩了解了,中时谢谢你的主题。

  10. http://0.gravatar.com/avatar/ec969907721d00820c79d3f336d119e4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不是很多 但觉得很有用 :grin:

  11. http://1.gravatar.com/avatar/be1061d4192e6fd9348ca0b2a31eefc3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    非常感谢你的这个教程。呵呵。终于实现了一直梦寐以求的效果

  12. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @meimei
    我没用过inove主题,这个里面有,方法差不多你试一下吧:http://www.pp2008.cn/article.asp?id=130

  13. http://0.gravatar.com/avatar/c4f4998ae98de19fd022a24d496a0af1?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Yusn
    如何做到的呢?教我一下嘛!我很想学~

  14. http://0.gravatar.com/avatar/afd691a5b24f38f35c4374603ef81dad?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    搜索引擎来到你的站,做的太漂亮了,呵呵
    讲的方式也非常棒,内容更棒,以后多来你这里学习,收藏了

  15. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @meimei
    我的就是用分类目录和页面同时做导航栏

  16. http://0.gravatar.com/avatar/c4f4998ae98de19fd022a24d496a0af1?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我也想把分类目录和页面同时做导航栏呢!
    但是改了几次,都没能成功。
    想着还别的主题的,但是看来看去还是觉得inove比较清爽。
    希望能赐教了~

  17. http://0.gravatar.com/avatar/27710f56ebd52a05282f321fdf01f9b2?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    怎么能让 分类目录和页面同时做导航栏呢??

    如果改了,又应该怎么调整顺序呢?

    谢谢

  18. http://1.gravatar.com/avatar/5bf27ac440190fb4f76591858214a044?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    感谢你的教学,偶是个刚接触wordpress的菜鸟,导航栏不知道怎么弄~

  19. http://0.gravatar.com/avatar/62215f244e698248889b5f9dd4344f7b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    It's great; thanks a lot!

  20. http://1.gravatar.com/avatar/dd1548bf6eb6a7e7c65c73ba125d31ec?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    非常感谢你的这个教程。呵呵。终于实现了一直梦寐以求的效果

  21. http://0.gravatar.com/avatar/a8c9ee0c5f6dd237e0d1e03e69435f49?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵不错 学了,不过现在比较忙 我对wordpress还没有什么研究呢,等看看水煮鱼那些入了门先.

  22. http://0.gravatar.com/avatar/8c3cce7bd5c29882a513c43f594a0146?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    落下好多天功课,大伙中秋愉快~

  23. http://1.gravatar.com/avatar/7060dfb9a4706f749898fb7b915aa5da?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    mg12 :@JAY太遗憾了, 你不是沙发.
    @schuen因人而异吧, 我习惯点击菜单...
    @Sparanoid 和 锐风是比较简单, 热身, 哈哈~可能我们理解有差异, 我认为独立文章内是不会有任何菜单项属于当前的, 只有当进入某一分类页面是才显示为当前.当然, 如果你要实现那样的效果也不是不可能, 你只需要在 single.php 追加一段 SQL 和一段 JavaScript.

    其实这并不是用不到的.
    貌似有些 Blog 就有 Sparanoid 提到的那个效果.

  24. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @JAY
    太遗憾了, 你不是沙发.

    @schuen
    因人而异吧, 我习惯点击菜单...

    @Sparanoid 和 锐风
    是比较简单, 热身, 哈哈~
    可能我们理解有差异, 我认为独立文章内是不会有任何菜单项属于当前的, 只有当进入某一分类页面是才显示为当前.
    当然, 如果你要实现那样的效果也不是不可能, 你只需要在 single.php 追加一段 SQL 和一段 JavaScript.

  25. http://1.gravatar.com/avatar/1ab7771533ddeb86579da0a1026321f8?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    谢谢分享。但是我觉得修改源代码也就可以了呀。

  26. http://1.gravatar.com/avatar/7060dfb9a4706f749898fb7b915aa5da?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Sparanoid:
    这个貌似过于简单了,虽然有 current-cat 样式但是在打开 "current-cat" 下的文章后当前分类的链接也没有点亮,同样的在这篇文章下,导航栏上连一个点亮的链接都没有了(应该是 Archive 被点亮)

    这个我不清楚该怎么实现.
    我想过这个问题.

    强大的 mg12 同志来解答下?

  27. http://1.gravatar.com/avatar/b9c316ffd440c795e1e5d19dbf113af4?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个貌似过于简单了,虽然有 current-cat 样式但是在打开 "current-cat" 下的文章后当前分类的链接也没有点亮,同样的在这篇文章下,导航栏上连一个点亮的链接都没有了(应该是 Archive 被点亮)

  28. http://1.gravatar.com/avatar/fde0757be8a88680aab75bb52d2fbd90?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  29. http://1.gravatar.com/avatar/7060dfb9a4706f749898fb7b915aa5da?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    确实哈.
    米啥难度.

  30. http://1.gravatar.com/avatar/7c9412d8d9386b950a3ebfe8bfedc053?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    menu被点几率不大

  31. http://1.gravatar.com/avatar/10e5731d1a8aed7f69f55e9f6dbc92d7?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    沙个发先

    话说这个要是做多级的话,和主题的设计依赖性挺大的,不太好通用哟~

  32. http://1.gravatar.com/avatar/5b51abed6fb3f0b29e9c5559f84666c4?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  1. Loading...