WordPress 钩子:基本指南
已发表: 2021-01-26WordPress hooks 是一个有用的工具,专为制作 WordPress 插件和主题的开发人员而设计。 事实上,它们非常有用,以至于 WordPress 的创建者在整个 WordPress 核心中都使用它们。 但究竟什么是 WordPress 钩子以及如何使用它们?
在本指南中,我们将看看如何有效地使用 WordPress 钩子并深入了解基础知识。 让我们潜入吧!
什么是 WordPress 中的钩子?
简而言之,WordPress 钩子是 WordPress 代码片段,用于抓取和执行其他 WordPress 代码片段。 它们基本上允许开发人员在他们的主题和插件中轻松地在各种文件之间跳转。WordPress 挂钩打包在 WordPress 核心中。 每个主题和插件也使用它们。
WordPress 钩子解释
WordPress 中钩子的主要目的是允许开发人员从根本上改变内容管理系统的运行方式,而无需更改 WordPress 核心文件。 因为 WordPress 是开源的,所以您可能会弄乱核心文件,但您有 99% 的机会会在几分钟内后悔。
尽管对于新的开发人员来说可能有点难以理解,但了解 WordPress 挂钩的工作原理绝对至关重要。 很多时候,由于 WordPress 使用的术语,会出现混淆。 尽管幕后操作与许多编程语言的操作非常相似,但措辞不同。 通过首先遵循示例,阅读它们,然后练习来学习如何创建和使用它们通常是最容易的。
为了编写 WordPress 挂钩,您需要能够使用 PHP 进行编码。 PHP 是绝大多数 WordPress 的基础语言。 您可以将钩子视为其他 PHP 函数可以锁定的开口。 您还可以将 WordPress 挂钩视为在用户看到数据之前对数据或显示执行某些操作的回调。

