wordpress中action hook和filter hook有什么区别?

时间:2016-12-13 14:15:50

标签: wordpress

我读取动作钩子用于调用函数和过滤器钩子用于在保存或在网站上显示之前过滤内容。你能告诉我项目例子的一些工作阶段,我们使用action和filter hook。所以最好多了解一下。

3 个答案:

答案 0 :(得分:4)

行动:做新事物。防爆。添加CSS和JS。

过滤:执行WordPress中已有的操作。添加或删除一些东西。假设在发布内容后添加一些文本。这意味着用WordPress做点什么。

示例代码:

OR

答案 1 :(得分:2)

简而言之:

过滤钩:用于修改(过滤)值

动作挂钩:此刻做点什么

过滤钩示例:

$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 );

答案 2 :(得分:1)

您想知道动作和过滤器事件(钩子)之间的区别。

让我们从了解WordPress中的钩子或事件开始。

什么是钩子(事件)?

  

通过插件API,WordPress为我们提供了在事件发生时运行我们的代码的方法

程序从上到下按特定顺序运行。第1行运行,然后第2行,依此类推。当WordPress加载文件时,每个文件都会运行,依此类推。

在处理网页请求时,WordPress Core正在运行代码行并执行操作。但是,如果您需要在请求周期中的某个点运行代码,该怎么办?例如,假设您要从主题的默认值更改帖子的署名。使用过滤器事件(钩子),您获得:

  • 在发送到浏览器之前访问实际值或HTML
  • 能够更改该值或HTML
  • 能够在网页请求周期中的特定点运行其他代码。

为什么会有钩子(事件)?

WordPress开箱即用,没有我们的自定义主题或插件。但是插件API为您和我以及所有开发人员提供了自定义,更改默认行为和扩展WordPress的方法。

它允许我们在需要时运行我们的代码,即在网页请求周期的特定点。

预注册

为了运行我们的代码,我们需要预先注册我们的回调,这是我们想要在该特定点运行的函数或方法。您使用add_action()预先注册动作事件回调。您使用add_filter()预先注册过滤器事件回调。

当您预先注册回调时,它会被添加到注册查找表中,这是一个数组。

然后,当事件触发时,将按顺序调用您的回调和所有其他回调。您可以使用priority参数设置订单。参数将传递给您的回调。然后你的方法或函数运行。

Here's a video解释了这个过程的大局及其原因。

行动与过滤器

过滤器事件(hook)允许您过滤返回值。它为您(以及所有其他已注册的回调)提供了过滤功能,这意味着可以更改值。

想一想。假设您要更改“阅读更多”链接。也许你想要它说“继续阅读”,也许你希望它是一个按钮,而不仅仅是一个超链接。过滤器允许您:

  • 接收当前值
  • 将其更改为您想要的内容
  • 将其寄回

然后将新值传递给所有其他已注册的回调,然后最终返回到触发该事件的代码行。

行动事件

动作事件(hook)与过滤器相同,只是不返回值。

触发事件,例如initplugins_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;
}

注意您是如何更改值然后将其返回的。