WordPress钩子详解:如何使用动作、过滤器和自定义钩子

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

WordPress钩子(Hook)是WordPress开发人员的武器库中最重要的工具之一。它们是WordPress插件和主题开发的基础。您可以使用WordPress的许多内置钩子将自定义代码“连接到”WordPress核心,并执行修改某些内容。

有两种类型的WordPress钩子:ActionsFilters。Hook非常普遍,甚至WordPress Core本身也广泛使用它们。WordPress还提供了一种让您定义自己的自定义钩子的方法,以便其他开发人员可以挂钩到您的代码中。

了解动作、过滤器和自定义钩子的工作原理对于掌握WordPress开发至关重要。

本文的前半部分介绍了WordPress钩子的基础知识,并解释了它们如何与多个示例一起工作。在后半部分,您将学习如何使用钩子来自定义WordPress,创建自己的自定义钩子,并使用它们来构建自己的可扩展插件。

  1. 什么是WordPress钩子?
  2. 钩子 vs 动作 vs 过滤器
  3. WordPress钩子如何工作?
  4. 在哪里注册钩子及其函数?
  5. 使用WordPress钩子
  6. WordPress钩子列表和资源
  7. 查找在WordPress页面上注册的钩子
  8. “所有”钩子
  9. WordPress钩子存储在哪里?
  10. 如何创建自定义WordPress钩子
  11. 从WordPress钩子中删除回调函数
  12. 更多WordPress钩子教程

什么是WordPress钩子?

一个WordPress的页面是由很多的功能和数据库查询组装。WordPress核心、插件和主题协同工作以输出页面元素,如文本、图像、脚本和样式。完全组装后,浏览器会将它们放在一起并呈现页面。

WordPress钩子允许您在某些点“钩入”这个构建过程并运行您的自定义代码。钩子的主要功能是让你在不接触核心文件的情况下修改或添加功能到WordPress 。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

钩子将帮助您使用自己的代码扩展WordPress

WordPress的插件API赋予WordPress钩子的功能。您可以通过在WordPress运行时在特定实例中调用某些称为Hook Functions的WordPress函数来使用钩子。

使用钩子函数,您可以将自定义代码捆绑在回调函数中,并将其注册到任何钩子中。注册后,此回调将在钩子所在的任何地方运行,允许您增加或替换默认的WordPress功能。

钩子在代码执行过程中的位置是一个重要的因素。您将在接下来的部分中详细了解其重要性。

两种类型的WordPress钩子:动作和过滤器

WordPress包括两种类型的钩子,称为ActionsFilters。动作允许您在WordPress运行时的某些预定义点执行某些操作,而过滤器允许您修改WordPress处理的任何数据并返回这些数据。

动作Actions)在WordPress代码中定义为:

do_action( ‘action_name’, [optional_arguments] );
do_action( ‘action_name’, [optional_arguments] );
do_action( 'action_name', [optional_arguments] );

action_name字符串是动作的名称。您可以指定[optional_arguments]变量以将附加参数传递给回调函数。如果未指定此字段,则其默认值将为空。

示例:do_action( 'wp_head' )每次WordPress处理站点标题时,都可以挂接该动作以运行自定义代码。此动作没有任何其他参数。

过滤器(Filters)在WordPress代码中定义为:

apply_filters( ‘filter_name’, ‘value_to_be_filtered’, [optional_arguments] );
apply_filters( ‘filter_name’, ‘value_to_be_filtered’, [optional_arguments] );
apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );

filter_name字符串是过滤器的名称,value_to_be_filtered变量是被过滤和返回需求,和值[optional_arguments]变量可以通过附加参数,就像动作。

例如:apply_filters( 'admin_footer_text' , string $text )过滤器可以是钩状来修改在管理页脚显示的文本。从WordPress 5.4开始,其默认值将 在管理区域页脚中显示该句子。Thank you for creating with WordPress.

稍后您将通过WordPress核心中的许多示例学习如何动作和过滤器钩子。