两种类型的 WordPress 钩子
您需要学习两种主要类型的 WordPress 挂钩:
- WordPress 动作挂钩
- WordPress 过滤器钩子
让我们来看看这两种类型的 WordPress 挂钩以及它们的区别。 我们还将探讨一些动作钩子和过滤器钩子的例子,以更好地说明它们的用法。
WordPress Action Hooks 和 Filter Hooks 的区别
如果您花时间查看 WordPress 的手抄本,您可能已经看到这些术语随手乱扔。 不幸的是,该代码的弱点之一是它是由开发人员自己编写的。 作为副作用,一些对他们来说可能很明显的重要区别,对于那些不熟悉 WordPress 核心代码的人来说并不明显。
区分两种类型的 WordPress 钩子的最简单方法是操作钩子不返回值,而过滤器钩子会返回值。对于熟悉常用编程语言的人来说,这就像说动作挂钩具有“void”返回类型,而过滤器挂钩返回实际数据。
过滤器钩子可以被认为是预处理钩子或事件。 过滤器挂钩可能会过滤从数据库查询返回的结果,使其仅包含姓氏为“Smith”的条目。 这个过滤器钩子应该在调用实际的数据库查询之前调用,提前告诉 WordPress 在返回它们之前它需要取出不相关的结果。
WordPress 动作钩子可以被认为是通过代码检索某些东西。 动作挂钩的一个常见示例是向站点页面插入额外的 CSS 文件以使其显示不同。 请记住,挂钩甚至在将数据交付给用户之前就改变了数据的显示方式。 动作钩子提供了一个新的 CSS 文件,使用户体验更好。 此过程不涉及编辑 WordPress 的核心,也不需要编辑站点的核心 Web 根目录。 通过这种方式,WordPress 挂钩可以与插件一起更轻松地管理多个 WordPress 站点。
钩子和过滤器解释
现在我们已经对 WordPress 钩子和过滤器进行了更抽象的概述,让我们深入了解这些功能的更多技术细节。
您可以将 WordPress 挂钩视为带有名称的事件。 包含在 WordPress 核心中的一个示例称为save_post 。 对于钩子,我们本质上说当save_post被执行时,我们希望我们的钩子或过滤器附加并与它一起运行。
我们将所谓的回调或回调函数附加到 WordPress 的钩子上。 这只是一种奇特的说法,即我们要求 WordPress 在触发我们“挂钩”的事件时运行我们创建的函数中包含的代码(例如上面示例中的save_post )。
虽然添加 WordPress 钩子很容易,正如我们稍后将探讨的那样,但请记住,一个编写不当的回调可能会完全破坏您的回调链。 如果发生这种情况,回调链中的一个断开的链接可能会完全破坏您的所有辛勤工作! 在进行更改之前始终进行备份。 在进行任何更改之前,请利用值得信赖的 WordPress 备份插件。
对钩子如何工作背后的更多技术细节感兴趣? 看看下一节! 我们有更深入的解释以及创建第一个动作钩子和第一个过滤器钩子的教程!
WordPress 中的 Hooks 是如何工作的?
请记住,尽管存在一些差异,但 WordPress 中的动作钩子和过滤器钩子可以被视为大致相同。 让我们简要介绍一下这些钩子是如何工作的。 我们将在本文后面介绍一个示例和教程。
这两种类型的钩子都需要在使用前向 WordPress 注册。 这为 CMS 提供了当我们“挂钩”了我们的代码的事件运行时要附加的函数列表。 此外,请确保将操作注册为操作,并将过滤器注册为过滤器。
添加操作时,请利用 WordPress 核心函数add_action() 。 添加过滤器时,使用名为add_filter()的相应 WordPress 核心函数。 如果您的回调(在您的事件或操作运行时沿链向上运行)不返回任何数据,您需要将其注册为一个操作。 如果它返回 WordPress 所指的可过滤数据,则将其注册为过滤器。
当您的站点被用户打开时,您在这些函数中指定的任何内容都会运行。 WordPress 有一个内部生成器,可以为我们将所有这些操作和过滤器放在一起。 动作和过滤器也有相应的去除功能。 这些可用于从回调链中消除函数。 它们通常包含在 WordPress PHP 的条件语句中。
就像我们的添加函数一样,它们被称为remove_action()和remove_filter() 。
如何在 WordPress 中创建钩子?
终于到了我们在 WordPress 中制作第一个钩子的时候了! 请记住,创建挂钩涉及添加将向我们网站的用户显示和呈现的自定义代码。
请注意,每当我们添加自定义代码时,都会增加一定程度的安全风险。 这就是为什么现在是确保您拥有可信任的 WordPress 安全插件并准备就绪的理想时机。 这可以帮助您高枕无忧,并通过可能引入新漏洞的自定义代码减轻对您网站的任何潜在威胁。
让我们来看看如何在 WordPress 中制作一个非常简单的动作钩子。 然后我们将看一个 CMS 中过滤器钩子的例子。
如何在 WordPress 中创建动作挂钩?
对于我们的操作示例,让我们做一些几乎所有 WordPress 开发人员在某个时候都需要做的事情:调整 WordPress 登录页面上的内容。 该页面非常通用。
例如,如果您为学术机构管理 WordPress 网站,他们可能会要求您提醒学生使用他们的校园电子邮件地址登录他们的 WordPress 门户。 我们可以在“用户名”和“密码”框下添加一个简单的提醒,上面写着“记住使用您的@myuniversity.edu 电子邮件作为您的用户名”,以减少向 IT 部门寻求帮助登录的电话。
当然,这将更符合动作钩子而不是过滤器钩子。 这是因为一个简单的调整,比如编辑主用户登录页面上的文本,实际上并没有返回任何数据进行过滤。
首先,我们需要弄清楚究竟在哪里挂钩我们的行动。 在大多数情况下,查看您想要添加内容的 PHP 文件可能非常有见地。 查看包含登录内容的 WordPress 文件,有几个操作触发器。 在我们提醒学生使用其机构电子邮件的示例中,您会注意到登录页面的 PHP 文件中的以下代码非常有趣:
do_action('login_footer');
do_action函数是 WordPress 的核心函数,它根据请求执行我们的动作挂钩。 当然,前提是我们已经注册了我们想要附加到这个钩子的所有函数。
在这种情况下,“login_footer”是 WordPress 团队的预制钩子。 尽管它是内置的,但我们仍然可以将我们自己的代码附加到它上面。 默认情况下,此挂钩加载通用登录页面的页脚内容。 页脚将是我们文本的理想位置,这就是我们利用此页面部分挂钩的原因。
我们可以在 wp-login.php 中添加一个新的 PHP 函数来开始。 我们需要做的就是输出一行文本,如下所示:
函数 add_uni_email_reminder() { <p>记住使用您的@myuniversity.edu 电子邮件作为您的用户名!</p> } do_action('login_footer', 'add_uni_email_reminder');
在这种情况下,我们只是在wp-login.php 文件中创建了一个新的“操作”。 动作钩子(add_uni_email_reminder)的函数名称,不带参数括号,可以添加到do_action()的参数列表中,以注册它在下一次渲染页脚时运行。

