欢迎访问 夜阑小雨 我的学习碎片档案,这里记录了我的学习内容和工作中经验,希望给您带去帮助。

WordPress 3.0 导航菜单 (开发篇)

营销分析 夜阑小雨 1167℃ 0评论

WordPress 导航菜单的使用篇中, 已经介绍过 WP 3.0 导航菜单这一新功能. 在老版本的 WordPress 上, 页面列表和分类列表一直被用作导航菜单, 现在引入该功能, 我们应该怎样选择或者兼容两者呢? 本文将更加深入, 在代码层面继续发掘其更多特性. 在看到这些特性之后, 或许能勾起你的一些头绪.

关于导航菜单的使用方法, 请查看使用篇的介绍, 本文将侧重于主题开发.

用法

在主题调用导航菜单, 方法很简单. 只需加入以下语句在页面上输出菜单.

<?php wp_nav_menu(); ?>

但其实这个方法提供了很多可配置的参数, 下面我们逐一描述.

参数

参数列表来自 WordPress Codex, 下面逐一翻译, 并对不易理解的参数进行详细说明.

$menu

(字符串)(可选) 期望显示的菜单; 接受 (按顺序匹配的) id, slug, name

默认值: None

我们看一下 WordPress 取菜单的方法. 就像 Codex 上的描述一样, 它是按 id, slug, name 的顺序去取的.

function wp_get_nav_menu_object( $menu ) {
	// 没有提供参数, 返回空
	if ( ! $menu )
		return false;   // 根据 id 找
	$menu_obj = get_term( $menu, 'nav_menu' );   // 如果找不到, 根据 slug 来找
	if ( ! $menu_obj )
		$menu_obj = get_term_by( 'slug', $menu, 'nav_menu' );   // 如果还找不到, 再根据 name 来找
	if ( ! $menu_obj )
		$menu_obj = get_term_by( 'name', $menu, 'nav_menu' );   // 最终没找到, 返回空
	if ( ! $menu_obj )
		$menu_obj = false;   return $menu_obj;
}

$container

(字符串)(可选) ul 父节点的标签类型

默认值: div

千万不要以为什么标签都可以使用, 事实上只有 div 和 nav 会被采用, 如果输入别的值, ul 父节点的标签将不会显示, 可见 Codex 的描述不够详尽. (从另一个角度看, WordPress 使用 nav 标签说明它正在提升对 HTML5 的支持力度.)

1
2
// 被允许使用的标签只有 div 和 nav
$allowed_tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) );

$container_class

(字符串)(可选) ul 父节点的 class 属性值

默认值: menu-{menu slug}-container

$container_id

(字符串)(可选) ul 父节点的 id 属性值

默认值: None

$menu_class

(字符串)(可选) ul 节点的 class 属性值

默认值: menu

$menu_id

(字符串)(可选) ul 节点的 id 属性值

默认值: menu slug, 自增长的

$echo

(布尔型)(可选) 决定直接显示菜单还是返回 HTML 片段

默认值: true (直接显示)

$fallback_cb

(字符串)(可选) 如果菜单不存在, 调用的回调函数

默认值: wp_page_menu (显示页面列表作为菜单)

这是一个很重要的方法, 可以通过它去兼容老版本主题. 下面我们看看代码. 关键是 $args 也被传入 call_user_func 中. 例如, 我们将参数 ‘sort_column’=>’menu_order’ 写入 wp_nav_menu 的参数, 那它同样会被传到 call_user_func 方法中. 如果 call_user_func 是 wp_page_menu 方法, 那么显示的页面列表将以认为赋予的序号来排序输出.

1
2
3
4
// 如果找不到指定菜单, 或者菜单不存在任何条目并没有指定自定义菜单, 使用 call_user_func 方法来进行处理
if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
	&& ( function_exists($args->fallback_cb) || is_callable( $args->fallback_cb ) ) )
		return call_user_func( $args->fallback_cb, (array) $args );

$before

(字符串)(可选) 显示在每个菜单链接前的文本

默认值: None

$after

(字符串)(可选) 显示在每个菜单链接后的文本

默认值: None

$link_before

(字符串)(可选) 显示在每个菜单链接文本前的文本

默认值: None

$link_after

(字符串)(可选) 显示在每个菜单链接文本后的文本

默认值: None

我怀疑 Codex 对 $before 与 $link_before, $after 与 $link_after 的描述是不是倒过来了?

$depth

(整型)(可选) 显示菜单的深度, 当数值为 0 时显示所有

默认值: 0

$walker

(字符串)(可选) 自定义的遍历对象

默认值: None

$theme_locaton

(字符串)(可选) the location in the theme to be used–must be registered with register_nav_menu() in order to be selectable by the user

默认值: None

如果主题在 function.php 中登记了 3 个自定义菜单, 如下:

register_nav_menus(array('primary' => 'Primary Navigation'));
register_nav_menus(array('secondary' => 'Secondary Navigation'));
register_nav_menus(array('bottom' => 'Bottom Navigation'));

要调用 Secondary Navigation 这个导航菜单, 则可以在 header.php 文件里使用以下语句:

wp_nav_menu(array(
	'theme_location'	=>'secondary'
));

也就是说, 这是用来指定调用某个自定义菜单的.

转载请注明:夜阑小雨 » WordPress 3.0 导航菜单 (开发篇)

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 没认真看,先A走,回家慢慢欣赏,嘿嘿
    Cheap MBT Shoes2010-07-27 23:53 回复