什么时候REMOVE_FILTER不起作用?

时间:2010-09-05 作者:Jan Fabry

有报道称remove_filter does not work under some circumstances, and that we should provide alternatives. 然而,这篇文章并没有真正明确说明在什么情况下会发生这种情况。

我正在寻找将中断的代码示例remove_filter, 提供了WordPress和PHP版本,以及最终提供的其他相关信息。我认为以下代码片段应该是一个有用的模板:

<?php
include(\'wp-load.php\');

function filtertest_function($value)
{
    return \'Filtered\';
}

var_dump(apply_filters(\'filtertest\', \'Original value\'));
add_filter(\'filtertest\', \'filtertest_function\');
var_dump(apply_filters(\'filtertest\', \'Original value\'));
remove_filter(\'filtertest\', \'filtertest_function\');
var_dump(apply_filters(\'filtertest\', \'Original value\'));
这将返回预期的:

string(14) "Original value"
string(8) "Filtered"
string(14) "Original value"
我相信在某些情况下会出现错误,其中过滤器是类的一部分,或者使用了多个过滤器。我理解_wp_filter_build_unique_id is involved. 请指出该代码中错误的来源。

2 个回复
SO网友:hakre

这是一个与Wordpress开发问题相关的非常具体的主题。如果您喜欢我的文章,我强烈建议您跟踪trac记录。我想这是你能做的最好的事情,可以找出问题何时出现,以及如何从技术上规避它们(如果你不喜欢,就不要使用remove_filter()-回答)。

从理论的角度来看:只是没有严格处理所使用的数据类型,以确保在所有可能的值上都具有相同的功能(f(n)!=f(n))。简而言之:一个破碎的设计。

这是否意味着在练习中总是会中断?-不只是有时候会发生。然后当你需要依靠remove_filter().

一个更好的建议可能是这样的:如果您开发的插件使用挂钩作为类方法,请确保该插件在安装PHP 5.2/5.3时执行。

请将技术讨论记录在trac记录单中。如果您非常感兴趣,请帮助修复当前设计的缺点。

SO网友:t31os

正如丹尼斯在哈克雷的博客上评论的那样,这是一个非常基本的例子。

function run_me_once() {
    remove_action( \'foobar\', \'run_me_once\' );
    echo \'test....\';
}
add_action( \'foobar\', \'run_me_once\' );

function run_me2() {
    echo \'test2....\';
}
add_action( \'foobar\', \'run_me2\', 11 );

echo \'\';
do_action( \'foobar\' ); // test....
echo \'\';
echo \'\';
do_action( \'foobar\' ); // test2....
echo \'\';
但是,在运行该代码之前,请扪心自问,您希望得到什么样的结果。一旦你决定了结果应该是什么,运行它,看看会发生什么。

结束

相关推荐