跳至正文

如何在主题定制中使用 WordPress Action Hooks

如何在主题定制中使用 WordPress Action Hooks

WordPress子主题提供了一种相对简单的方法来自定义主题的外观。如果主题的选项没有为您提供足够的设计选择,您可以向子主题的默认样式表文件添加一个名为 style.css 的新规则。但是当您还想修改主题的功能时会发生什么?这是 WordPress 操作为您提供帮助的情况之一。

WordPress 之所以如此受欢迎,部分原因在于它的高度可定制性。WordPress 核心加载了不同的挂钩,使开发人员能够修改或增强默认功能。此外,我们被允许在我们的主题和插件中包含自定义挂钩,以帮助其他开发人员轻松地根据他们的需要调整我们的代码

关于 WordPress 挂钩

WordPress 钩子的工作方式与现实生活中的钩子有点相似,如果你正确使用它们,你可以在正确的位置钓到你想要的鱼。

您可以删除捕获的功能(例如,您可以删除低级别用户的 WordPress 管理栏),您可以保持原样使用您自己的功能增强它(例如,您可以向主题添加更多菜单或小部件区域),或者您可以覆盖它(例如,您可以修改核心功能的行为)。

WordPress 中有两种不同类型的挂钩:actionsfilters在这篇文章中,我们将了解如何在主题定制中使用动作挂钩

可湿性粉剂挂钩

WordPress 挂钩如何工作

用一种非常简单的语言来说,操作表明在 WordPress 页面生命周期中发生了一些事情:网站的某些部分已经加载,某些选项或设置已经设置,插件或小部件已经初始化,等等。

过滤器在本质上不同于动作。它们用于传递数据,并在将数据呈现到屏幕或将用户数据保存到数据库之前对其进行修改、管理拦截。

WordPress 页面生命周期的每个重要里程碑处,都有一个操作或一个过滤器挂钩,我们可以向其添加自定义代码以根据需要修改默认行为。

在请求期间运行的特定操作和过滤器取决于用户代理请求的页面:例如,在单个帖子请求中,与单个帖子相关的挂钩可用,但与站点其他部分相关的挂钩(例如管理区域)不是。

查找操作挂钩

WordPress Codex 的操作参考详细概述了通过不同请求运行的操作。重要的是,如果我们想要完成一项任务,我们需要挂钩到正确的位置,而不是在它之前或之后,否则动作将无法完成。

因此,例如,如果我们想将Google Analytics 代码添加到站点,我们需要在加载页脚之前挂钩我们的操作

如果我们谈论主题定制,动作挂钩可以来自两个不同的地方:来自WordPress 核心主题本身有些主题根本没有挂钩,但其他主题为开发人员提供了一些或很多——这始终是主题作者的选择。默认的 Twentyfifteen Theme 只有一个用于页脚自定义的操作挂钩,名称为“twentyfifteen_credits”。

如果你喜欢浏览源代码,你也可以很容易地找到动作钩子。使用do_action() WordPress 函数将动作挂钩添加到代码中。

如果您在更高级的代码编辑器中快速搜索表达式“do_action”(就像我在下面的 Eclipse 中所做的那样),您可以看到一个列表,其中列出了可以将自定义功能挂接到核心的位置。我在/wp-includes/文件夹中搜索,但您也可以搜索/wp-admin/文件夹,其中包含与 WordPress 仪表板(管理区域)相关的操作挂钩。

WP 中的动作挂钩包括

好处是动作挂钩的名称通常是不言自明的,但代码中通常有一个很好的注释,可以让您更多地了解给定的动作挂钩是否适合您想要使用它的原因.

例如,’widgets_init’ 操作挂钩之前的代码注释说它“在所有默认的 WordPress 小部件都已注册后触发”。如果你看一下这个动作钩子之前的代码,你可以找到所有默认的 WP 小部件在它之前的初始化 – 所以你可以确定注释没有说谎,如果你想注册你自己的自定义小部件,这将是正确的地方。

在许多情况下,源代码为我们提供的信息比 Codex 多得多,因此学习如何在其中快速导航是个好主意。

Widgets_init 动作挂钩

添加您自己的操作

当您想添加自己的动作时,您需要创建一个自定义函数,并使用add_action() WordPress 函数将此函数绑定到特定的动作挂钩。使用 add_action() 函数添加的自定义操作通常在核心调用适当的 do_action() 函数时当场触发。

让我们看一个简单的例子。

如何找到您需要的动作挂钩

假设您想将自定义网站图标添加到您的站点。首先,您需要找到可以将您自己的功能绑定到的正确操作挂钩。

让我们想想。如果您想将网站图标添加到纯 HTML 页面,您会把它放在哪里?当然,您需要使用以下标记将它放在 HTML 文件的 <head> 部分中:

1个
<link rel="shortcut icon" href="/https://assets.hongkiat.com/uploads/wp-action-hooks-theme-customization/your-favicon.ico" type="image/x-icon" />

所以你需要的action hook一定是和section的loading相关的<head>

(1)打开Action Reference,看看它提供了什么。我们很幸运,好像我们浏览了这些动作,我们只能找到一个wp_head,根据它的名字,它有可能与 <head> 部分的加载有关。

