WordPress 过滤钩子(Filter)基础详解

WordPress 过滤钩子(filters)——我们可以扩展 WordPress 的最好方法之一。这个特性的基础就是钩子(hooks)—— WordPress的过滤(filters)和动作(actions)钩子。没有它们,我们就无法利用 WordPress 的可扩展性的优势。

什么是 WordPress 过滤钩子(Filter)

在 WordPress 官方开发文档里面,过滤钩子(filter)是这样定义的:

过滤钩子是一类函数,WordPress 执行传递和处理数据的过程中,在针对这些数据做出某些动作之前的特定点运行(例如将数据写入数据库或将其传递到浏览器页面)。WordPress 默认已经做了一些过滤钩子,你的插件可以添加它自己的过滤钩子。

本质上,过滤器就是在 WordPress 输出之前将你的浏览数据做出反应。过滤钩子是 WordPress 的两种钩子之一,另外一个我们叫做动作钩子(actions)。当然这不是我们这篇文章讨论的。

在 WordPress 中使用过滤钩子

正如我说的那样,使用 WordPress 过滤钩子是非常容易的,我们只需要了解一些过滤钩子的最基本的功能。(说实在点,最困难的部分其实是学习所有的过滤钩子,但是正如你想的那样,你一次性不可能学习每一个过滤钩子——当你需要哪个过滤钩子的时候,再学习它。)

在这部分,我们要做如下四件事:

  • 创建一个过滤函数
  • 挂载到一个过滤钩子
  • 从过滤钩子上移除一个函数
  • 创建自己的过滤钩子

创建一个过滤函数,并且钩到过滤钩子

为了在过滤器之间传输数据,你需要创建一个函数,用来定义如何传递这个数据以及用过滤钩子将其连接起来。

我们来看看,我们创建一个插件用来移除文章标题的元音(vowels),你不能说“从我的文章标题里面移除元音”你应当说“挂载这个函数(用来移除元音的)到我文章标题的过滤钩子”

这就完了?当然没有,看下面这个例子,我们将撰写函数代码来从任何东西上面移除元音

<?php
 
function remove_the_vowels( $title ) {
    $title = preg_replace( '/[aeiou]/i', '', $title );
    return $title;
}
 
?>

这个函数获取 $title 字符串,移除元音后返回它。 够简单吧?现在我们继续深入这个例子,我们将其用钩子连接到过滤器:

<?php
 
function remove_the_vowels( $title ) {
    $title = preg_replace( '/[aeiou]/i', '', $title );
    return $title;
}
 
add_filter( 'the_title', 'remove_the_vowels' );
 
?>

注意到新的函数没有?我们快速的看看这个 add_filter():

<?php
 
add_filter( $tag, $function_to_add, $priority, $accepted_args );
 
?>
  • $tag (required) - 过滤钩子的名称
  • $function_to_add (必须) - 要挂载到过滤钩子的函数名称
  • $priority (可选) -一个整数用来判断我们的函数什么时候执行,默认数值是10:这个数值你可以设置较高,也可以设置较低。数值的高低决定函数运行的优先级,数值越低优先级越高
  • $accepted_args (可选) – 一个整数用来设定过滤钩子接受的参数的个数,默认值是1

移除一个过滤钩子

我们也可以从过滤钩子上面移除附加的函数,为了演示这个,我们用一个很简单的函数, remove_filter(). 我们来看看他是如何工作的:

<?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(),它在核心代码中被用来创建了几百个过滤钩子了。当然,它也可以用在核心代码之外,这就意味着我们可以在插件和主题里面也能创建过滤钩子。

来看看它是如何工作的:

<?php
 
apply_filters( $tag, $value, $var1, $var2 /* ...and so on */ );
 
?>
  • $tag (必须) – 过滤钩子的名称
  • $value (必须) – 通过add_filter()挂载的过滤函数所要修改的值。
  • $var1, $var2 and so on (任意) – 你的过滤钩子的参数(你喜欢设多少就多少),过滤函数可以使用这些参数,但是它们不能被函数返回。

我们考虑一下这样一个例子:想象一下你写了一个函数,这个函数只返回一句皮特格里芬的名言:

<?php
 
function peter_griffin_quote() {
    $quote = "The bird is the word.";
    return $quote;
}
 
?>

如果你想让人们过滤这句话(将你的插件代码放在一边),你需要向下面那样使用

apply_filters() 这个函数:

<?php
 
function peter_griffin_quote() {
    $quote = "The bird is the word.";
    return apply_filters( 'peter_griffin_quote', $quote );
}
 
?>

那样,其他开发者使用你的插件可以这样修改你的函数数据:

<?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

相关推荐

WordPress 钩子(Hook)的机制与原理:add_action、add_filter

WordPress 钩子(Hook)的机制与原理:add_action、add_filter

了解 WordPress 钩子(Hook)的机制与原理,就能明白自定义函数中 add_action 和 add_filter 的含义了,他们对应着 WordPress 动作钩子和 WordPress 过滤钩子,对于修改或制作主题与插件帮助非常大,甚至可以说比必经之路。 本文针对 WordPress Hook 运作大致做个简单的说明,而预设读者是理解基本的 PHP function 语法及运作 ...

WordPress 主题和插件的加载运行机制、Hook钩子与重要函数

WordPress 主题和插件的加载运行机制、Hook钩子与重要函数

本文有助于你深度了解 WordPress 主题和插件的 PHP 加载顺序,学习 Hook(钩子)Action(动作钩子) Filters(过滤钩子)的概念,弄懂 WordPress 重要函数:do_action、add_action、apply_filters 和 add_filter。 插件的加载机制 了解插件的加载机制,能够帮助我们更加深入的了解插件的开发,也能够帮助我们更好的对插件进 ...

WordPress 各种钩子和过滤器 action/filters 的执行顺序

WordPress 各种钩子和过滤器 action/filters 的执行顺序

WordPress 之所以能提供这样灵活的二次开发能力,一大途径就是它里面内涵了各种各样的 action/filter,通过这些 action/filter,你可以 在Wordpress 运行的各个环节来修改缺省的 WordPress 行为、表现和事件。为了方便我记忆,也给遇到跟我一样困难的朋友们一些提示,下面是我在网上找到的各种 WordPress action 的执行顺序 ...

WordPress 常用动作钩子 (action)分享

WordPress 常用动作钩子 (action)分享

在制作主题和插件,或者为 WordPress 增加某些功能时,一般都要使用 WordPress 的动作钩子 (action),分享几个比较常用的动作钩子,以备用时查看。 plugins_loaded 对插件开发者来说,plugins_loaded 动作钩子也许是最重要的动作钩子了,它在大多数 WordPress 文件加载完成之后,并在 pluggable 函数和 WordPress 开始执行 ...

微信扫一扫,分享到朋友圈

WordPress 过滤钩子(Filter)基础详解