我们将研究这个由两部分组成的系列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