(2)为了确定,让我们检查 WordPress Codex 中的文档Codex 建议“通过将函数回显输出到浏览器来使用此挂钩”,所以现在它对我们来说似乎是完美的。但是让我们在源代码中检查一下。

(3)由于此挂钩与管理区域无关,因此我们需要在/wp-includes/文件夹中运行我们的搜索。如果我们搜索“wp-head”这个词,我们会得到很多结果,因为 WP Core 多次使用了这个特定的操作。

我们需要寻找它被定义的地方,所以搜索表达式do_action( ‘wp_head’。注意我们没有完成括号,因为我们还不能确定这个动作是否有参数。

Eclipse 仅返回一个可在/wp-includes/general-template.php文件中找到的结果。动作钩子定义之前的注释说它“在前端的 head 标签中打印脚本或数据”,所以现在我们可以确定wp_head是我们需要的动作钩子。

找到 wp_head

检查参数

添加自己的操作时,您还需要确定要使用的挂钩是否采用参数。您可以通过查看 do_action() 函数轻松找到这一点。

do_action() 函数的语法如下:

1个
do_action( 'name_of_action'[, $parameter1, $parameter2, ...] )

只有动作的名称是必需的,参数是可选的。如果您在 do_action() 函数的相关调用中找到参数,则需要将它们包含在您创建的自定义函数的声明中

如果您没有找到,那么您的自定义函数必须在没有参数的情况下工作。在 wp_head 动作钩子的 do_action() 定义中,没有参数。

让我们将它与带有参数的动作挂钩进行比较。名为“wp_register_sidebar_widget”的操作挂钩采用一个参数,您始终必须将此参数传递给绑定到挂钩的自定义函数。

让我们看看两种情况下 do_action() 语法的区别:

1个
2个
3个
do_action( 'wp_head' );
   
do_action( 'wp_register_sidebar_widget', $widget );

在第一种情况下没有参数,因此自定义函数将使用以下语法:

1个
function my_function_without_parameters() { ... }

在第二种情况下,您始终必须将一个参数作为参数传递到自定义函数的声明中:

1个
function my_function_with_parameters( $widget ) { ... }

如何挂钩您的自定义函数

现在我们知道我们需要的一切。让我们创建我们的自定义函数,它将在我们的网站上显示一个图标。

首先,创建一个不带任何参数的新函数,然后借助add_action() WordPress 函数将其绑定到 wp_head 操作挂钩。

1个
2个
3个
4个
5个
6个
function custom_add_favicon() {
 
    echo '<link rel="shortcut icon" href="/https://assets.hongkiat.com/uploads/wp-action-hooks-theme-customization/your-favicon.ico" type="image/x-icon" />';
 
}
add_action( 'wp_head', 'custom_add_favicon');

您需要首先将动作挂钩的名称作为参数传递给 add_action() 函数 ,然后您需要添加自定义函数的名称

这是 add_action() 的两个必需参数。它也有两个可选参数,priorityaccepted arguments让我们看看如何使用这些。

定义优先级

很多情况下,同一个钩子会绑定多个动作。那么哪一个会先被执行呢?这是我们可以使用add_action() 函数的$priority 可选参数的地方。

我们将优先级添加为正整数,默认值为 10如果我们想让一个动作早点执行,我们给它一个较低的值,如果我们想让它晚些执行,我们给它一个较高的值。

所以如果我们认为 favicon 需要早点出现,我们可以通过以下方式增强我们之前的 add_action() 调用:

1个
add_action( 'wp_head', 'custom_add_favicon', 5);

请注意,必须始终相对于使用相同操作挂钩的其他自定义函数来设置优先级。

添加接受参数的数量

如果您使用带参数的操作挂钩,则需要添加接受参数的数量。让我们看看我们之前使用的示例。

动作挂钩“wp_register_sidebar_widget”接受一个参数,因此当我们将自定义函数绑定到这个挂钩时,我们还需要在调用 add_action() 函数时将其作为参数包含在内。

在这种情况下,我们的代码将如下所示:

1个
2个
3个
4个
5个
6个
function my_sidebar_widget_function( $widget ) {
 
  // Your code
 
}
add_action( 'wp_register_sidebar_widget', 'my_sidebar_widget_function', 10, 1);

请注意,我们还必须添加优先级(我们在这里选择默认的 10)以确保 WordPress 知道每个参数的含义。如果我们省略优先级,WordPress 可能会认为 1 是不正确的优先级,因为它表示接受的参数的数量。

结论

您可以在主题定制中使用动作挂钩进行许多实验。例如,您可以使用wp_enqueue_scripts操作挂钩添加自定义脚本 (JS) 和样式 (CSS) ,或者使用wp_footer操作挂钩添加 Google Analytics 代码

您不仅可以添加自己的操作,还可以使用remove_action()函数从 WordPress 核心中删除完整的功能,该函数使用与 add_action() 相同的逻辑。

如果您是主题作者,并且想制作一个可扩展的主题,那么使用 do_action() 函数将您自己的自定义操作挂钩添加到适当的模板文件中是个好主意。

如果你想这样做,请仔细考虑使用你的主题的其他开发人员在他们想要挂钩他们的自定义功能时必须作为参数传递的参数。

在设计主题的自定义操作挂钩的位置时,请不要忘记将自定义主题挂钩包含在 WordPress 核心本身具有自己的挂钩的相同位置上没有多大意义

标签: