WordPress中制作导航菜单的PHP核心方法讲解


Posted in PHP onDecember 11, 2015

WordPress 3.0 引入导航菜单功能, 让页面的导航和链接的管理变得简单易用. WP 向用户提供了菜单管理页面和多种调用方法, 我们先来看一下一般WordPress 的导航菜单都具有哪些功能.

管理菜单页面

页面路径: Appearance > Menus
由从界面来看, 能够创建多个菜单, 并且可以向菜单中添加自定义链接, 页面链接和分类链接.

WordPress中制作导航菜单的PHP核心方法讲解

但有一点需要注意, 如果将页面链接和分类链接加入, 被带入菜单的仅是链接, 而不是页面和分类本身, 也就是说, 子页面和子分类不会成为菜单的一部分.

另外, 我们也不能在菜单中加入别的菜单, 所以这种自定义的菜单注定只存在一级. 在右边排列菜单区块中, 只要将某个菜单往右移一格, 就可以作为下级菜单. 所以是可以创建多级的.
创建菜单后, 我们就可以通过在 Widgets 页面将这些菜单添加到侧边栏上了.

WordPress中制作导航菜单的PHP核心方法讲解

登记自定义菜单

在菜单管理页面中注意到 Theme Locations 区块提示如下:

The current theme does not natively support menus, but you can use the "Custom Menu" widget to add any menus you create here to the theme's sidebar.

意思是说, 现在你的主题不支持自定义菜单, 但可以通过 Widget 的方式将自定义加到主题的侧边栏. 那如何让主题也能支持自定义菜单呢? 请将以下代码加到 function.php 中.

register_nav_menus(array(
 'primary' => 'Primary Navigation'
));

这段代码用于记录一个自定义菜单, 你可以为它选择具体的应用菜单, 其中 primary 应是唯一识别符, Primary Navigation 是菜单的名称. 可以通过这个函数为主题添加多个自定义菜单. 如果在 function.php 添加登记方法如下:

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

在菜单管理页面将会看到如下图的内容.

WordPress中制作导航菜单的PHP核心方法讲解

主题调用菜单

在主题中如何调用菜单呢? 在主题的适合位置使用方法 wp_nav_menu();, 向页面输出菜单.
方法中提供参数 theme_location, 用于指定对应的自定义菜单. 如要调用第一个菜单, 则代码如下:

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

在默认情况下如果没有定义任何菜单, 使用 wp_nav_menu 方法与 wp_list_pages (调用页面列表) 方法无异, 但效率不及后者. 所以, 如果你准备用页面列表或者分类列表作为导航菜单, 建议不要使用 wp_nav_menu.

用法

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

<?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 的支持力度.)

// 被允许使用的标签只有 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 方法, 那么显示的页面列表将以认为赋予的序号来排序输出.

// 如果找不到指定菜单, 或者菜单不存在任何条目并没有指定自定义菜单, 使用 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'
));

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

PHP 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
php 输出双引号&quot;与单引号'的方法
May 09 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP面试题之文件目录操作
Oct 15 PHP
PHP二维数组排序简单实现方法
Feb 14 PHP
PHP MYSQL简易交互式站点开发
Dec 27 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
Laravel实现ApiToken认证请求
Oct 14 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 #PHP
PHP开发中AJAX技术的简单应用
Dec 11 #PHP
基于PHP如何把汉字转化为拼音
Dec 11 #PHP
PHP异常处理Exception类
Dec 11 #PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 #PHP
PHP读取PPT文件的方法
Dec 10 #PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 #PHP
You might like
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
vue实现购物车的监听
2020/04/20 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
python进行两个表格对比的方法
2018/06/27 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
社区食品安全实施方案
2014/03/28 职场文书
计生专干事迹
2014/05/28 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书