在WordPress中构建自定义解决方案的基石之一是对钩子的理解。 就其本身而言,它们并不是很难理解的,我们将在本教程中对其进行简短介绍。
但是,如果您希望进入更高级的WordPress开发,那么也有必要知道如何实现自己的钩子。
在这个由两部分组成的系列文章中,我们将回顾WordPress钩子系统及其实现方式,并且将研究如何定义我们自己的动作和过滤器。
入门
在开始之前,本教程假定您已经设置了本地开发环境,其中包括WordPress的最新副本。 在撰写本文时,这是WordPress 4.5.2。
如果您需要设置开发环境的指导,请参阅本教程 。 它将为您提供设置Web服务器,PHP副本,数据库和WordPress所需的一切。
如果您正在寻找更多内容,那么包含该教程的系列文章提供了更多信息,例如如何安装WordPress,主题和插件演练等等。
但是在本教程中,我们将重点放在钩子和动作上。 因此,一旦完成所有设置,就开始吧。
什么是挂钩?
在仔细研究WordPress钩子之前,值得了解事件驱动的设计模式(也称为事件驱动的体系结构)。
如果您已经使用了现有的WordPress挂钩,前端Web开发或任何功能JavaScript,那么即使您不知道它的正式名称,您也可能会熟悉这种模式。
无论如何,这是它在Wikipedia中的定义:
事件驱动的体系结构(EDA),也称为消息驱动的体系结构,是一种软件体系结构模式,可促进事件的产生,检测,使用和反应。
如果您刚开始使用设计模式或开发,这听起来可能很复杂,但是另一种思考方式是这样的:
- 该软件在某些方面可以广播发生了某些事情的消息。
- 作为开发人员,我们能够编写侦听此消息的代码,然后使用自定义代码对其进行响应。
注意,该定义还涉及事件的产生。 当我们谈论定义自己的钩子时,我们将重新讨论该主题。 现在,让我们看一下Web开发中常见的两个事件。
使用JavaScript
首先,假设您正在从事前端开发。 您有一个具有command-button
的ID属性的command-button
,当用户单击它时,您要显示一个警报对话框。
使用jQuery ,您可以实现以下功能:
(function( $ ) {
'use strict';
// jQuery's DOM-ready event-handler
$(function() {
/**
* Listen for the 'click' event on the button identified
* with the 'command-button' ID attribute.
*
* When the user clicks on it, display an alert dialog.
*/
$( '#command-button' ).bind( 'click', function( evt ) {
alert( 'You clicked the button.' );
});
});
})( jQuery );
上面代码中的注释应准确解释正在发生的事情。 简而言之,当用户单击按钮时,浏览器将引发一个事件。 发生这种情况时,我们的代码将侦听该事件,然后通过显示一个对话框进行响应。
当然,其他库,框架或原始JavaScript也提供相同的功能。 在jQuery中显示此代码的目的是因为它是最常见JavaScript库之一,并且它也是与WordPress捆绑在一起的。
使用WordPress
在所有编程语言或范例中,此模式的实现不一定都相同。 这通常取决于框架,基础或应用程序提供的API。
在WordPress中,使用触发事件注册我们自己的代码有点不同。 例如,假设您正在使用WordPress中的管理页面,并且想向该页面添加一个新的子菜单项。 设置菜单。 我们称它为 Tuts +选项 。
为此,我们将以下代码添加到我们的functions.php
文件或插件中,或我们关注的任何类型的项目中:
<?php
add_action( 'admin_menu', 'tutsplus_admin_menu' );
/**
* Adds a 'Tuts+ Options' submenu to the 'Settings'
* menu in the WordPress administration menu.
*/
function tutsplus_admin_menu() {
add_submenu_page(
'options-general.php',
'tutsplus-admin-menu',
'Tuts+ Options',
'manage_options',
'tutsplus-admin-menu-top',
'tutsplus_admin_options'
);
}
您可以访问食典以阅读有关admin_menu
挂钩以及add_submenu_page
函数的更多信息。
这段代码并未向菜单中添加任何新功能,但是它旨在证明WordPress提供了admin_menu
事件,就像Web浏览器提供了click事件一样。 然后,我们可以通过定义一个函数来注入自己的代码,并在引发该事件时触发它。
这是正在实施和使用的事件驱动设计模式的两个实际示例。
了解WordPress动作
现在,我们对事件驱动的设计模式进行了简短的介绍,并看到了该模式的两种实现,下面让我们专门研究WordPress操作。 我们将回顾可用的内容以及如何实现自己的内容。
设置文件
出于本教程中代码的目的,我们将使用WordPress随附的默认二十六个主题。
在主题目录的根目录中,创建一个名为tutsplus-actions.php
的文件。 然后,在functions.php
,添加以下代码行:
<?php
include_once( 'tutsplus-actions.php' );
这指示主题加载我们定义的文件。 我们想要这样做的原因是,我们可以将代码保留在主题的核心之外,并且可以通过删除上面的include_once
语句轻松删除代码。
动作的简要定义
在WordPress中,挂钩可分为以下两类之一:操作或过滤器。 操作是WordPress生命周期中的关键点,可让您添加,删除或修改某些功能。 另一方面,过滤器是WordPress生命周期中的点,您可以在其中添加,删除或修改数据。
简而言之,操作旨在使用功能,而过滤器旨在用于数据。 在本系列的第二部分中,我们将更加关注过滤器。
我想指出的一件事是,如果您在阅读了这一系列教程(我鼓励)之后选择研究动作和过滤器,您可能会发现其他人更普遍地将它们称为“钩子”。
尽管从技术上讲这是正确的,但它更为实用,在您与他人进行写作,演示或讨论主题时,更容易讨论正在使用的挂钩类型。
这是因为操作旨在提供一种功能,而过滤器旨在提供另一种功能。
采取行动
尽管我们已经在上面的一些示例代码中查看了动作的特定示例,但让我们看一个更完整,更实际的示例。
WordPress开箱即用地提供两种类型的帖子:帖子(用于常规博客帖子)和页面(用于静态内容或很少变化的内容)。 对于标准博客平台,可以说这类内容就是您所需要的。 但是WordPress在多年前就发展成为CMS。
使得WordPress可扩展的功能之一就是能够引入我们自己的帖子类型。 WordPress称为这些自定义帖子类型 ,当我们需要创建一种需要自己的属性类型并且需要命名的内容而不是“帖子”或“页面”时,它们非常有用。
为了创建自己的自定义帖子类型,我们需要做两件事:
- 定义一个函数,该函数可以钩入WordPress提供的
init
钩子 - 使用提供的API函数之一注册我们的帖子类型
注册我们的行动
要注册我们的操作,我们将使用WordPress API提供的add_action
函数。 这告诉WordPress我们正在引入动作,它需要触发由我们在函数调用中提供的名称标识的函数。
我们的代码应如下所示:
<?php
add_action( 'init', 'tutsplus_register_post_type' );
在上面的代码中,我们正在使用WordPress中存在的init钩子注册一个函数。 这个挂钩会在WordPress生命周期的早期触发,是注册自定义帖子类型的好时机。
接下来,我们需要定义函数。
<?php
function tutsplus_register_post_type() {
}
理解此函数签名的关键很简单:我们将其命名为tutsplus_register_post_type
因为这是我们传递给add_action
调用的第二个参数。
这实际上是指示WordPress执行以下操作:在init
期间,调用tutsplus_register_post_type
函数。
到目前为止,一切都很好。 我们并没有真正遇到任何复杂的问题,如果刷新WordPress的管理屏幕,那么您会发现它仍在运行,尽管它没有做任何新的事情。
让我们改变一下。
创建自定义帖子类型
现在我们有了用于添加自己的动作的框架代码,接下来让我们实际进行一些事情。 具体来说,让我们创建一个名为time_traveler
的自定义帖子类型,其中包括标题,编辑器,摘录,以及其他内容。
为此,我们需要检查Codex中的register_post_type
函数。 该文档对函数可以接受的所有参数给出了扎实的解释,但是对于自定义帖子类型,我们只会使用它们的一部分。
具体来说,我们将使用以下内容:
-
label
-
labels
-
description
-
public
-
show_ui
-
supports
我们将依靠WordPress默认值提供的其余功能。 参数将如下所示:
<?php
$args = array(
'label' => 'Time Travelers',
'labels' => array(
'name' => 'Time Travelers',
'singular_name' => 'Time Traveler',
'add_new_item' => 'Add New Traveler',
'edit_item' => 'Edit Traveler',
'new_item' => 'New Traveler',
'view_item' => 'View Traveler',
'search_items' => 'Search Travelers',
'not_found' => 'No Travelers',
),
'description' => 'A post type used to provide information on Time Travelers.',
'public' => true,
'show_ui' => true,
'supports' => array(
'title',
'editor',
'excerpt',
),
);
注册帖子类型的代码的最终完整版本如下所示:
<?php
add_action( 'init', 'tutsplus_register_post_type' );
function tutsplus_register_post_type() {
$args = array(
'label' => 'Time Travelers',
'labels' => array(
'name' => 'Time Travelers',
'singular_name' => 'Time Traveler',
'add_new_item' => 'Add New Traveler',
'edit_item' => 'Edit Traveler',
'new_item' => 'New Traveler',
'view_item' => 'View Traveler',
'search_items' => 'Search Travelers',
'not_found' => 'No Travelers',
),
'description' => 'A post type used to provide information on Time Travelers.',
'public' => true,
'show_ui' => true,
'supports' => array(
'title',
'editor',
'excerpt',
),
);
register_post_type( 'time_traveler', $args );
}
刷新WordPress安装的管理区域时,“ 注释”下应直接有一个新菜单项,显示“ 时间旅行者” 。
当您单击Add New时 ,您应该看到一个标题(或旅行者的名字),编辑器(关于旅行者的信息)和摘录(也许一些关于旅行者的注释)的位置。 您还应该看到一个用于发布信息的元框。
当然,以上代码向我们展示了如何利用现有操作来定义自定义帖子类型。 但是,如果我们想创建自己的动作怎么办?
定义自定义动作
在创建我们自己的动作时,我们需要做三件事。 在最基本的层面上,我们需要执行以下操作:
- 定义挂钩
- 给挂钩赋予功能
- 允许开发人员调用钩子
我可以给出的最简单的示例是以下代码:
<?php
/**
* Define the action and give functionality to the action.
*/
function tutsplus_action() {
do_action( 'tutsplus_action' );
}
/**
* Register the action with WordPress.
*/
add_action( 'tutsplus_action', 'tutsplus_action_example' );
function tutsplus_action_example() {
echo 'This is a custom action hook.';
}
可以随时将此示例代码添加到tutsplus-actions.php
以便在本教程结束后继续调整和探索代码。
之后,我们可以在代码中的任何位置调用函数tutsplus_action
。 举例来说,我们想将其显示在管理区域的顶部。 如果那是我们想要做的,那么我们可以添加以下代码:
<?php
add_action( 'admin_notices', 'tutsplus_admin_notice' );
function tutsplus_admin_notice() {
tutsplus_action();
}
如果刷新仪表板,则会在仪表板顶部看到“这是一个自定义操作挂钩”。
请注意,除非您特别打算将成功,警告或错误消息通知用户,否则我不建议您插入admin_notices
。 我在这里专门使用它来演示我们的自定义钩子。
重温我们的职位类型
假设我们要创建一个自定义帖子类型函数,该函数允许我们通过使用动作挂钩将帖子类型的单数和复数名称传递给函数。
我们将如何去做呢? 使用上面看到的内容,我们知道需要做的第一件事是创建一个自定义函数来调用动作。 现在让我们开始:
<?php
function tutsplus_register_custom_post_type() {
// Set the action at priority of 10 and note that it accepts 2 arguments.
do_action( 'tutsplus_register_custom_post_type', 10, 2 );
}
接下来,我们需要做一些似乎违反直觉的事情。 由于我们希望自定义功能在init挂钩的上下文中触发,因此我们需要确保在init操作期间触发了我们的挂钩。
为此,我们将自定义钩子钩到init钩子上:
<?php
add_action( 'init', 'tutsplus_register_custom_post_type' );
function tutsplus_register_custom_post_type() {
// Set the action at priority of 10 and note that it accepts 2 arguments.
do_action( 'tutsplus_register_custom_post_type', 10, 2 );
}
注意,在上面的代码中,我们为do_action
指定了两个附加参数。 第一个参数是10,它指示此挂钩将触发的优先级。
该数字可以是任意数字,数字越大,它将触发的优先级列表越低。 第二个参数是定制挂钩将接受的参数数量。 在我们的情况下,帖子类型的单数形式为一个,而帖子类型的复数形式为一个。
之后,我们需要为该挂钩提供功能。 在这里,我们将重构用于注册帖子类型的代码,以便它接受两个参数,并且这两个参数将在传递给WordPress的register_post_type
函数的数组中使用。
<?php
function tutsplus_register_post_type( $singular, $plural ) {
$args = array(
'label' => $plural,
'labels' => array(
'name' => $plural,
'singular_name' => $singular,
'add_new_item' => 'Add New Traveler',
'edit_item' => 'Edit Traveler',
'new_item' => 'New Traveler',
'view_item' => 'View Traveler',
'search_items' => 'Search Travelers',
'not_found' => 'No Travelers',
),
'description' => 'A post type used to provide information on Time Travelers.',
'public' => true,
'show_ui' => true,
'supports' => array(
'title',
'editor',
'excerpt',
),
);
register_post_type( 'time_traveler', $args );
}
请注意,这里我们还删除了将该函数添加到特定的挂钩中的操作。 相反,我们将从挂钩到我们自定义操作的函数的定义内调用它。
<?php
add_action( 'tutsplus_register_custom_post_type', 'tutsplus_register_time_traveler_type' );
function tutsplus_register_time_traveler_type() {
tutsplus_register_post_type( 'Time Traveler', 'Time Travelers' );
}
在上面的代码中,我们可以调用负责注册自定义帖子类型的函数,同时始终将其传递给我们自己的参数,以便可以向代码中添加一些自定义功能。
结论
定义自定义钩子并不复杂,它也为我们作为开发人员提供了强大的功能和灵活性。 可以说,关于上面代码的最令人困惑的事情是我们如何在另一个钩子的上下文中定义一个钩子(也就是说,我们在init
定义了tutsplus_register_custom_post_type
)。
我选择将其作为最后一个示例,因为有时您可能想注册一个自定义钩子,并且需要在自定义钩子完成之前触发它。
注册一个独立的钩子很容易:您只需不将其钩到预先存在的钩子上,就可以进行基本的函数调用,就像我们看到的那样,将代码钩在admin_notices
。
在本系列的下一篇文章中,我们将研究过滤器以及它们在修改数据方面可以为我们做什么。 我们还将研究如何定义自己的过滤器,以便能够像本教程中介绍的那样引入自定义功能。
在下一篇文章发布之前,如果您正在寻找其他实用程序来帮助您构建不断增长的WordPress工具集或用于学习和变得更精通WordPress的代码,请不要忘记看看我们拥有什么在Envato市场有售 。
记住,您可以在个人资料页面上捕获我的所有课程和教程,还可以通过@tommcfarlin 在我的博客和/或Twitter上关注我,在那里我讨论了各种软件开发实践以及如何在WordPress中使用它们。
请不要在下面的提要中留下任何问题或评论,我将尽力回答每个问题或评论。
翻译自: https://code.tutsplus.com/tutorials/adding-custom-hooks-in-wordpress-custom-actions--cms-26454