×

主题开发

本栏目提供WordPress主题开发制作,WordPress模版开发修改,WordPress网站集成等WordPress开发方面的资讯和技巧。

WordPress的钩子、动作和过滤器的作用和工作原理详解

王超 2021-01-31 主题开发 74 次

本文介绍了WordPress开发中最重要的话题之一:WordPress钩子,包括动作钩子和过滤钩子。钩子不仅是WordPress插件工作方式的核心,而且是WordPress生态系统中几乎所有代码的核心:大多数WordPress主题都大量使用钩子,“WordPress核心”本身也是如此。WordPress钩子是WordPress开发中一个绝对必须知道的话题。

关于WordPress钩子的关键要点:

  • WordPress钩子是一个关键的WordPress特性,它允许开发人员在指定的地方将自定义代码插入到WordPress的PHP处理中。
  • 开发人员使用称为hooked函数的PHP函数编写此自定义代码。存在两种挂钩函数:动作钩子和过滤器。
  • 有两种钩子:动作钩子和过滤钩子。动作钩子“钩住”动作,过滤器钩子“钩住”过滤器。
  • 过滤器通过过滤器钩子传递代码或标记;它们修改传递的内容,并且必须返回结果,以便WordPress在其常规处理中使用。
  • 相反,动作钩子操作不需要返回值,并且通常不通过它们的操作挂钩传递特定的参数。

理解钩子并不是那么容易,部分原因是术语本身很难形象化和相互区分。

但回报是巨大的:作为一个开发人员,我们发现使用过滤器和操作可能是我们与WordPress交互的最常见的方式。随着时间的推移,它也成为我们在WordPress中最喜欢做的事情之一。

术语.钩子vs动作vs过滤器

特别是在这种情况下,理解术语“钩子”、“动作”和“过滤器”是成功的一半。例如,WordPress的法典中,这三个术语的使用都非常随意,而且前后不一致。

我们在本章中使用的定义是在WordPress中最常见的定义,它们最有助于理解实际发生的事情。因此,请坚持我们在这里提出的理解,当其他人以多种方式使用这些术语时,不要气馁。

钩子、动作和过滤器的关系

钩子是WordPress代码中可以添加函数的地方。当您创建一个钩子时,您为自己和其他开发人员提供了在该位置添加附加功能的机会。

钩子函数是定制的PHP函数,我们可以在钩子指定的位置“钩住”WordPress。

钩住的函数有两种类型:动作和过滤器。筛选器修改现有输出,而操作可以执行任何类型的自定义功能。

钩子有两种类型:动作钩子和过滤钩子,它们基于接受哪种类型的钩子函数。

WordPress挂钩:将外部承包商带入WordPress工厂

为了解释钩子,我们将回到我们的中心类比WordPress作为一个工厂。

记住,WordPress需要外部承包商来做一些工作。我们的承包商在WordPress工厂没有固定的位置,他们被困在外面,直到他们被工厂自己邀请进来。

就我们而言,这些外部承包商来自两个地方:

  1. Plugins
  2. The functions.php file inside the parent or child theme

外部承包商本身就是插件和函数.php改变了WordPress工厂的运作。

钩子动作钩子和过滤钩子是WordPress调用这些外部承包商的方式。换句话说,WordPress钩子以指定的方式在指定的位置拉入外部代码。

WORDPRESS如何呼唤“承包商”

我们可以把WordPress的“钩子”想象成真正的巨型工厂钩子,承包商就骑在上面,像这样:

每个钩子都有一个特定的名称,比如wp\u head,对应于WordPress工厂的一部分过程(在wp\u head的情况下,是构建页面的HTML<head>部分的过程)。

这些钩子延伸到大厅,这样承包商就可以把它们搭进去,而且它们是按照特定的顺序来做的。在<head>完成之前,wp\u head钩子向右移动到大厅和后面,在<body>完成之前,wp\u footer钩子向右移动到大厅和后面,依此类推。因此,承包商总是骑着他的钩子直接到活跃的,被工厂的一部分工作。

当一个承包商想成为一个特定过程的一部分时,他会等待那个钩子出现在入口处,然后直接骑着那个钩子进入工厂的适当部分。

如果承包商没有骑上合适的钩子,他就无法到达他在工厂里要去的地方。钩子是“邀请”外部代码(来自函数.php,插件等)进入WordPress PHP处理的定义区域。

两种钩子,两种承包商

我们对WordPress的钩子、操作和过滤器的理解已经走了一半。另一部分更具体一些:大厅有两种钩子,动作钩子和过滤钩子。

回顾一下WordPress钩子图,让我们了解操作和过滤器钩子。

动作挂钩

动作钩子往往会在里程碑处摇摆不定:例如,wp\u head动作钩子的“页面<head>部分的构建几乎完成了”,wp\u footer动作钩子的“页面<body>部分的构建几乎完成了”。

当承包商把行动挂钩带进工厂时,他们倾向于做任何他们想做的事情:在页面上添加一堆东西,或者做完全其他的事情,比如记录错误,甚至发送电子邮件。

过滤器挂钩

