WordPress是一个由不同代码组件组成的完整包,它们共同提供一个功能性的内容管理系统。WordPress核心、插件和主题都是这个包的一部分。由于这些组件中的一些单独更新,您不想直接编辑代码,否则在这些组件更新时,您的更改将被覆盖。因此,WordPress实现了system of Hooks.
<小时>Action hooks 允许您将功能注入特定的运行时点。您可以使用这些操作挂钩创建自己的插件或主题,以便在组件更新时它们不会被覆盖。例如plugins_loaded
是一个动作挂钩,在运行时加载所有插件后运行。如果您想在页面请求期间加载所有插件后运行特定功能,您可以说:
function example_plugins_loaded_callback() {
// Print a message then stop page request load.
print( \'All plugins have been loaded successfully!\' );
exit();
}
add_action( \'plugins_loaded\', \'example_plugins_loaded_callback\' );
加载所有插件后,上述消息将打印到屏幕上,页面请求停止加载其他文件。这是一个简单的用法示例,但这是动作挂钩工作原理的要点。如果愿意,此时可以调用API或写入数据库。
如果没有操作挂钩,如果要打印上述内容,则需要编辑wp-settings.php
当WordPress更新时,该文件最终将被覆盖。当plugins_loaded
吊钩运行。
<小时>Filter Hooks 允许您修改函数生成的特定值。与动作挂钩不同,它们需要返回值。过滤器挂钩就是一个很好的例子the_title
允许您修改the_title()
和get_the_title()
将值打印到屏幕之前。您可以通过以下方式直接查看代码:viewing the function on trac. 函数和回调类似于动作挂钩:
function example_the_title_callback() {
return \'Example Title\';
}
add_filter( \'the_title\', \'example_the_title_callback\' );
使用上述过滤器挂钩
the_title()
将立即打印
Example Title
相反
钩子还带有优先级和参数数量。您需要查找每个钩子,以了解传递给钩子的参数是什么,但它是这样的:
add_filter(
\'the_title\', // Hook Name
\'example_the_title_callback\', // Callback Function Name
10, // Priority
2 // Number of arguments
);
- Hook Name - 并非每个函数都有可用的挂钩。您需要使用Developer Docs.
- Callback Function - 要触发的函数的名称
- Priority - 当你想让钩子跑的时候。挂钩可以附加多个功能,有些可能不是您的(插件或主题)。低优先级将在高优先级挂钩之前运行
- Number of Arguments - 传递给回调函数的参数
需要告知传递多个参数的挂钩,以便为回调函数提供这些参数。
the_title
钩子传球
$title
和
$post_id
. 如果我们想使用
$post_id
我们需要告诉
add_filter()
函数将其传递给回调函数:
/**
* One Argument Hook
*/
function example_the_title_callback( $title ) {
/**
* - By default we always get 1 argument if possible.
* - We do not have access to $post_id at this point.
*/
$new_title = $title . \'!!!\';
return $new_title;
}
add_filter( \'the_title\', \'example_the_title_callback\' );
/**
* Two Arguments Hook
*/
function example_the_title_callback( $title, $post_id ) {
/**
* Since we specified 2 arguments, we receive the 2 arguments that the hook provides
*/
$post = get_post( $post_id );
$new_title = $title . \' - \' . $post->ID;
return $new_title;
}
add_filter( \'the_title\', \'example_the_title_callback\', 10, 2 );
同样,您需要在开发人员文档中查看钩子传递的参数。
最后,作为主题或插件开发人员,您可以添加自己的自定义挂钩,允许其他开发人员添加或修改特定功能。
假设您编写了一个插件,将文章标题包装在<span>
用于特定样式的HTML标记。您可以添加一个钩子,允许其他开发人员向您的范围添加自定义类,如下所示:
/**
* My super cool plugin
* Add HTML span tags around titles
* Our plugin CSS can style them cool later
*/
function supercool_title( $title ) {
// Allow theme developers or plugin developers to add classes to our span tag.
$classes = apply_filters(
\'supercool_title_classes\', // Our custom filter name
array(), // Array of classes to pass to the filter, empty in this scenario
);
// Filters always return
return sprintf( \'<span class="%s">%s</span>\', esc_attr( implode( \' \', $classes ) ), $title );
}
add_filter( \'the_title\', \'supercool_title\' );
作为一个主题开发人员,如果我想的话,我可以使用这个插件挂钩添加到我自己的类中。
/**
* Theme Devloper modifies plugin functionality
* Adds specific class to the super cool plugin title wrapper
*/
function my_theme_supercool_title_classes( $classe ) {
$classes[] = \'special-title\';
return $classes;
}
add_filter( \'supercool_title_classes\', \'my_theme_supercool_title_classes\' );
// Output
<span class="special-title">Post Title</span>
在创建主题或插件时,可以对动作挂钩执行相同的操作。WooCommerce在其模板系统中使用了许多动作挂钩,允许其他插件和特定主题添加到输出中。类似于:
do_action( \'before_header_hook\' ); // A custom action hook created by the developer.
如果愿意,只允许您在该点注入特定代码。可能是一个分析脚本或一个实用程序导航的整个HTML包装器,主题以前不支持。可能性是无限的!