对Add_Filter()函数的误解

时间:2016-04-29 作者:Selhar

我正在研究主题“一页”,代码如下:

function onepage_sections() {
$sections = array();

$sections[\'service_section\'] = array(
    \'id\' => \'service_section\',
    \'label\' => __(\'Service Section\', \'one-page\'),
    \'callback\' => \'onepage_service_section\',
);

$sections[\'blog_section\'] = array(
    \'id\' => \'blog_section\',
    \'label\' => __(\'Blog Section\', \'one-page\'),
    \'callback\' => \'onepage_blog_section\',
);

return apply_filters(\'onepage_sections\', $sections);
}
根据我所阅读的函数apply_filters 创建一个标记(稍后可以访问的键名)和一个内容,当有人使用时,该内容很容易更改add_filter(key_name, function_to_alter_content_in_key_name). 对的

我不明白的是,在这个主题中,没有调用add\\u filter(\'onepage\\u sections\')。它只是在前面的调用中声明的apply_filters. 有人能澄清一下这些功能的概念吗?

2 个回复
最合适的回答,由SO网友:Owais Alam 整理而成

add_filter ( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 )
将函数或方法挂接到特定的筛选器操作。

WordPress提供了过滤器挂钩,允许插件在运行时修改各种类型的内部数据。

插件可以通过将回调绑定到过滤器挂钩来修改数据。稍后应用过滤器时,每个绑定回调都会按优先级顺序运行,并有机会通过返回新值来修改值。

以下示例显示如何将回调函数绑定到过滤器挂钩。

请注意,$示例被传递给回调函数,(可能)已修改,然后返回:

function example_callback( $example ) {
    // Maybe modify $example in some way.
    return $example;
}
add_filter( \'example_filter\', \'example_callback\' );
绑定回调可以接受从none到作为参数在相应apply_filters() 呼叫

换句话说,如果apply_filters() 调用总共传递四个参数,绑定到它的回调可以不接受(与1相同)任何参数或最多四个。重要的是$accepted_args 值必须反映绑定回调实际接受的参数数。如果回调未接受任何参数,则认为该参数与接受1个参数相同。例如:

// Filter call.
$value = apply_filters( \'hook\', $value, $arg2, $arg3 );

// Accepting zero/one arguments.
function example_callback() {
    ...
    return \'some value\';
}
add_filter( \'hook\', \'example_callback\' ); // Where $priority is default 10, $accepted_args is default 1.

// Accepting two arguments (three possible).
function example_callback( $value, $arg2 ) {
    ...
    return $maybe_modified_value;
}
add_filter( \'hook\', \'example_callback\', 10, 2 ); // Where $priority is 10, $accepted_args is 2.
Note: 无论回调是否有效,函数都将返回true。由你来照顾好自己。这样做是为了优化,所以一切都尽可能快。

SO网友:Anton

我也遇到过同样的问题,我一直在寻找答案,在阅读了这里的答案后,我变得更加困惑。我决定使用apply\\u filters(\'filter\\u name\',$vars…)从未通过add\\u filter(\'filter\\u name\',function…)定义“filter\\u name”时is adding new filter 与add\\u filter相同,但不是!这样不行。事实上,它的工作方式与你想象的一样简单,与设计的方式一样。

注意:之前提供的解释和回答只是关于过滤器的工作原理,而不是OP询问的内容。让我们继续。

在这种情况下,什么;return apply\\u filters(\'filter\\u name\',$sections)的作用与

return $sections;
有一点不同,猜猜看,它应用附加到“filter\\u name”的过滤器。如果中没有筛选器“filter\\u name”apply_filters(\'filter_name\', $sections)-call 它返回$节,但如果用户已将筛选器附加到“filter\\u name”,则会应用筛选器。

这里唯一令人困惑的部分是过滤器和函数的名称相同。这带来了所有的困惑。我认为WP开发人员之所以这样命名是有原因的。

因此,“filter\\u name”从未调用add\\u filter(“filter\\u name”),因为没有理由这样做。改变函数确实会影响结果,因为z函数的使用方式与函数类似,它的调用方式与任何其他简单函数一样——function\\u name($var1,$var2)。再次重复,它只返回值along with 最后应用过滤器,以便用户(其他开发人员)可以向该过程添加自己的过滤器并更改结果。

希望你明白:)

相关推荐

绕过WP查询中的“supress_Filters”

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?这是我需要添加的过滤器:add_filter( \'posts_where\', function($where, $wp_query) {