过滤器挂钩的工作方式有点不同。搭上行动钩子的承包商可以为所欲为,对任何人都不负责。但是使用过滤器钩子的承包商实际上将自己插入到了正常工人的流程中:他们得到了一些要处理的东西,比如一个文本块,并且必须通过一个PHP return语句将相同的文本块(可能稍微修改)返回给普通工人。

因此,使用过滤钩的承包商通常不只是想做什么就做什么;他处理的是他在工厂所在部门所做的工作。该部门经理可能会说:“这一部门在职位标题上起作用。”。“你想怎么做就怎么做,但如果你修改后不把帖子标题还给我,整个过程就无法正常进行。”

这些承包商是什么?

希望到目前为止我们说得有道理;现在我们要更专业一些,这样你就可以开始写这些东西了。

连接到action钩子和filter钩子的都是定制的PHP函数,我们或其他任何人都可以编写。

因为这些函数是通过将自己附加到WordPress钩子而进入WordPress的,也就是说,从它们的正式术语之外“钩住”就是钩住函数。

有两种钩子函数:

  1. Actions,也称为action函数,与WordPress的action挂钩,以及
  2. 过滤器,也称为过滤器函数,它与WordPress的过滤器挂钩。

让我们看看每一个。

过滤函数的使用示例

我们的第一个承包商是一个过滤器或过滤器功能。换言之,它是一个函数,通过过滤器挂钩进入工厂。

/* Environment: We're in functions.php or a PHP file in a plugin */

function wpshout_filter_example( $title ) {
	return 'Hooked: ' . $title;
}
add_filter( 'the_title', 'wpshout_filter_example' );

以下是有关上述代码的知识:

  1. 我们的过滤器,也就是说,钩住过滤器钩子的代码实际上是一个PHP函数,因此函数{}。
  2. wpu filter\u example是筛选器函数的名称。
  3. ($title)是函数的单个参数。这是WordPress工厂(WordPress核心本身)传递给承包商的工作。
  4. return'Hooked:'。$title;是函数所做的工作。它在传递的标题中添加了“Hooked:”一词,并将其返回给WordPress核心以继续定期处理。
  5. 返回非常重要:它是函数如何将其工作返回给WordPress核心的。这句话最好从右到左读:它说:“取常规标题,在前面加上‘Hooked:’,然后把它传回去。”
  6. add_filter('the_title','wpshout_filter_example');非常重要:这就是如何将过滤器函数添加到过滤器挂钩中!这应该有自己的项目清单。

下面是如何理解最后一行:

  1. add_filter();是一个WordPress函数。它说:“把一个新的过滤器挂到一个现有的过滤器挂钩上。”
  2. “标题”是我们将要进入工厂的过滤器挂钩的名称。
  3. “wpshout\u filter\u example”是承包商的名称:换句话说,就是我们编写的过滤器的名称,以及我们要连接到我们指定的过滤器挂钩(在本例中,是\u标题)的名称。

因此filter wpshout\u filter\u example()钩住filter hook的\u标题。当它这样做时,它只需在标题中添加“Hooked:”,并将其返回。有道理?

动作函数的使用示例

我们的下一个承包商是一个动作或动作函数:一个将动作挂钩带进工厂的函数。

/* Environment: We're in functions.php or a PHP file in a plugin */

function wpshout_action_example( ) {
	echo "WPShout was here.";
}
add_action( 'wp_footer', 'wpshout_action_example' );

如果您已经理解了上面的过滤器示例,那么您将了解有关WordPress操作示例的几乎所有内容:

  1. 函数wpshout\u action\u example(){}表示此操作(或操作函数)名为wpshout\u action\u example(),不带参数。
  2. echo“WPShout在这里。”是函数的作用。echo是一个PHP命令,我们稍后将讨论它。
  3. add_action('wp_footer','wpshout_action_example');是将wpshout_action_example操作挂钩到wp_footer操作挂钩的操作。

正如我们所指出的,与我们的过滤器示例的主要区别是钩住的函数不返回任何东西。相反,它直接在页面上回显(打印)消息。这条消息将打印在哪里?它将打印在页脚部分的最开始,无论主题作者在哪里放置了wp\u页脚操作钩子。

这种不同的操作可以做大多数事情,过滤器必须返回对给定内容的修改,这是这两种函数之间的主要区别,这两种函数在其他方面非常相似。

我们学到了什么

WordPress使用动作和过滤器来扩展它所能做的,从我们今天展示的愚蠢的例子,一直到像WooCommerce这样的超复杂插件。我们已经了解了钩子、动作和过滤器的用途,以及它们如何工作的基础知识。

总而言之:WordPress在WordPress页面生成过程中的特定位置注册操作和过滤器挂钩。任何开发人员都可以编写自己的函数来钩住这些操作和过滤器钩子。过滤器(或“过滤器函数”)修改所给的内容,并通过返回返回;操作(或“操作函数”)可以回显文本、修改数据和其他任何内容,并且不需要返回值。

WordPressHooks系统实际上是WordPress全面开发的门户,所以不要害怕回顾这些资料,对其进行实验,并使其成为您自己的。

WordPress日记主要承接WordPress主题定制开发PSD转WordPressWordPress仿站以及以WordPress为管理后端的小程序、APP,我们一直秉持“做一个项目,交一个朋友”的理念,希望您是我们下一个朋友。如果您有WordPress主题开发需求,可随时联系QQ:919985494