如何在 WordPress 中创建过滤器挂钩?
现在我们开始了! 我们已经学习了 WordPress 钩子的基础知识以及如何利用它们的力量。 我们甚至自己进行了一些修改! 剩下的唯一主要部分是练习过滤器钩子。 请记住,这些钩子会返回我们可能会过滤的某种类型的数据。 这些比动作钩子复杂一点,但是现在您了解了钩子的基础知识,它应该更容易一些。
让我们开始使用我们的 WordPress 过滤器钩子。 首先,我们需要决定要添加的特定过滤器。 您的客户可以请求的一项是自定义页面添加功能。 这是 WordPress 用户可以添加新博客文章的地方。 为了尽可能简单,假设我们要编辑“标题”文本框中包含的文本“在此处输入标题”。 假设我们想让它更具体,而是让它说“输入博客文章标题”。
请注意,在下面的过滤器钩子示例中,我们的函数有一个参数。 此外,我们过滤器的实际执行还有一个额外的“优先级”参数。 您还会注意到,我们用来注册钩子的实际函数与我们的“动作”示例add_action完全相同。 我们可以告诉这个函数是一个过滤器钩子而不是一个动作钩子的方式是,当它实际运行时,我们在 WordPress 核心代码中看到的执行的函数是apply_filters( 'enter_title_here', __( 'Enter title here' ), $post ); . 正如函数名称所强烈暗示的那样,我们正在应用过滤器。
对于新用户来说,这通常是一个跳闸点。 这实际上只是一个轻微的措辞问题; 一旦你克服了这一点,破解 WordPress 中钩子和过滤器之间的区别就变得非常简单! 事不宜迟,让我们深入研究更改占位符文本!
函数 our_new_title_here( $title ) { $title = __( '输入博客文章标题', 'text-domain' ); 返回 $title; } add_action( 'enter_title_here', 'our_new_title_here', 10 );
您可能想知道“10”在我们的add_action函数中是什么意思。 希望您了解前两个参数; 第一个是默认的 WordPress 钩子,第二个是我们附加到enter_title_here的函数和过滤器的名称。 “10”是我们分配给这个过滤器的优先级。
请记住,WordPress 中的操作和过滤器都是一系列运行的级联“回调”或自定义函数。 这些被赋予不同的优先级。 稍后我们将探讨不同数字的含义、可接受的参数等。 但是,重要的是要了解 10 是目前 WordPress 默认的过滤器和操作的“正常”优先级。
WordPress 钩子存储在哪里?
您可能想知道 WordPress 可能在哪里存储所有这些操作和过滤器。 我们已经引用了 WordPress 核心,但这只是内置操作和过滤器以及附加到它们的功能的位置。 经验丰富的 WordPress 用户可能知道这些钩子没有存储在安装 WordPress 时创建的任何数据库中。
WordPress 中操作和过滤器最独特的功能之一是它们并没有真正“存储”在任何地方! 一旦我们添加了一个操作或过滤器,就可以在我们的 WordPress 站点中全局访问该操作或过滤器。 如果您认为不可能将它存储在任何地方,那么您是对的!
尽管结构相当复杂,但有一个 PHP 变量用于存储我们所有的操作和过滤器。 此变量是全局变量,称为$wp_filter 。 不要直接弄乱这个变量!
对于那些对技术细节感兴趣的人,这个变量$wp_filter是一个 PHP 数组。 它拥有大量类型为WP_HOOK的对象。 在您可以在wp-includes/class-wp-hook.php 中读取的 PHP 文件中,有一个重要的方法: this->apply_filters() 。 这个方法会触发我们所有的回调并“注册”我们的自定义过滤器和钩子。 它本质上是 WordPress 钩子的基本要素。
为了充分利用 WordPress 的这一强大功能,我们需要了解一些最常见的 WordPress 挂钩。 看看下面的备忘单吧!
WordPress 钩子列表:WordPress 钩子备忘单
让我们从一点点现实主义开始:我们不可能遍历 WordPress 中的每一个钩子。 值得庆幸的是,一些研究人员为那些好奇的人编制了一份(字面上)每个动作和过滤器的列表。 您可以在此处查看所有 WordPress 挂钩的完整列表,但请注意查看有关每个挂钩的安全警告。 您不应使用任何标记为“已弃用”的内容。 这意味着它们可能在最现代的 WordPress 版本中受支持,也可能不受支持,但无论哪种方式,它们很快都将不受支持。
很有可能,90% 的情况下,您只会对几个 WordPress 挂钩感兴趣。 以下是 WordPress 中五个最受欢迎的操作和过滤器,以及它们的简要说明!
- add_setting() – 顾名思义,此操作会添加到您的 WordPress 设置中。 您可能不想在任何面向用户的页面上包含此操作,但如果您正在修改管理页面,它可以成为救命稻草。
- apply_filters() – 这个看起来很眼熟吗? 它应该,因为我们之前使用过它! 这会立即调用与钩子关联的整个回调链。
- esc_attr() ——这个名字是“escape HTML attributes”的简写。 转义 HTML 意味着我们对 HTML 符号使用 ASCII 代码。 这几乎普遍用于“清理输入”到页面。 换句话说,当用户提交表单时,非常希望将此操作附加到挂钩运行。 它尤其可以防止用户使用跨站点脚本攻击来攻击您的站点。
- the_content() – 这个钩子的名字可能听起来很简单,因为它是! 它只是获取正在查看的当前帖子的内容。 如果您允许用户导出帖子的内容,这是理想的选择。 例如,某些站点为高级用户提供将任何文章导出为 PDF 文件的功能。
- wp_nav_menu() – “WordPress 导航菜单”的简写,这个钩子是一个动作钩子。 它用于简单地显示您在首次创建 WordPress 网站时创建的主导航菜单。 如果您的页面具有明显不同的布局并希望在替代区域中显示您的菜单,这非常有用。
WordPress Hooks 以什么顺序运行? WordPress Hooks 触发序列
不幸的是,WordPress 挂钩运行的确切顺序并不像您想象的那么明显。 这是由于钩子的数量庞大。 一位研究人员对此进行了高级分析,以计算访问 WordPress 网站主页时运行的钩子数量和运行顺序。
好像这还不够复杂,一些 WordPress 钩子附有不同优先级的钩子! 您可以在这篇关于 WordPress 钩子触发序列的帖子中查看数百个钩子运行及其顺序。 请注意:除了测试服务器之外,您不应尝试在任何东西上运行此分析,在那里您可以承受失去一切!
虽然我们对默认钩子的顺序无能为力,但我们可以对我们指定的钩子顺序做一些事情。 这就是钩子优先级的用武之地。我们之前提到过。
WordPress Hooks 中的优先级是如何工作的?
正如我们提到的,WordPress 分配给钩子的默认优先级是“10”。 无论您决定设置优先级,请记住该值必须是正整数。 这意味着,不幸的是,“0”不是有效值。 此外,-100 无效,0.5 无效。 但是,1 和 1111 一样有效。
一般来说,整数越小,优先级越低。 例如,如果您希望钩子在分配了默认值 10 的钩子之后运行,您可以将其优先级设置为 9。您的最低优先级钩子可以设置为 1。此外,可以为 WordPress 钩子分配相同的优先事项。 这是如果您不在乎它们运行的顺序。
总结:WordPress 中的钩子
对于新的 WordPress 开发人员来说,最大的绊脚石之一是这些信息的大部分是非标准化的。 虽然您会发现大量的技术博客,但很多都涵盖了狭窄的主题,而且很难汇总。
最好的方法是开始在您的网站上试验 WordPress 动作挂钩和过滤器挂钩。 一旦你制作了更复杂的 WordPress 钩子,你就需要学习你更经常使用的钩子。 随着时间的推移,你会记住这些钩子。 这是一个艰巨的过程,没有人能够记住这些钩子中的每一个。
WordPress 手抄本是您成为世界下一个顶级 WordPress 开发人员的旅程中最好的资源。
自 2011 年以来,Kristen 一直在编写教程来帮助 WordPress 用户。您通常可以找到她为 iThemes 博客撰写新文章或为 #WPprosper 开发资源。 工作之余,克里斯汀喜欢写日记(她写了两本书!)、远足和露营、烹饪以及与家人一起进行日常冒险,希望过上更现代的生活。