上钩后,您可以指导您的代码在您的网站上执行自定义某些内容。例如,您可以使用钩子在发布文章后自动发送电子邮件,或加载自定义样式表来更改站点的外观。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

WordPress钩子可帮助您与网站互动或修改您的网站

理解钩子的最简单方法是将您的WordPress网站想象成盖房子。

钩子类似于使用起重机来回移动建筑物品。正在传输的项目是回调函数,其中包括您的自定义代码。这些项目(或功能)可以帮助您建造或改造房屋。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

在WordPress中“wp_head”动作钩子的示例

回调函数可以是常规PHP函数、默认WordPress函数或您定义的自定义函数。

我们只能在连接到特定挂钩的特定载体上运输某些物品。因此,动作只能与动作函数挂钩同样,过滤器只能与过滤器函数挂钩。

虽然更换起重机上的吊钩和托架很乏味,但WordPress通过包含超过2,200种默认钩子使其变得非常容易。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

WordPress 5.1有2200多个原生钩子(来源:Adam Brown)

您可以找到遍布WordPress核心的钩子,让您可以进入要钩子的确切位置并运行您的自定义代码。

钩子 vs 动作 vs 过滤器

根据WordPress插件手册

钩子是一段代码交互/修改另一段代码的一种方式……钩子有两种类型:动作和过滤器。

术语HookActionFilter的使用方式存在广泛的不一致。一些教程和指南将它们与与之相关的函数混合在一起。这种混淆存在的一个主要原因是钩子工作方式的复杂性。

即使您仔细查看WordPress核心内部,您也会发现添加动作和过滤器之间没有太大区别。下面是为ADD_ACTION()函数的源代码wp-includes/plugin.php文件:

function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}
function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}
function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {      
return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}

add_action()函数只是调用该add_filter()函数并返回其值。为什么?因为它们从根本上以相同的方式工作,除了一个区别。

apply_filters()函数返回一个可以更改现有数据类型的值,而该do_action() 函数不返回任何内容(PHP中的NULL值)。

如果您仍然感到困惑,请不要担心!读完本文的前半部分后,一切就都清楚了。我们将坚持使用官方的WordPress Codex术语,因为它清晰、准确且通用。

现在,让自己熟悉下面显示的钩子例程。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

钩子程序:钩子、钩子函数和回调函数

让我们分解一下Actions和Hooks之间的区别。

WordPress钩子
动作 过滤器
动作用于在WordPress Core执行期间的特定点运行自定义函数。 过滤器用于修改或自定义其他功能使用的数据。
动作由do_action( ‘action_name’ )WordPress代码中的函数定义/创建。 过滤器由apply_filters( ‘filter_name’, ‘value_to_be_filtered’ )WordPress代码中的函数定义/创建。
动作也称为动作钩子 过滤器也称为过滤器钩子
动作只能与动作函数挂钩。例如add_action()remove_action() 过滤器只能与过滤器函数挂钩。例如add_filter()remove_filter()
动作函数不需要向它们的回调函数传递任何参数。 过滤器函数需要至少传递一个参数给它们的回调函数。
动作函数可以执行任何类型的任务,包括改变WordPress工作方式的行为。 过滤器函数仅用于修改过滤器传递给它们的数据。
动作函数应该return没什么。但是,它们可以echo输出或与数据库交互。 过滤器函数必须将return其更改作为输出。即使过滤器函数什么都不改变,它仍然必须return是未修改的输入。
只要代码有效,动作几乎可以执行任何操作。 过滤器应该以孤立的方式工作,因此它们不会产生任何意外的副作用。
总结:一个动作会中断常规的代码执行过程,用它接收到的信息做一些事情,但什么都不返回,然后退出。 总结:过滤器修改它接收到的信息,将其返回给调用钩子函数,其他函数可以使用它返回的值。

 

有时,您可以使用动作或过滤器来实现相同的目标。例如,如果您想修改文章中的文本,您可以使用publish_post动作注册一个回调函数,并在将文章内容保存到数据库时更改文章内容。

