钩子 (Hooks) 是一种让一段代码在特定的、预定义的位置与另一段代码交互/修改的方法。它们构成了插件和主题与 WordPress Core 交互的基础,但 Core 本身也广泛使用它们。
钩子有两种类型:动作Actions和过滤器Filters。要使用其中一种,您需要编写一个称为 的自定义函数Callback,然后将其注册到 WordPress 钩子中,以用于特定的动作或过滤器。
操作允许您添加数据或更改 WordPress 的运行方式。操作将在 WordPress 核心、WordPress插件和Wordpress主题执行的特定时间点运行。操作的回调函数可以执行某些任务,例如向用户回显输出或将某些内容插入数据库。操作的回调函数不会向调用操作的钩子返回任何内容。
过滤器使您能够在 WordPress 核心、插件和主题执行期间更改数据。过滤器的回调函数将接受一个变量,对其进行修改并返回。它们旨在以独立的方式工作,并且绝不会造成副作用,例如影响全局变量和输出。过滤器期望返回一些值。
WordPress 提供了许多可供您使用的钩子,但您也可以创建自己的钩子,以便其他开发人员可以扩展和修改您的插件或主题。
动作和过滤器之间的主要区别可以概括如下:
一个动作接收信息,处理它,然后不返回任何内容。换句话说:它执行完某项操作后就退出,不向调用钩子返回任何内容。
过滤器接收信息,进行某种修改,然后返回。换句话说:它过滤某些内容,并将其传回钩子以供进一步使用。
换句话说:
一个动作会中断代码流来执行某项操作,然后返回正常流程而不进行任何修改;
过滤器用于以特定方式修改某些内容,以便稍后代码可以使用该修改。
这里提到的内容是通过钩子定义发送的参数列表。更多内容将在后面章节中介绍。
WordPress 钩子可以帮助您修改代码、向网站添加功能以及更改数据在前端的呈现方式,而无需更改 WordPress 核心或深入主题或插件的结构(顺便说一下,主题或插件也大量使用钩子)。
让我们想象一个 WordPress 核心,以及主题和插件,就像一台具有许多相互连接的齿轮和钩子的机器(在这个词的一般意义上)。因此,如果我们想更改或升级这台机器中的某些内容,我们可以将函数挂在现有的钩子上,或者创建我们的自定义钩子——这样它就会在整个序列中的特定点执行。
当公交车司机 (WordPress) 检查是否需要接人时,钩子也可以与检查站或公交车站(钩子)进行比较。
钩子是旨在修改另一段代码的小段代码。它们可以很容易地添加和删除,因此可以自定义代码,而无需修改核心并在那里弄得一团糟。因此,这是一个非常强大且方便的功能,它使 WordPress 具有可扩展性和灵活性。
Hook 要么向核心、主题或插件添加一些数据或功能,并在特定时间(在另一个作发生之前、之后或发生时)执行一些作,要么在数据存储在数据库中或渲染到前端之前修改(过滤)数据。
第一种类型称为 action hooks,第二种是 filter hooks。
钩子实际上是将某个函数 “钩 ”或 “固定” 到模板的某个位置或 WordPress 运行时中的某个事件上。因此,我们可以编写一个函数,然后在需要时在需要的地方(和时间)多次调用 hook。
在主题或核心的不同 PHP 文件中可以找到很多钩子。但是,当不是 WordPress 核心或主题开发人员的人向现有站点添加钩子时,他们应该将它们放在子主题的 functions.php 文件中(这很重要,否则,在更新主题时会丢失它们!)或专门为钩子创建的自定义插件中。
一些细节和示例
钩子是 WordPress 插件 API 的一部分,在 WordPress 文档中,您可以找到 WordPress 现有核心钩子的列表,您可以使用这些钩子使您的代码在运行时的特定时间点运行。
此外,还有一个处理 hook 的函数列表;您可以在 Codex 页面上找到它。
例如,在核心钩子列表(在上面的链接上),我们可以找到在 WordPress 核心深处注册的 init 钩子,我们需要了解的是它在 WordPress 渲染过程中将触发的时间点。Codex 给了我们答案:“在 WordPress 完成加载后但在发送任何标头之前触发。
因此,将一些函数 “挂” 到这个钩子上是一个完美的候选者,例如,注册一个自定义的帖子类型:
// Register Custom Post Type My_Cool_CPT
function create_my_cool_cpt() {$args = array(
// your array of args goes here
$labels = array(
// the nested array of labels goes here
););
register_post_type( 'mycoolcpt', $args );
}
add_action( 'init', 'create_my_cool_cpt', 0 );
(顺便说一句,如果你想轻松生成我在这里省略的参数数组,以免弄乱此代码片段,只需使用像这样的在线生成器之一)。
因此,上面的代码添加了一些作(在本例中为添加自定义帖子类型的作)。
这段代码有两个逻辑部分:
有关新的自定义帖子类型 (CPT) 的详细信息:我命名为“create_my_cool_cpt”的自定义函数,它确定有关此 CPT 的所有详细信息,以及内置的 WordPress PHP 钩子“register_post_type”。
“add_action”内置的 WordPress 函数用于将自定义函数附加到特定作(或者,换句话说,将我们的自定义代码挂在上面的钩子)。
让我们仔细看看 add_action 的结构:我想要附加的函数 – 或 callback – ('create_my_cool_cpt') 作为第二个参数传递,我想要附加它的动作 ('init') 作为第一个参数传递。这两个参数都是必需的。
末尾的零表示优先级(0 = 最高优先级);此参数是可选的。
注意
如果你对什么实际上可以被称为 hook 感到困惑:已经在核心中注册的东西,通过主题或插件,或者我们添加的代码片段,答案是,在通常使用中,它们都被称为 “hooks”。
换句话说,我们可以将我们的钩子钩到现有的钩子上,创建自己的钩子,并向它们钩住一些东西。😅
站点加载时会发生最典型的 action 事件,因此可以将许多 action functions 挂接到这些事件中:
您可以在 Plugin API Action Reference (用于作) 和 Plugin API Filter Reference (用于过滤器) 中找到更大的列表。
但是要查看网站页面上存在的所有钩子(核心、你的主题、插件以及自定义的),你可以使用显示它们的插件,例如,Another Show Hooks。
我已经写了如何使用此工具和钩子来自定义 WooCommerce 页面。
但是,要“玩”它们,你可以编写最简单的动作钩子(我把虚拟文本加粗和做成红色,以便更加明显):
function my_hi_there_function() {
echo "<p style='color:red;font-weight:800;'>Hi there! I am your hook</p>";}
add_action( 'generate_after_entry_title', 'my_hi_there_function' );
如前所述,有两种类型的钩子:作和过滤器。让我们仔细看看他们中的每一个。
动作用于在 WordPress 运行时的过程中做某事——它在执行 WordPress 核心、主题或插件的某些现有进程时触发;它在此流程的指定点执行此作,然后恢复正常。它的回调函数不会向调用作钩子返回任何内容。
这些内置函数最常与作一起使用:
add_action将某个回调函数附加到某个 hook 或 hook name 上(如上一段中的示例)。
语法: add_action( $hook, $function_to_add, priority, accepted_args );
remove_action 使用 add_action.Syntax
: remove_action( $hook, $function_to_remove, priority ) 分离之前附加到钩子的回调函数
do_action 用于创建自定义作钩子;它调用添加到 Matching Action 钩子的回调函数。
语法:do_action( $hook_name, $arg )。
假设我需要在网站的不同位置显示文本 “看,这是我网站的 URL”。不是 WordPress 核心、我的主题或插件已经有钩子的地方,而是我想要的地方/时间。 因此,需要一个自定义钩子。
我将它称为 “my website link”,并首先编写一个回调函数 “my_link_echo”,该函数将附加到此 hook (以设置执行我的自定义 hook 后实际发生的情况)。所以,在 functions.php 中,我将添加以下内容:
add_action( 'my_website_link', 'my_link_echo', 10, 1 );
function my_link_echo( $url ){
echo "Look, this is my favorite URL -- <a href= {'$url'}>$url</a>";}
现在我可以在我想要的地方注册我的自定义 hook:
do_action( 'my_website_link', home_url( '/' ) );
如你所见,它只传递一个 “home_url” 参数 —— 一个只是默认数量的参数。如果传递了多个参数,则应更改此数字并等于所需的参数数。
如果我想在主页脚之前看到它,我会把它放在这里:
如果我想在其他地方看到它,我也应该把它插入那里。“home_url()”在括号中有一个参数,它被传递到那里,这意味着它可以在我使用它的每个地方进行更改。
例如,在页脚中,我将使用主页 URL ('/'),在每篇文章的顶部,我想使用指向博客存档的链接,因此我只需将参数更改为博客 URL,并在 single.php 中添加do_action(文章模板):
如果我或其他人以后想执行任何其他回调函数,他们可以将其固定到我的 “my_website_link” 函数,它将在这两个地方或这个钩子的任何地方触发(以 do_action() 开头;) 被调用。
如果有许多回调函数固定到同一个钩子上,最好将它们的优先级值从默认值 10 更改为你希望它们触发的顺序。
让我们再看一个例子 - 使用 WordPress 内置的钩子,然后向其添加自定义钩子。
对于初学者来说,如果我想只为登录用户保留名为 “Logged Only” 的帖子,其余的应该重定向到主页怎么办?这是我需要的:
add_action ('template_redirect', 'logged_only');
function logged_only(){
if(is_single('logged-only') && !is_user_logged_in() ) {
wp_redirect(home_url() );
die();}}
在这里,我使用了内置的钩子 “template_redirect”,它在确定要加载的模板之前触发。我添加了我的回调 “logged_only” 并使用函数 “wp_redirect()”。
如果我想添加我的自定义钩子,每次有人尝试访问 Logged Only 页面时,它都会向日志文件添加信息,该怎么办?它应该写着,“有人刚刚尝试访问仅登录页面”,并添加尝试的日期和时间。日志将存储在我已经创建的 access_log.txt 文件中。
add_action ('template_redirect', 'logged_only');
function logged_only(){
if(is_single('logged-only') && !is_user_logged_in() ) {
do_action( 'write_to_log', date("F j, Y, g:i a")); //date is an argument here
wp_redirect(home_url() );
die();}}
add_action( 'write_to_log', 'log_when_accessed' );
function log_when_accessed($date) {
$access_log = get_stylesheet_directory() . '/access_log.txt';
$message = 'Someone just tried to access Logged Only page on ' . $date;
if( file_exists( $access_log) ) {
$file = fopen( $access_log, 'a' ); //a PHP function where "a" means that message is placed at the end of the file
fwrite($file, $message."\n"); //\n says it will be written from a new line
}
else {
$file = fopen( $access_log, 'w' ); //attempts to create a file if it doesn’t exist
fwrite($file, $message."\n");}
fclose($file);}
过滤器是非常相似的动作钩子:它们在 WordPress 运行时的某个时刻触发,它们具有相似的代码结构,等等。但至少有两个差异应该被命名:
过滤器钩子总是返回一些东西:因为过滤器实际上是过滤和修改内容,所以它们应该返回过滤/修改的内容。因此,回调代码始终包含单词 “return”。
过滤器的整个概念与作的概念不同。虽然作会干扰网站呈现的整个过程,但筛选器会独立工作。他们就像剧院后台的工作人员,在不成为聚光灯下准备道具和服装,只在需要时才透露他们的工作成果——而行动可以与舞台上的演员进行比较。
这些内置函数最常与筛选器一起使用:
add_filter 将回调函数钩住到某个 filter 钩子上。
语法: add_filter( $hook_name, $callback, priority, accepted_args );
remove_filter 将回调函数从 certain 钩子中分离出来。
语法: remove_filter( $hook_name, $callback, priority );
apply_filters 调用附加到 filter hook 的回调。
语法: apply_filters( $hook_name, $value, $args ).
注意
在某些情况下,作和筛选器都可用于完成相同的任务。
最简单的过滤器之一可能是返回自定义摘录长度的过滤器:
add_filter( 'excerpt_length', 'short_excerpt' );
function short_excerpt ( $length) {
$length = 125;
return $length;
}
其中 “excerpt_length” 是默认的 WordPress 核心钩子,标准值为 55 个字符。使用上面的简单代码,我将其更改为 125。
这是理解 apply_filters 工作原理的示例;它将返回一个折扣价格,在 product_price_filter 小部件中便宜 10%:
function modify_product_price($price) {
return $price * 0.9;
}
$product_price = 100;
$discounted_price = apply_filters('product_price_filter', $product_price);
echo "Original Price: $product_price";
echo "Discounted Price: $discounted_price";
add_filter('product_price_filter', 'modify_product_price');
注意
您可以尝试使用 WordPress Hook Generator 工具创建您的钩子,如果您对 PHP 不是很熟悉,它会节省您的时间。
在 WordPress 开发领域,理解钩子对于自定义主题、插件以及网站整体功能至关重要。钩子是 WordPress 的支柱,它使开发人员能够在不修改核心文件的情况下修改和扩展平台的行为。在本篇全面的教程中,我们将深入探讨钩子的世界,涵盖操作和过滤器,并演示如何在 WordPress 项目中有效地利用它们。
WordPress 中的钩子是占位符,允许开发人员在 WordPress 执行过程的特定点插入自定义代码。钩子有两种类型:操作和过滤器。
操作:这些是 WordPress 中的触发点,您可以在其中插入自定义功能。操作允许您在代码执行的特定点添加、修改或删除功能。
过滤器:过滤器会在数据显示或保存之前拦截并修改数据。它们允许您在 WordPress 中操作内容、变量和其他数据。
当 WordPress 中的钩子被触发时,它会执行所有附加到该钩子的函数。您可以使用 add_action() 和 add_filter() 函数将函数添加到钩子中,并指定钩子名称和要执行的函数。
// Example of adding an action
add_action('init', 'my_custom_function');
function my_custom_function() {
// Your custom code here
}
// Example of adding a filter
add_filter('the_title', 'my_custom_title');
function my_custom_title($title) {
// Modify the title
return $title;}
在 WordPress 开发中使用钩子时,务必注意一些常见错误,这些错误可能会导致代码出现问题或网站出现意外行为。以下是在 WordPress 中使用钩子时应避免的一些常见错误:
通过了解这些常见错误并在使用 WordPress 中的钩子时遵循最佳实践,您可以确保更顺畅的开发过程并避免因不正确使用钩子而可能出现的潜在问题。
通过采用这些方法,您可以有效地识别 WordPress 主题或插件中的可用钩子,从而可以利用它们对 WordPress 项目进行自定义和增强。
记录你的代码:清晰地记录你正在使用的钩子函数以及自定义函数的用途,以供将来参考。
了解并驾驭 WordPress 开发中钩子的强大功能,可以显著提升您根据自身需求定制和扩展平台的能力。通过有效利用操作和过滤器,您可以创建动态且功能丰富的 WordPress 网站,满足您的独特需求。
立即在您的 WordPress 项目中尝试使用钩子,开启开发工作流程的全新定制化和灵活性。
什么是Wordpress钩子?
WordPress 钩子允许您在某些点“钩入”构建过程并运行您的自定义代码。钩子的主要功能是允许您在不触及核心文件的情况下修改或添加 WordPress 功能。钩子可以帮助您使用自己的代码扩展 WordPress。
什么是 WordPress 函数?
对于大部分的核心文件,WordPress 使用 PHP 语言,这种语言有很多内置函数,但是 Codex Function Reference 中也有 WordPress 函数。
有多少种类型的 WordPress 钩子?
有两种类型的钩子:作和过滤器。作在 WordPress 运行时的特定点创建事件并执行函数。它可能会也可能不会传递数据;此外,他们不会返回任何内容。相比之下,过滤器会修改其他函数使用的数据,并且总是返回一些内容。
WordPress 中的 Hooks 是什么?
WordPress 中的 Hook 功能允许开发人员改变现有函数和类的行为或添加新的函数和类。
对于Wordpress 钩子
Hooks 使 WordPress 如此灵活和可扩展。了解它们的工作原理对于所有想要了解 WordPress “幕后”工作原理并能够对其进行自定义的人来说都是必不可少的。