WordPress 是世界上最受欢迎的内容管理系统(CMS),造就这一地位的原因在于WordPress 的高扩展性。在本系列文章中,我们将要学习WordPress 中的过滤器(filters)——扩展WordPress 功能的最好方式之一。
本系列文章翻译自tutsplus,原作者为Barış Ünver,翻译人:Jeff
WordPress 中有一种叫执行挂勾(hook)的基础机制,其中包括动作 (Action)和过滤器 (Filter)。没有这两个东西,就没有高扩展性的WordPress。

在本系列文章中,我们即将学到过滤器的相关知识,接下来总共有七篇文章将聚焦于以下几点:

WordPress 中的过滤器的定义以及如何利用这些过滤器(即本文)

接下来的5篇文章将借助实例介绍WordPress 中的50个过滤器(平均每篇文章介绍10个)

最后一篇压轴文章,做最终的总结

在WordPress 的核心代码中,有以千为数量单位的过滤器,而本系列中即将要讲的不过是50个(大概10%)(数学不好,不知道怎么翻译~~),因此本系列在后续中可能会增加新的示例介绍——如果有很多人喜欢这个系列文章的话。

无论如何,让我们开始吧!

WordPress 中的过滤器是什么?

在WordPress 的官方Codex 中,是这样介绍过滤器的:

过滤器是一类函数,WordPress执行传递和处理数据的过程中,在针对这些数据做出某些动作之前的特定点运行(例如将数据写入数据库或将其传递到浏览器页面)。过滤器处于数据库与浏览器中间(当WordPress正在产生页面的时候),处于浏览器与数据库之间(当WordPress添加新的文章评论到数据库的时候);WordPress中的多数输入与输出都经过至少一个过滤器。WordPress默认状态做了一些过滤,你的插件可以添加它自己的过滤器。

本质上,过滤器是一种在输出网站数据前进行填充(doing stuff)的功能。过滤器是WordPress 中hook 机制的一种——另外一种是动作(action)。

尽管看起来很复杂,但过滤器(以及动作)其实很容易明白。第一次接触的时候我也是有畏惧的心理,但后来才发现它是那么简单。当我细细查阅过官方codex 及细细研读后,我掌握了数百个过滤器和动作的用法。

在WordPress 中使用过滤器

正如我所说,在WordPress 中使用过滤器是非常简单的。只需要明白几个基础的函数是怎样运作的你就明白它的原理。(老实说,最困难的部分是学到所有的过滤器但正如你知道的,你不可能熟知每一个过滤器的用法——只有你需要用的才去用它)

在这个部分,我们按照下面的步骤来学习:

创建一个过滤器函数

挂钩过滤器

移除某个过滤器的函数

创建自己的过滤器

创建一个过滤器函数并挂载之

为了玩转过滤器中传送过来的数据,你需要新建一个函数并定义其中的数据传送方式,然后挂载到过滤器中。

让我们举一个例子:我们打算弄个插件来移除文章标题中得元音字母(好奇葩的例子)。与其说“移除文章标题的元音字母”,不如说“将这个函数挂载到我的文章过滤器上”

很复杂吗?当然不是,让我们看看代码:


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

这个函数使用PHP中的 preg_replace函数来替换标题中的元音字母并返回替换后的tile 参数。很简单不是吗?让我们挂载这段函数到一个过滤器上:


<?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 必需,过滤器钩子的名称
$function_to_add 必需,要添加的过滤器函数
$priority 可选,过滤器函数的优先级,默认值为10
$accepted_args 可选,过滤器函数接受的参数数量,默认值为1

移除过滤器

我们可以通过remove_filter()函数移除附加在过滤器上的函数:


<?php
remove_filter( $tag, $function_to_remove, $priority );
?>

$tag 必需,过滤器钩子的名称
$function_to_remove 必需,要移除的过滤器函数
$priority 可选,过滤器函数的优先级
事实上还有其他一个函数remove_all_filters(),该函数仅仅需要两个参数($tag和 $priority)。正如函数名,它的作用是移除挂载在过滤器上的所有函数。

创造你的过滤器

想知道一个过滤器是如何产生的吗?这里有个特别的函数可以让你在核心代码的数百个过滤器之外创造属于你自己的过滤器。当然,它可以在核心外运行意味着你可以在自己的主题或插件中创建过滤器。

让我们看看它是如何工作的:


<?php
apply_filters( $tag, $value, $var1, $var2 /* ...and so on */ );
?>

$tag 必需,过滤器钩子的名称
$value 必需,可以被过滤器函数修改的值
$var 可选,若干个可以传递给过滤器函数的参数
上例子:想象下你写了个函数可以返回来自Peter Griffin 的名言:


<?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函数运行的时候,Peter Griffin 的名言都会被稍微修改。
提示:如果你想在这个方面获取更多的知识,可以参考Tuts+ 的这篇文章: [《Writing Extensible Plugins With Actions and Filters》](http://code.tutsplus.com/tutorials/writing-extensible-plugins-with-actions-and-filters–wp-26759)。这个教程是介绍如何在个人开发的主题或插件中创建过滤器或动作。
结论

写的代码越多,你就越能发现过滤器的乐趣。WordPress 中有数百个过滤器,每学习一个都能让你在成为WordPress 高手的道路上更进一步。在接下来的文章中,我们即将学习下面的10 个WordPress 过滤器:
login_errors
comment_post_redirect
allowed_redirect_hosts
body_class
locale
sanitize_user
the_content
the_password_form
the_terms
wp_mail_from
写这个系列的文章我很高兴(翻译我倒苦逼了~~),我希望你阅读这系列文章也是一样。如果你需要更多的帮助或者想我提供更多的过滤器介绍,请不要吝惜你的希望之情,同时,不要忘记分享这篇文章!(翻译也是啊!!)