我在这里搜索了关于add_filter()apply_filters()之间的区别的适当解释,但找不到。

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

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


add_filter只是将一个函数添加到等待在变量上执行的功能队列中,并且apply_filters按顺序执行这些功能是否正确?
是否也正确? apply_filters当用参数(要运行的函数的名称)调用时,将在队列中的所有其他函数(如果存在)之前执行该函数吗?


评论

那么这里和这里的现有文档又如何不能为您充分解释呢?

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

#1 楼

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


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


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

第二次,我们得到了初始行为s的顺序相反-因为连接到我们的过滤器操作的过滤器函数__return_true始终返回TRUE,因此使首字母从右向左输出。

评论


这是一个很好的答案,它说明了如何覆盖过滤器。谢谢。

–肖恩
2014年9月29日在18:01