在这个由两部分组成的系列中,我们将研究WordPress挂钩系统。 具体来说,我们正在仔细研究动作和过滤器以及它们在WordPress开发中所扮演的角色。
尽管它们都被定义为钩子,但是每个都在WordPress开发中扮演着特定的角色。 而且,如果您希望成为一名更优秀的WordPress开发人员,不仅要了解它们之间的区别,而且还应如何实现自定义钩子,这一点很重要。
在本系列的第一篇文章中,我们定义了什么是钩子,了解了它们在其他地方的用法,还回顾了包括如何定义我们自己的钩子在内的操作。 如果您还没有阅读第一篇文章, 我强烈建议您在继续本教程之前先阅读它 。
在开始使用钩子之前,我将快速介绍上一篇文章中讨论的内容,然后我们将继续进行介绍。
话虽如此,让我们开始吧。
快速刷新
在上一篇文章中,我们看到了挂钩是如何实现事件驱动设计模式的 。 特别是,我们将其定义如下:
- 该软件在某些方面可以广播发生了某些事情的消息。
- 作为开发人员,我们能够编写侦听此消息的代码,然后使用自定义代码对其进行响应。
然后在整个内容中,我们准确地回顾了如何在WordPress中实现此模式。 我们讨论了如何利用它,然后讨论了如何实施自己的行动。
我们也认识到一个微妙的区别:
操作旨在与功能一起使用,而过滤器旨在与数据一起使用。
动作使我们能够修改行为方式,而过滤器将使我们能够在数据被保存,检索或显示在屏幕上之前对其进行修改。 在本教程中,我们将研究如何在将数据写入屏幕之前使用过滤器,例如如何小写文本并从文本中删除元音。
最终,它是关于在学习有关WordPress这一强大方面的全部知识的同时,尝试通过我们所做的工作获得乐趣并看到切实的成果。
在此之前,我们需要确保已设置好本地开发环境并准备就绪。
入门
回顾上一篇文章,我们的本地开发环境应包括以下内容:
- WordPress 4.5.2
- 您首选的IDE
- 网络服务器
- PHP的副本
- 一个数据库
对于许多人来说,可以轻松安装Apache,PHP和MySQL。 如果您比较高级,则可能正在使用Nginx和备用数据库等工具。 如果是这样,那很好,但是出于本教程的目的,我假设您拥有前者。
而且,如果您没有进行任何设置,那么就不用担心: 我们已经为您服务 。 链接的教程将为您提供开始在本地计算机上使用WordPress所需的一切。
设置完成后,我们就可以继续进行了。
了解WordPress过滤器
WordPress Codex为希望学习过滤器的所有人士提供了一套全面的资源。 如前所述, 它定义了以下过滤器 :
自定义过滤器与自定义操作有所不同,因为自定义操作允许您在现有操作中添加或删除代码。 而自定义过滤器允许您替换现有操作中找到的特定数据(例如变量)。
但是,如果您要查找WordPress中可用过滤器的完整列表,请确保在法典中引用(和添加书签) 此页面 。 它具有大约20秒的筛选器值,其中许多链接到他们自己的文档页面。
这意味着如果您想知道是否存在特定的过滤器,则可以参考此页面。 同样,您可以访问该特定过滤器的页面,以减少参数参数,示例函数定义以及如何使用该参数。
关于优先级和参数
在继续之前,我想确保我们每次在WordPress钩子上下文中谈论优先级和参数的数量时都在同一页上。
以下面的代码行为例:
<?php
add_filter( 'author_edit_pre', 'filter_function_name', 10, 2 );
这告诉我们四件事:
- 我们挂接到的过滤器的名称
- 应该调用的函数的名称
- 何时调用函数的优先级
- 函数应接受多少个参数
一般而言,前两点很快就能理解。 但是,其他两个经常会绊倒新开发人员,但这并不是一个很难理解的概念。
首先,将优先级视为调用函数时的优先级。 请记住,由于给定的挂钩可以具有与其关联的多个功能,因此优先级允许您定义调用函数的时间或延迟。 数字越小,发射越早; 该数字越高,触发时间越晚。
其次,该数字指示一个参数采用多少个参数。 如果您不指定数字,则它将不接受任何数字,也不会接受默认参数。 如果您要传递的数量与预期的不同,则可以指定该参数应接受的参数数量。 我们将在本教程的后面部分对此进行详细介绍。
使用过滤器
要开始使用滤镜的,让我们继续前进,在根目录创建我们自己的文件twentysixteen目录。 我们将文件tutsplus-filters.php
。 然后,在二十十六的functions.php
,添加以下代码行:
<?php
include_once( get_template_directory() . '/tutsplus-filters.php' );
这样可以确保我们所有的自定义代码都驻留在一个文件中,当我们不想使用它时可以将其排除。 它还将它包含在自己的区域中,这样就不会与主题中存在的任何代码结合在一起。
过滤帖子内容
在开始定义自己的自定义过滤器之前,了解过滤器的工作原理非常重要。 由于过滤器旨在用于修改数据,并且帖子是博客的组成部分之一,因此让我们看一下如何在博客帖子的内容在屏幕上显示之前对其进行过滤。
在研究此示例时,请注意它与我们使用WordPress操作的方式有何相似之处,但它不是在修改行为,而是在修改数据。
1.注册我们的过滤器
要注册我们的过滤器,我们需要两条信息:
- 连接函数的过滤器名称
- 负责过滤数据的功能
由于我们将要修改帖子内容,因此可以利用the_content
过滤器。 该功能的要点如下:
- 它接受单个参数,即帖子内容,允许我们对其进行修改,然后将其返回给调用方
在这种情况下,WordPress将帖子内容传递给该函数,然后该函数将在完成其工作后返回数据。
让我们命名自定义函数tutsplus_the_content
,然后在WordPress中注册它。
<?php
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
return $content;
}
从最根本的角度来看,这就是函数的外观。 当然,它做的并不多。 它只是返回传递给它的内容。
2.修改内容
让我们让此函数稍微修改一下数据。 具体来说,让我们这样做:
- 确保在单个帖子视图中查看该帖子
- 在帖子顶部添加一条消息,说明该帖子的内容已被更改
这不是过滤器的最实际用途,但是它将为您提供有关如何修改函数的想法。
代码如下所示。 还要注意代码注释:
<?php
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
// First, define the message to be displayed.
$html .= '<p>';
$html .= 'This is a custom message created by a hooked function.';
$html .= '</p>';
// Now prepend it to the content.
$content = $html .= $content;
return $content;
}
如果您在索引视图或博客主视图中查看页面,则将看到标准帖子,其外观与未做任何修改的外观完全相同。 但是,如果您访问单个帖子,则会在每个帖子的顶部看到一个新短语。 具体来说,您会看到:
这是由挂钩函数创建的自定义消息。
但是,让我们做一些更高级的事情。 除了在内容顶部添加一条消息外,让我们从帖子内容中删除所有元音,然后再将其返回到WordPress。
为此,我们将使用以下代码:
<?php
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
// First, remove all of the vowels from the content using a regular expression.
$content = preg_replace( '$[aeiou]$i', '', $content );
// Then, define the message to be displayed.
$html .= '<p>';
$html .= 'This is a custom message created by a hooked function.';
$html .= '</p>';
// And now prepend it to the content.
$content = $html .= $content;
return $content;
}
实施该代码,将其保存,然后访问WordPress安装中的任何帖子。
从技术上讲,上面的函数可以做两件事,因此为了编写更具凝聚力的代码,我建议将行为分解为单独的函数,并让我们的主要过滤函数调用它们。
最终结果如下所示:
<?php
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
$content = _tutsplus_strip_vowels( $content );
$content = _tutsplus_add_message( $content );
return $content;
}
function _tutsplus_strip_vowels( $content ) {
return preg_replace( '$[aeiou]$i', '', $content );
}
function _tutsplus_add_message( $content ) {
$html .= '<p>';
$html .= 'This is a custom message created by a hooked function.';
$html .= '</p>';
return ( $html . $content );
}
同样,这不是过滤器的实用或有用的实现,而是确切地显示了设置我们自己的函数时我们能够执行的操作。
定义自定义过滤器
不过,利用现有过滤器很容易。 如前所述,调用add_filter
,指定过滤器的名称,然后传递要调用的函数名称以过滤数据,实际上是一个简单的问题。
但是,如果我们要创建自己的自定义过滤器,该怎么办? 也许我们想创建一个过滤器,将小写帖子中的所有文本? 还是我们想创建一个过滤器,以删除帖子中的所有元音?
了解apply_filters
这是我们开始对apply_filters
感兴趣的apply_filters
。 这个特殊的函数接受两个参数:
- 标识过滤器挂钩名称的标签
- 一个值,指的是应用过滤器的值
如果要看一个示例,例如WordPress核心中的 get_the_content
,那么您会注意到它通过the_content_more_link
通过apply_filters
传递了指定的值。
这对理解很有用,但是我们如何定义自己的自定义过滤器,以便其他人可以对我们开发的功能调用apply_filters
?
添加我们自己的过滤器
添加我们自己的过滤器很容易。 我们需要指定与上面概述的相同的四件事:
- 过滤器的名称
- 过滤器应调用的函数
- 功能的优先级
- 它应该接受的参数数量
让我们从一个简单的例子开始。
小写的一切
确保整个帖子的内容均为小写。
首先,我们要定义优先级为10的过滤器。我们知道它只会接受一个参数,即内容,因此添加过滤器时我们将传递数字1:
<?php
add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );
接下来,我们将定义一个简单的函数体,该函数体使用PHP的strtolower
函数来简化传递给它的任何值,然后将其返回。
<?php
function tutsplus_lowercase_all_callback( $content ) {
return strtolower( $content );
}
代码的最终版本将如下所示:
<?php
add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );
function tutsplus_lowercase_all_callback( $content ) {
return strtolower( $content );
}
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
return apply_filters( 'tutsplus_lowercase_all', $content );
}
很容易理解,对吗? 让我们再来看一个基于我们已经编写的功能的示例。
删除所有元音
要删除元音,我们可以使用已经定义的相同功能; 但是,我们需要更改在WordPress中注册过滤器的方式,然后我们需要确保在WordPress中注册的函数正确调用apply_filters
。
由于我们已经看到了如何添加自己的过滤器,指定优先级,定义应接受的参数数量以及实现函数的方法,因此我不会在琐碎的细节上浪费时间。
这是过滤器,它被单独调用:
<?php
add_filter( 'tutsplus_remove_vowels', 'tutsplus_remove_vowels_callback', 10, 1 );
function tutsplus_remove_vowels_callback( $content ) {
return preg_replace( '$[aeiou]$i', '', $content );
}
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
return apply_filters( 'tutsplus_remove_vowels', $content );
}
然后,这就是从初始挂钩中调用它的方式。
一起呼唤他们
最后,可以多次调用apply_filters
:
<?php
add_filter( 'tutsplus_remove_vowels', 'tutsplus_remove_vowels_callback', 10, 1 );
function tutsplus_remove_vowels_callback( $content ) {
return preg_replace( '$[aeiou]$i', '', $content );
}
add_filter( 'tutsplus_lowercase_all', 'tutsplus_lowercase_all_callback', 10, 1 );
function tutsplus_lowercase_all_callback( $content ) {
return strtolower( $content );
}
add_filter( 'the_content', 'tutsplus_the_content' );
function tutsplus_the_content( $content ) {
// Don't proceed with this function if we're not viewing a single post.
if ( ! is_single() ) {
return $content;
}
return apply_filters( 'tutsplus_lowercase_all',
apply_filters( 'tutsplus_remove_vowels', $content )
);
}
请注意,这可以实现与前面的情况相同的结果,但是可以通过将它们压缩为一行代码来实现。 也可以通过其他方式编写此代码,但是本教程的目的是教育您如何编写自己的过滤器以及如何在自己的工作中利用apply_filters
。
结论
本教程总结了对WordPress挂钩的介绍。 在整个系列中,我们都回顾了如何利用现有的操作和过滤器,以及如何创建和实现自己的方法。
钩子系统是WordPress对于开发人员而言最强大的方面之一,因此熟悉它非常重要。 这样,您不仅可以操纵WordPress提供的行为和数据,而且还可以定义自己的钩子,其他开发人员可以在自己的代码中使用它们。
请随意继续使用这两个教程中提供的源代码。
最后,如果您正在寻找其他实用程序来帮助您构建不断增长的WordPress工具集或用于研究代码并变得更加精通WordPress的代码,请不要忘记查看Envato Market中提供的功能 。
记住,您可以在个人资料页面上捕获我的所有课程和教程,还可以通过@tommcfarlin 在我的博客和/或Twitter上关注我,在那里我讨论了各种软件开发实践以及如何在WordPress中使用它们。
请不要在下面的提要中留下任何问题或评论,我将尽力回答每个问题或评论。
翻译自: https://code.tutsplus.com/tutorials/adding-custom-hooks-in-wordpress-custom-filters--cms-26508