add_filter和apply_filters之间的区别


17

我已经寻找之间的差异的合适的解释add_filter(),并apply_filters()在这里,但没能找到。

任何人都可以告诉我在使用之前add_filterapply_filters在一种情况下要考虑哪些信息或逻辑。

那使得必须使用一项而不是另一项?

  • add_filter只是将一个功能添加到等待在变量上apply_filters执行的功能队列中并按顺序执行功能是否正确?

  • 是不是也很正确,apply_filters当一个参数(要运行的函数的名称)呼吁将队列中的所有其他前执行该功能(如果存在的话)?


2
此处此处的现有文档又如何呢?
t31os 2014年

3
我认为这实际上是一个好问题。作为新的WordPress开发者,这可能是一个令人困惑的概念。
肖恩2014年

Answers:


26

以下大多数内容都可以在食典中找到:


apply_filters

$tag通过调用此函数来调用附加到过滤器挂钩的回调函数。通过使用$ tag参数指定的新钩子名称简单地调用此函数,可以使用此函数创建新的过滤器钩子。

$value = apply_filters( $tag, $value, $var_1, $var_2, ... );

从本质上来说:
您可以使用apply_filters过滤给定$value-相对于本身的价值以及可选地设置变量$var_1通过$var_n


add_filter

将函数挂钩到特定的过滤器动作。

add_filter( $tag, $function_to_add, $priority, $accepted_args );

本质上:
您可以add_filter将自定义函数挂接到给定的过滤器操作($tag),该过滤器操作可能是apply_filters之前生成的(或者它是内置过滤器操作或源自于插件/您的​​主题)。


因此,这是一个虚构的示例:

function print_initials( $name ) {

    if ( ! is_string( $name ) ) {
        return;
    }

    $fragments = explode( ' ', $name );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

现在,如果我们按原样调用函数,则首字母从左到右打印,因为这就是我们定义的默认行为。

第二次,我们以相反的顺序获得了首字母缩写-因为__return_true挂接到我们的过滤器动作上的filter函数始终返回TRUE,因此使首字母缩写从右向左输出。


3
这是一个很好的答案,它说明了如何覆盖过滤器。谢谢。
肖恩2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.