【发布时间】:2017-04-28 15:26:27
【问题描述】:
我读到动作钩子用于调用函数,过滤器钩子用于在保存或显示在网站上之前过滤内容。你能告诉我我们使用动作和过滤钩子的项目示例的一些工作阶段吗?所以多了解会更好。
【问题讨论】:
标签: wordpress
我读到动作钩子用于调用函数,过滤器钩子用于在保存或显示在网站上之前过滤内容。你能告诉我我们使用动作和过滤钩子的项目示例的一些工作阶段吗?所以多了解会更好。
【问题讨论】:
标签: wordpress
Filter Hook:用于修改(过滤)一个值
Action Hook:做点什么,就在此时
过滤器钩子示例:
$name = "Smith";
$gender = "female";
echo apply_filter('form_of_address', $name, $gender );
// somewhere else
add_filter( 'form_of_address', function( $name, $gender ) {
if ( "female" == $gender ) {
$name = "Mrs. " . $name;
} else if ( "male" == $gender ) {
$name = "Mr. " . $name;
}
return $name
}, 10, 2 );
【讨论】:
您想知道操作和过滤事件(挂钩)之间的区别。
让我们从了解 WordPress 中的钩子或事件开始。
通过插件 API,WordPress 为我们提供了在事件发生时运行我们的代码的方法。
程序以从上到下的特定顺序运行。第 1 行运行,然后第 2 行运行,依此类推。当 WordPress 加载文件时,每个文件都会运行,依此类推。
在处理网页请求时,WordPress Core 正在运行代码行并做一些事情。但是,如果您需要在请求周期的某个时间点运行您的代码怎么办?例如,假设您要更改帖子的默认主题的署名。使用过滤器事件(挂钩),您可以获得:
没有我们的自定义主题或插件,WordPress 开箱即用。但是插件 API 为您和我以及所有开发人员提供了自定义、更改默认行为和扩展 WordPress 的方法。
它允许我们在需要时运行我们的代码,即在网页请求周期中的特定点。
为了让我们的代码运行,我们需要预先注册我们的回调,这是我们想要在该特定点运行的函数或方法。您使用add_action() 预注册一个动作事件回调。您使用add_filter() 预注册过滤器事件回调。
当您预先注册回调时,它会被添加到注册查找表中,该表是一个数组。
然后,当事件触发时,您的回调和所有其他回调将按顺序调用。您使用priority 参数设置顺序。参数将传递给您的回调。然后你的方法或函数运行。
Here's a video 解释了这个过程的总体情况及其原因。
过滤事件(钩子)允许您过滤返回值。它使您(以及所有其他注册的回调)能够过滤,这意味着更改值。
考虑一下。假设您想更改“阅读更多”链接。也许您希望它说“继续阅读”,也许您希望它成为一个按钮,而不仅仅是一个超链接。该过滤器允许您:
那个新值然后被传递给所有其他注册的回调,然后最终返回到触发事件的代码行。
动作事件(钩子)与过滤器相同,只是不返回值。
事件被触发,例如init 或plugins_loaded。预先注册的回调按顺序调用,任何参数都传递给每个回调。您的函数或方法被调用。你可以运行你的代码。
它为您提供了在网页请求周期中的特定点做某事的方法。
想想事件管理系统的威力。如果您需要在所有插件加载后立即运行某些内容,请预先注册到 plugins_loaded 事件名称。当 Core 通过 do_action( 'plugins_loaded' ); 触发事件时,您的代码也会运行。
过滤器和操作事件(挂钩)让您可以在网页请求周期中的特定点运行代码。
过滤事件(挂钩)可让您在处理之前过滤或更改值。动作事件不允许过滤。
对于动作事件,您可以使用do_action( 'event_name' ) 或do_action_ref_array( 'event_name', $args )。
对于过滤事件,可以使用apply_filters( 'event_name', $value_to_filter )或apply_filters( 'event_name', $args );
假设您想为帖子添加样式类属性。您可以预先注册到post_class 事件名称。您将收到一系列课程。
add_filter( 'post_class', 'add_my_class_attribute_to_post_class' );
/**
* Add styling class to the post class.
*
* @since 1.0.0
*
* @param array $classes
*
* @return array
*/
function add_my_class_attribute_to_post_class( array $classes ) {
$classes[] = 'some-class-attribute';
return $classes;
}
如果您想在首页的正文中添加样式类怎么办。
add_filter( 'body_class', 'add_front_page_to_body_class' );
/**
* Add the class attribute "front-page" to the body classes.
*
* @since 1.0.0
*
* @param array $classes
*
* @return array
*/
function add_front_page_to_body_class( array $classes ) {
$classes[] = 'front-page';
return $classes;
}
注意您是如何更改值然后将其返回的。
【讨论】: