< >头 利用WordPress Hooks的力量:动作和过滤器解释| Toptal®-欧博体育app下载作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Tahir沙赫扎德
验证专家 在工程

Tahir是一个专注于WordPress和AI的全栈web开发人员. 他曾在几个WordPress聚会和wordcamp上担任演讲嘉宾.

以前在

Evamp & Saanga
分享

像任何CMS一样, WordPress 不会总是一开始就满足你的所有需求. 因为它是开源的, 您可以修改它,使其符合您的业务需求,但相反, 你可以使用WordPress的钩子来实现你的目标. 用钩子建造房屋是一种成功的策略,它能让人解脱 WordPress的开发者 构建几乎任何可以想象的网站功能.

WordPress钩子:动作和过滤器

WordPress 钩子 不只是强大的定制工具吗, 它们是WordPress组件彼此交互的方式. 钩接函数管理许多我们认为是WordPress的一部分的日常任务, 例如向页面添加样式或脚本, 或者用HTML元素包围页脚文本. 搜索一下WordPress Core的代码库就会发现 成千上万的钩子 在700多个地点. WordPress主题和插件包含更多的钩子.

在我们进入钩子并探索动作钩子和过滤器钩子之间的区别之前, 让我们来了解一下它们在WordPress架构中的位置.

WordPress的基础设施

WordPress的模块化元素很容易相互集成, 所以我们可以很容易地混合, 匹配, 并结合:

  1. WordPress核心: 这些是 WordPress工作所需的文件. WordPress Core提供通用架构, WP管理仪表板, 数据库查询, 安全, 和更多的. WordPress核心是写在 PHP 并使用MySQL数据库.
  2. 主题(或父主题): A 主题 定义了网站的基本布局和设计. PHP支持, HTML, JavaScript, 和CSS文件, 主题通过读取WordPress MySQL数据库来生成在浏览器中呈现的HTML代码. 例如,主题中的钩子可以添加样式表、脚本、字体或自定义帖子类型.
  3. 儿童主题: 我们自己创建子主题来微调父主题提供的基本布局和设计. 子主题可以定义样式表和脚本来修改继承的特性或添加或删除帖子类型. 子主题指令总是取代父主题指令.
  4. 插件(s): 要扩展WordPress的后端功能,我们可以选择 数以千计的第三方插件. 插件中的钩子可以, 例如, 当帖子发布或隐藏用户提交的包含禁止语言的评论时,通过电子邮件通知我们.
  5. 自定义插件(s): 当第三方插件不能完全满足业务需求时, 我们可以通过在PHP中编写自定义插件来增强它. 或者我们可以从头开始编写一个新的插件. 在这两种情况下,我们都要添加钩子来扩展现有的功能.

金字塔显示, 从头到尾, 五个级别:(1)WordPress Core, (2)主题, (3)儿童主题, (4)插件, (5)自定义插件.
WordPress基础架构层次

既然我们可以访问所有五个层的源代码,为什么WordPress还需要钩子呢?

代码安全

为了跟上不断发展的技术, WordPress核心贡献者, 父主题, 并且插件经常发布更新以减轻安全漏洞, 修正错误, 解决不兼容, 或者提供新功能. 任何有急救经验的顾问都知道, 未能使WordPress组件保持最新 可以妥协,甚至 禁用站点.

如果我们直接修改上游WordPress组件的本地副本, 我们遇到了一个问题:更新覆盖了我们的自定义. 我们如何在定制WordPress时规避这个问题? 通过钩子,在子主题和自定义插件.

在我们的孩子主题编码

A 儿童主题 是一个安全的空间,我们可以自定义我们安装的主题的外观和感觉. 此处添加的任何代码都将覆盖父类中的可比代码,而不会有被更新覆盖的风险.

子主题被激活时, 它链接到一个未激活的父节点, 继承和展示父代的特征,同时不受父代更新的影响. 为了不受诱惑而修改主题, 最佳实践建议激活子主题作为我们设置的一部分.

编写自定义插件

当一个插件被激活时 功能.php 文件在服务器上的每次调用时执行. WordPress, 反过来, 根据所有活动插件的优先级加载和排序钩子,并依次执行. 要扩展第三方插件的功能,我们可以 编写我们自己的WordPress自定义插件.

在哪里放置我们的钩子在WordPress

目标例子在哪里? 
  子主题PHP自定义插件PHP
