本文目录
[隐藏]
- 1什么是 WordPress 过滤钩子(Filter)
- 2在 WordPress中使用过滤钩子
- 3创建一个过滤函数,并且钩到过滤钩子
- 4移除一个过滤钩子
- 5创建你自己的过滤钩子
- 6结论
本文是《50个 WordPress 过滤钩子》系列教程的第 1 部分,该系列共包含以下 7 个部分:
- 50个WordPress过滤钩子(介绍过滤钩子)
- 50个WordPress过滤钩子(1-10)
- 50个WordPress过滤钩子(11-20)
- 50个WordPress过滤钩子(21-30)
- 50个WordPress过滤钩子(31-40)
- 50个WordPress过滤钩子(41-50)
- 50个WordPress过滤钩子(总结)
WordPress是一个了不起的平台和世界上最受欢迎的内容管理系统。这样说的原因是因为它的可扩展性。在这个系列教程中,我们将学习 WordPress 过滤钩子(filters)——我们可以扩展WordPress的最好方法之一。
这个特性的基础就是钩子(hooks)—— WordPress的过滤(filters)和动作(actions)钩子。没有它们,我们就无法利用WordPress的可扩展性的优势。
在这个系列的文章里面,我们准备学习这些过滤钩子,这是拓展 WordPress 的最好方法之一 。我们准备将它分为七个部分的系列来讲解:
- WordPress 过滤钩子的定义以及介绍如何使用WordPress 过滤钩子(也就是你现在看的这篇文章)。
- 五篇文章总共介绍 50 个 WordPress 过滤钩子(每篇文章讲解 10 个)。包括详细介绍以及举例说明。
- 最后一篇 “注意事项”,再次解释这些过滤钩子,以及50个例子。
其实WordPress总共有几百个过滤钩子,我们这里说到的 50 个仅仅只占总体的大约 10% ,所以可能你会遇到一些我们这里没有列举到的过滤钩子。
好了,我们现在该开始关于 WordPress 过滤钩子的介绍了!
什么是 WordPress 过滤钩子(Filter)
在 WordPress 官方开发文档里面,过滤钩子(filter)是这样定义的:
过滤钩子是一类函数,WordPress执行传递和处理数据的过程中,在针对这些数据做出某些动作之前的特定点运行(例如将数据写入数据库或将其传递到浏览器页面)。过滤钩子处于数据库与浏览器中间(当WordPress正在产生页面的时候),处于浏览器与数据库之间(当WordPress添加新的数据到数据库的时候);WordPress中的多数输入与输出都经过至少一个过滤钩子。WordPress默认已经做了一些过滤钩子,你的插件可以添加它自己的过滤钩子。
所以,本质上,过滤器就是在 WordPress 输出之前将你的浏览数据做出反应。过滤钩子是 WordPress 的两种钩子之一,另外一个我们叫做动作钩子(actions)。当然这不是我们这篇文章讨论的。
尽管 WordPress 钩子看起来非常复杂,但其实过滤钩子和动作钩子是非常容易弄懂,当我第一次接触到这些的时候,我也是非常恐惧的,但是当我通过查看开发中心的代码以及挖掘核心的代码,知道他们很简单的时候,我就已经了解了几百个的过滤钩子和动作钩子。
你也应当明确的学习这几百个过滤钩子,但是首先,你需要知道如何使用他们。
在 WordPress中使用过滤钩子
正如我说的那样,使用 WordPress 过滤钩子是非常容易的,我们只需要了解一些过滤钩子的最基本的功能。(说实在点,最困难的部分其实是学习所有的过滤钩子,但是正如你想的那样,你一次性不可能学习每一个过滤钩子——当你需要哪个过滤钩子的时候,再学习它。)
在这部分,我们要做如下四件事:
- 创建一个过滤函数
- 挂载到一个过滤钩子
- 从过滤钩子上移除一个函数
- 创建自己的过滤钩子
创建一个过滤函数,并且钩到过滤钩子
为了在过滤器之间传输数据,你需要创建一个函数,用来定义如何传递这个数据以及用过滤钩子将其连接起来。
我们来看看,我们创建一个插件用来移除文章标题的元音(vowels),你不能说“从我的文章标题里面移除元音”你应当说“挂载这个函数(用来移除元音的)到我文章标题的过滤钩子”
这就完了?当然没有,看下面这个例子,我们将撰写函数代码来从任何东西上面移除元音
1 2 3 4 5 6 7 8 |
<?php function remove_the_vowels( $title ) { $title = preg_replace( '/[aeiou]/i', '', $title ); return $title; } ?> |
这个函数获取 $title 字符串,移除元音后返回它。 够简单吧?现在我们继续深入这个例子,我们将其用钩子连接到过滤器:
1 2 3 4 5 6 7 8 9 10 |
<?php function remove_the_vowels( $title ) { $title = preg_replace( '/[aeiou]/i', '', $title ); return $title; } add_filter( 'the_title', 'remove_the_vowels' ); ?> |
注意到新的函数没有?我们快速的看看这个 add_filter():
1 2 3 4 5 |
<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?> |
- $tag (required) – 过滤钩子的名称
- $function_to_add (必须) – 要挂载到过滤钩子的函数名称
- $priority (可选) -一个整数用来判断我们的函数什么时候执行,默认数值是10:这个数值你可以设置较高,也可以设置较低。数值的高低决定函数运行的优先级,数值越低优先级越高
- $accepted_args (可选) – 一个整数用来设定过滤钩子接受的参数的个数,默认值是1
移除一个过滤钩子
我们也可以从过滤钩子上面移除附加的函数,为了演示这个,我们用一个很简单的函数, remove_filter(). 我们来看看他是如何工作的:
1 2 3 4 5 |
<?php remove_filter( $tag, $function_to_remove, $priority ); ?> |
和 add_filter()
的参数几乎是相同的:
- $tag (必须) – 过滤钩子的名称
- $function_to_remove (必须) – 要移除的函数的名称
- $priority (可选) – 函数的优先级(根据定义函数的顺序)
另外还有一个叫remove_all_filters() 的函数,他有两个参数,分别是$tag 和 $priority 用来设定过滤钩子的名称以及过滤钩子的优先级。remove_all_filters()函数就像他的名字那样,它可以移除所有过滤钩子上面的函数。
创建你自己的过滤钩子
你还在疑虑这些过滤钩子是如何创建的?这里有一个特别的函数叫apply_filters(),它在核心代码中被用来创建了几百个过滤钩子了。当然,它也可以用在核心代码之外,这就意味着我们可以在插件和主题里面也能创建过滤钩子。
来看看它是如何工作的:
1 2 3 4 5 |
<?php apply_filters( $tag, $value, $var1, $var2 /* ...and so on */ ); ?> |
- $tag (必须) – 过滤钩子的名称
- $value (必须) – 通过add_filter()挂载的过滤函数所要修改的值。
- $var1, $var2 and so on (任意) – 你的过滤钩子的参数(你喜欢设多少就多少),过滤函数可以使用这些参数,但是它们不能被函数返回。
我们考虑一下这样一个例子:想象一下你写了一个函数,这个函数只返回一句皮特格里芬的名言:
1 2 3 4 5 6 7 8 |
<?php function peter_griffin_quote() { $quote = "The bird is the word."; return $quote; } ?> |
如果你想让人们过滤这句话(将你的插件代码放在一边),你需要向下面那样使用
apply_filters() 这个函数:
1 2 3 4 5 6 7 8 |
<?php function peter_griffin_quote() { $quote = "The bird is the word."; return apply_filters( 'peter_griffin_quote', $quote ); } ?> |
那样,其他开发者使用你的插件可以这样修改你的函数数据:
1 2 3 4 5 6 7 8 9 10 |
<?php function change_the_quote( $quote ) { $quote = str_replace( 'bird', 'nerd', $quote ); return $quote; } add_filter( 'peter_griffin_quote', 'change_the_quote' ) |
现在,每当这个peter_griffin_quote()函数运行的时候,开发者不需要编辑你的插件文件,皮特的名言也会有很小的改变。小菜一碟的事。
如果你需要额外的关于 WordPress 过滤钩子的信息,你可以参考Pippin Williamson的这个教程: Writing Extensible Plugins With Actions and Filters。在这个教程里面,你可以学到如何在你的插件或者主题中创建过滤钩子和动作钩子。
结论
你用过滤钩子用的越多,你就会感觉到越有趣。WordPress 有几百个过滤钩子,学习这些过滤钩子,你将会成为 WordPress方面的专家,在下一部分,我们将要学习下面这十个 WordPress 过滤钩子:
login_errors
comment_post_redirect
allowed_redirect_hosts
body_class
locale
sanitize_user
the_content
the_password_form
the_terms
wp_mail_from
我和激动的跟大家分享这个系列的文章,同时我也希望你会在这里面享受到学习的乐趣。如果你觉得你可以在这个教程中帮到我,比如提出更多的过滤钩子,以及更多的例子等。不要犹豫,在评论中写下你的建议和想法吧。
当然也别忘了把你觉得好的文章分享给你的好友哦。下个教程我们再见。
阅读该系列的其他文章: 下一篇:50个WordPress过滤钩子(1-10)