前言
30 天 WordPress 笔记系列,主要是为了让自己习惯每天产出新的内容开始的小计划。每篇篇幅并不会相同,会根据自己的忙碌状态做调整。
为什么要理解 hook?
原因很简单:hook(以下称为「钩点」)是 WordPress 之所以能够成为市占率最高 CMS(内容管理系统)的原因。
在一开始接触 WordPress 时,可能会听过 WordPress 的强项在于「可以通过插件或主题的方式,为 WordPress 提供进阶的客制化功能。」而这些进阶的客制化功能,则是通过 钩点参与整个 WordPress 网站载入的过程。
即使你并没有打算成为插件或主题的开发者,了解钩点的运作机制,不论是在调试的时候,或是「不想要安装太多插件」时,都可以帮助你达到想要的目的。在后续举的两个例子,就是通过 hook 的方式,去完成平常需要通过插件进行的设置。
什么是钩点?
钩点就是在特定的网页流程,找出对应的工具,并输出对应的结果。
关于钩点的详细介绍,可以参考 Audi 的《WordPress的Hook机制与原理》一文,本文将根据目前官方的开发人员文件,针对(我自己)常用的钩点进行解说。但为了使读者们更便于了解后续内容,这里会先简单介绍两种钩点:filters(以下称为「筛选器」)与 actions(以下称为「动作」)。
筛选器与动作
根据 WordPress Codex 的定义,动作指的是「在 WordPress 事件发生时,同时触发特定函数 (functions)」,而筛选器指的是「在 WordPress 将数据于数据库与浏览器间传递的过程中,筛选特定数据并返回已经过转换的值」。
用情境来理解的话,动作是「WordPress 正在 OOO,这时候我也 XXX」,例如:「WordPress 正在载入标头 (header) 内容,我想要在这时候执行 my_enqueue_style 这项工作,以载入 /path/to/style.css 文件」用动作的写法就会是:
<?php
add_action( 'wp_head', 'my_enqueue_style' );
function my_enqueue_style () {
wp_enqueue_style( 'my-style', '/path/to/style.css' );
}
而筛选器则是「现在 WordPress 正要输出/输入 OOO,但我想先 XXX」,例如:「WordPress 正要输出 CSS 和 JavaScript 的元素,但我想先移除文件的版本信息」。使用筛选器的写法如下:
php
function remove_version_query($src) {
if (strpos($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}
add_filter('style_loader_src', 'remove_version_query', 999);
add_filter('script_loader_src', 'remove_version_query', 999);
(备注:上述代码片段引自开源项目 Work with WordPress)
两者最大的差异在于筛选器是介于浏览器(前端)与数据库(后端)将数据进行筛选、改写的过程中,因此必然需要使用 return 返回值,否则就会出现“进有无出”的情况。而动作则是执行特定函数的功能,这些功能并不一定需要返回值。
了解了筛选器和动作之后,这里来记录一下我自己常用的钩子(Hooks)。
常用的钩子
名称 类型 功能
wp_enqueue_scripts action WordPress 开始引入 CSS、JS 文件时的动作。
wp_head action 所有会在 wp_head() 执行时的动作,包含载入页面中元数据(meta)、引入 CSS、JS 文件等。
the_post action 在 WordPress 完成文章查询请求后的动作。
wp_footer action 所有会在 wp_footer() 执行时的动作,例如载入定制的 JavaScript 等。
body_class filter 在导出 body 元素的 CSS 类型时进行筛选、改写。
get_the_excerpt filter 在获取文章内容摘要时进行筛选、改写。可用于自定义文章内容摘要长度时。
manage_posts_columns filter 在各文章类型(post type)的管理页面中,显示特定字段时使用。
完整的钩子信息可以参考 WordPress Codex 中的《Plugin API/Action Reference》与《Plugin API/Filter Reference》。
小结
以上是针对钩子概念的介绍。如前所述,学习钩子的主要好处在于理解 WordPress 插件与主题的运作机制。对于那些希望避免安装过多插件的人来说,这是一项非常重要的技能。
然而,一旦掌握了钩子的概念,接下来应该如何使用呢?大多数在线教程会建议你“将这些代码复制粘贴到当前主题的 functions.php 文件中”。然而,这种做法存在相当大的风险:“当主题更新后,你所做的修改可能会丢失。”
因此,本系列的下一篇文章将介绍 WordPress 定制中非常重要的概念:子主题(Child Themes)。
感谢您的来访,获取更多精彩文章请收藏本站。

暂无评论内容