// define the callback function to change the text
function change_text_callback() {
// add the code to change text here
}
// hook in to the ‘publish_post’ action with the add_action() function
add_action( ‘publish_post’, ‘change_text_callback’ );
// define the callback function to change the text
function change_text_callback() {
// add the code to change text here
}
// hook in to the ‘publish_post’ action with the add_action() function
add_action( ‘publish_post’, ‘change_text_callback’ );
// define the callback function to change the text
function change_text_callback() { 
// add the code to change text here
}
// hook in to the 'publish_post' action with the add_action() function
add_action( 'publish_post', 'change_text_callback' );

或者您可以使用the_content过滤器注册另一个回调函数,以在浏览器中显示之前修改文章内容。

// define the callback function to modify the text
function change_text_another_callback( $content ) {
// add the code to change text here and then return it
return $filtered_content;
}
// hook in to ‘the_content’ filter with the add_filter() function
add_filter( ‘the_content’, ‘change_text_another_callback’);
// define the callback function to modify the text
function change_text_another_callback( $content ) {
// add the code to change text here and then return it
return $filtered_content;
}
// hook in to ‘the_content’ filter with the add_filter() function
add_filter( ‘the_content’, ‘change_text_another_callback’);
// define the callback function to modify the text
function change_text_another_callback( $content ) { 
// add the code to change text here and then return it 
return $filtered_content;
}
// hook in to 'the_content' filter with the add_filter() function
add_filter( 'the_content', 'change_text_another_callback');

两种不同的方法,结果相同。知道何时使用一个而不是另一个是成为优秀WordPress开发人员的关键。

WordPress钩子如何工作?

房子的例子很简单,可以理解钩子的基本功能,但它没有捕捉到它们如何工作的复杂性。最重要的是钩位置和特异性的概念。

一个更好的例子是将处理WordPress网页想象成组装汽车。与制造汽车需要时间不同,组装网页几乎是瞬间完成的。

WordPress钩子详解:如何使用动作、过滤器和自定义钩子

组装网页就像组装汽车

就像汽车如何在现代装配线中逐个组装在一起一样,WordPress网页由服务器和客户端逐个组装。

WordPress核心就像汽车引擎、底盘和其他必需品,为网站的“核心”功能提供动力。

您可以仅使用WordPress核心就拥有一个功能强大的网站,但这有什么乐趣呢?您需要向站点添加令人兴奋的功能。这就是WordPress插件和主题介入的地方,它们都广泛使用钩子。

在上面的示例中,每个编号的站点就像WordPress核心中的一个钩子。有两种类型的站点,例如动作和过滤器。每个站都包含一个特定类型的插槽,它只接受某些工具,类似于动作函数和过滤器函数。

为了模块化和效率,所有站点都以频繁的间隔放置。

根据特定位置的要求,我们可以为该特定站点的工作安装(或钩子)最合适的工具。这些工具就像用于与WordPress交互或修改WordPress的回调函数。

一些工具可以显着改变汽车的工作,就像注册到动作的回调一样。其他工具仅用于自定义汽车的外观,例如注册到过滤器的回调。

在正确的站点使用正确的工具对于制造一流的汽车至关重要。同样,钩子帮助我们根据我们的独特需求定制WordPress。

如果你扩展这个类比,插件就像添加有用的汽车功能,如安全气囊、娱乐控制台、远程无钥匙系统等(像这些是为了增强WooCommerce的功能)。主题类似于自定义汽车的视觉部分,例如整体设计、喷漆、轮辋等(这是自定义WordPress主题的方法)。

在哪里注册钩子及其函数?

在WordPress中添加钩子有两种推荐的方法:

  • 插件:制作您自己的插件并在其中添加所有自定义代码。
  • 子主题:在子主题的functions.php文件中注册钩子和回调函数。

对于本教程,让我们从创建插件开始。为此,请在您的/wp-content/plugins/目录中创建一个新文件夹。