修改网页的结构添加自定义样式表来更改网站元素的颜色和字体 
修改另一个插件的功能.e.,创建一个插件来增强第三方插件的功能)添加副标题(例如.g.(“新闻”)来自定义帖子类型 
添加一个超越WordPress核心的新功能修改访问邮件时发生的工作流,以包括更新数据库中的计数器 

潜水前准备:定义

为了避免混淆术语,我们将坚持使用以下术语:

  • A 在WordPress中,函数注册运行是一个甜蜜点吗. 我们可以将我们的函数连接到WordPress及其组件中的一个钩子上,或者创建我们自己的钩子.
    • An 行动钩 运行操作.
    • A 过滤钩子 运行过滤器.
  • A 连接函数 是自定义PHP 回调 函数,我们已经“钩”到一个WordPress钩子位置. 使用哪种类型取决于钩子是否允许在函数e之外进行更改.g.,直接添加到网页输出,修改数据库,或发送电子邮件. 这些被称为 副作用.
    • A 过滤器 (or 滤波函数)应该避免副作用,只工作在, 的修改后的副本, 传递给它的数据.
    • An 行动 (or 操作函数相反,它的目的是引起副作用. 它没有返回值.

显示与兼容挂钩配对的函数的图表. 过滤器挂钩有附加的过滤器函数, 动作钩子有附加的动作函数.
WordPress钩子可以有多个回调函数, 但是所有回调函数都必须匹配它们注册的钩子类型.

记住这些区别,我们就可以开始探索钩子了.

抽象和简洁的代码

当动作或过滤器被合并到钩子中时, 根据需要, 我们实现了每个任务只编写一个函数的目标,并避免了项目中代码的重复. 例如, 假设我们想要将相同的样式表添加到三个页面模板(归档, 单页, 和自定义帖子)在我们的主题. 而不是重写父模板中的每个模板, 然后在我们的子主题中重新创建每个, 然后将样式表添加到各个头部部分, 我们可以在单个函数中编写代码,并将其附加到 wp_head 钩.

深思熟虑的命名法

通过唯一地命名子主题或自定义插件钩子来主动避免冲突. 在单个站点中使用同名钩子会导致意外的代码行为. 最佳实践规定,在钩子名的开头使用唯一的短前缀(例如.g.(作者、项目或公司的首字母缩写),后面跟着一个描述性的钩子名称. 例如, 使用“项目首字母加钩子名称”模式,项目Tahir 's Fabulous 插件, 我们可以给钩子起名字 tfp-upload-document or tfp-create-post-news.

并发开发和调试

一个钩子可以触发不止一个动作或过滤器. 例如,我们可以编写一个包含多个脚本的网页,所有这些脚本都使用 wp_head 行动钩子打印HTML(例如.g., a \n\n

像任何CMS一样, WordPress 不会总是一开始就满足你的所有需求. 因为它是开源的, 您可以修改它,使其符合您的业务需求,但相反, 你可以使用WordPress的钩子来实现你的目标. 用钩子建造房屋是一种成功的策略,它能让人解脱 WordPress的开发者 构建几乎任何可以想象的网站功能.

\n\n

WordPress钩子:动作和过滤器

\n\n

WordPress 钩子 不只是强大的定制工具吗, 它们是WordPress组件彼此交互的方式. 钩接函数管理许多我们认为是WordPress的一部分的日常任务, 例如向页面添加样式或脚本, 或者用HTML元素包围页脚文本. 搜索一下WordPress Core的代码库就会发现 成千上万的钩子 在700多个地点. WordPress主题和插件包含更多的钩子.

\n\n

在我们进入钩子并探索动作钩子和过滤器钩子之间的区别之前, 让我们来了解一下它们在WordPress架构中的位置.

\n\n

WordPress的基础设施

\n\n

WordPress的模块化元素很容易相互集成, 所以我们可以很容易地混合, 匹配, 并结合:

\n\n
    \n
  1. \nWordPress核心: 这些是 WordPress工作所需的文件. WordPress Core提供通用架构, WP管理仪表板, 数据库查询, 安全, 和更多的. WordPress核心是写在 PHP 并使用MySQL数据库.
  2. \n
  3. \n主题(或父主题): A 主题 定义了网站的基本布局和设计. PHP支持, HTML, JavaScript, 和CSS文件, 主题通过读取WordPress MySQL数据库来生成在浏览器中呈现的HTML代码. 例如,主题中的钩子可以添加样式表、脚本、字体或自定义帖子类型.
  4. \n
  5. \n儿童主题: 我们自己创建子主题来微调父主题提供的基本布局和设计. 子主题可以定义样式表和脚本来修改继承的特性或添加或删除帖子类型. 子主题指令总是取代父主题指令.
  6. \n
  7. \n插件(s): 要扩展WordPress的后端功能,我们可以选择 数以千计的第三方插件. 插件中的钩子可以, 例如, 当帖子发布或隐藏用户提交的包含禁止语言的评论时,通过电子邮件通知我们.
  8. \n
  9. \n自定义插件(s): 当第三方插件不能完全满足业务需求时, 我们可以通过在PHP中编写自定义插件来增强它. 或者我们可以从头开始编写一个新的插件. 在这两种情况下,我们都要添加钩子来扩展现有的功能.
  10. \n
\n\n

\"金字塔显示,
WordPress基础架构层次\n

\n\n

既然我们可以访问所有五个层的源代码,为什么WordPress还需要钩子呢?

\n\n

代码安全

\n\n

为了跟上不断发展的技术, WordPress核心贡献者, 父主题, 并且插件经常发布更新以减轻安全漏洞, 修正错误, 解决不兼容, 或者提供新功能. 任何有急救经验的顾问都知道, 未能使WordPress组件保持最新 可以妥协,甚至 禁用站点.

\n\n

如果我们直接修改上游WordPress组件的本地副本, 我们遇到了一个问题:更新覆盖了我们的自定义. 我们如何在定制WordPress时规避这个问题? 通过钩子,在子主题和自定义插件.

\n\n

在我们的孩子主题编码

\n\n

A 儿童主题 是一个安全的空间,我们可以自定义我们安装的主题的外观和感觉. 此处添加的任何代码都将覆盖父类中的可比代码,而不会有被更新覆盖的风险.

\n\n

子主题被激活时, 它链接到一个未激活的父节点, 继承和展示父代的特征,同时不受父代更新的影响. 为了不受诱惑而修改主题, 最佳实践建议激活子主题作为我们设置的一部分.

\n\n

编写自定义插件

\n\n

当一个插件被激活时 功能.php 文件在服务器上的每次调用时执行. WordPress, 反过来, 根据所有活动插件的优先级加载和排序钩子,并依次执行. 要扩展第三方插件的功能,我们可以 编写我们自己的WordPress自定义插件.

\n\n

在哪里放置我们的钩子在WordPress

\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
目标例子在哪里? 
  子主题PHP自定义插件PHP
修改网页的结构添加自定义样式表来更改网站元素的颜色和字体 
修改另一个插件的功能.e.,创建一个插件来增强第三方插件的功能)添加副标题(例如.g.(“新闻”)来自定义帖子类型 
添加一个超越WordPress核心的新功能修改访问邮件时发生的工作流,以包括更新数据库中的计数器 
\n\n

潜水前准备:定义

\n\n

为了避免混淆术语,我们将坚持使用以下术语:

\n\n
    \n
  • A 在WordPress中,函数注册运行是一个甜蜜点吗. 我们可以将我们的函数连接到WordPress及其组件中的一个钩子上,或者创建我们自己的钩子.\n
      \n
    • An 行动钩 运行操作.
    • \n
    • A 过滤钩子 运行过滤器.
    • \n
    \n
  • \n
  • A 连接函数 是自定义PHP 回调 函数,我们已经“钩”到一个WordPress钩子位置. 使用哪种类型取决于钩子是否允许在函数e之外进行更改.g.,直接添加到网页输出,修改数据库,或发送电子邮件. 这些被称为 副作用.\n
      \n
    • A 过滤器 (or 滤波函数)应该避免副作用,只工作在, 的修改后的副本, 传递给它的数据.
    • \n
    • An 行动 (or 操作函数相反,它的目的是引起副作用. 它没有返回值.
    • \n
    \n
  • \n
\n\n

\"显示与兼容挂钩配对的函数的图表.
WordPress钩子可以有多个回调函数, 但是所有回调函数都必须匹配它们注册的钩子类型.\n

\n\n

记住这些区别,我们就可以开始探索钩子了.

\n\n

抽象和简洁的代码

\n\n

当动作或过滤器被合并到钩子中时, 根据需要, 我们实现了每个任务只编写一个函数的目标,并避免了项目中代码的重复. 例如, 假设我们想要将相同的样式表添加到三个页面模板(归档, 单页, 和自定义帖子)在我们的主题. 而不是重写父模板中的每个模板, 然后在我们的子主题中重新创建每个, 然后将样式表添加到各个头部部分, 我们可以在单个函数中编写代码,并将其附加到 wp_head 钩.

\n\n

深思熟虑的命名法

\n\n

通过唯一地命名子主题或自定义插件钩子来主动避免冲突. 在单个站点中使用同名钩子会导致意外的代码行为. 最佳实践规定,在钩子名的开头使用唯一的短前缀(例如.g.(作者、项目或公司的首字母缩写),后面跟着一个描述性的钩子名称. 例如, 使用“项目首字母加钩子名称”模式,项目Tahir 's Fabulous 插件, 我们可以给钩子起名字 tfp-upload-document or tfp-create-post-news.

\n\n

并发开发和调试

\n\n

一个钩子可以触发不止一个动作或过滤器. 例如,我们可以编写一个包含多个脚本的网页,所有这些脚本都使用 wp_head 行动钩子打印HTML(例如.g., a