我给我的插件命名salhooks,但你可以随意命名它。根据 WordPress 指南,您需要在插件目录中创建一个具有相同名称 (salhooks.php )的PHP文件。

将以下标题字段添加到您的插件文件以将其注册到WordPress。您可以在WordPress Codex中了解有关插件标头要求的更多信息。

<?php
/*
Plugin Name: Salhooks
Version : 1.0
Description: Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.
Author : Salman Ravoof
Author URI : https://www.salmanravoof.com/
License : GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: salhooks
*/
//=================================================
// Security: Abort if this file is called directly
//=================================================
if ( !defined(‘ABSPATH’) ) {
die;
}
<?php
/*
Plugin Name: Salhooks
Version : 1.0
Description: Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.
Author : Salman Ravoof
Author URI : https://www.salmanravoof.com/
License : GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: salhooks
*/
//=================================================
// Security: Abort if this file is called directly
//=================================================
if ( !defined(‘ABSPATH’) ) {
die;
}
<?php
/*
Plugin Name:  Salhooks
Version    :  1.0
Description:  Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.
Author     :  Salman Ravoof
Author URI :  https://www.salmanravoof.com/
License    :  GPLv2 or later
License URI:  https://www.gnu.org/licenses/gpl-2.0.html
Text Domain:  salhooks
*/
//=================================================
// Security: Abort if this file is called directly
//=================================================
if ( !defined('ABSPATH') ) { 
die;
}

保存此文件,然后在您的WordPress仪表盘中激活该插件。我将在本地WordPress安装中使用这个插件来演示钩子是如何工作的。

作为旁注,您还可以直接编辑WordPress核心文件以注册钩子。但是,不建议这样做,因为每次更新WordPress时,您的所有自定义代码都会被覆盖。出于同样的原因,您不应该在父主题中添加钩子。

使用WordPress钩子

一个WordPress钩子本身什么都不做。它只是坐在代码中,等待一些钩子函数来激活它。要使用钩子,您至少需要调用2个其他函数。

首先,您需要使用钩子函数注册钩子并在其中引用回调函数。然后你需要定义你之前在钩子函数中提到的回调函数。每次触发钩子时,WordPress都会运行此回调函数。

定义这些函数的顺序无关紧要,但最好将它们放在一起。

动作和过滤器具有不同的钩子函数。从现在开始,让我们将它们称为Action FunctionsFilter Functions。正如您将看到的,它们有自己的语法和参数要求。

  1. 钩住一个动作
  2. 钩住过滤器
  3. 使用Hooks自定义WordPress登录页面

钩住一个动作

动作提供了一种在WordPress 核心、插件或主题执行中的特定点运行自定义代码的方法。

add_action() 动作函数

您可以按照以下步骤使用动作注册回调函数:

  1. 定义一个带有自定义代码的回调函数。当WordPress的代码执行期间触发它注册到的任何动作时,此回调函数将运行。
  2. 使用该add_action()函数将您的回调函数连接到您想要的动作。根据WordPress Codex,add_action()函数至少需要传递两个参数:
      • 要挂钩的动作的名称。
      • 触发动作时将运行的回调函数的名称。
  3. add_action()函数还接受两个可选参数来设置prioritynumber of arguments。我们稍后会讨论它们。

最好将回调函数参数命名为尽可能接近钩子函数传递的参数。

让我们看一个使用该add_action()函数的例子。

// define the callback function, the arguments are optional
function example_callback(
重要声明

本网站的文章部分内容可能来源于网络,如有侵犯你的权益请联系邮箱:wxzn8@outlook.com
站内资源为网友个人学习或测试研究使用,未经原版权作者许可,禁止用于任何商业途径!请在下载24小时内删除!本站资源大多存储在云盘,如发现链接失效请反馈,我们会及时更新。

给TA打赏
共{{data.count}}人
人已打赏
WordPress开发学习

WordPress调试完整指南(启用WP_DEBUG + 其他工具)

2023-1-13 18:44:08

WordPress开发学习

如何开发一款WordPress子主题

2023-1-13 18:53:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索