it-swarm.cn

Remove_filter什么时候不起作用?

有报道说 remove_filter在某些情况下不起作用,我们应该提供替代方案 。但是,这篇文章并没有真正说清楚这种情况发生的原因。

我正在寻找能够打破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涉及 。请指出该代码中错误来源的位置。

3
Jan Fabry

那么这是一个非常具体的主题,绑定到Wordpress开发问题。如果你喜欢我的文章,我强烈建议你跟踪trac票。这是你能做的最好的事情我假设找出问题何时发挥作用以及如何在技术上规避它们(如果你不喜欢不要使用remove_filter() - 答案)。

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

这是否意味着它总会在实践中破裂? - 不!只是它有时会发生。然后当你需要依赖remove_filter()时,你就被困住了。

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

请将技术讨论保留在trac票证中。如果您对此感兴趣,请帮助解决当前设计的缺点。

3
hakre

正如Denis对Hakre的博客所评论的那样,这是该问题的一个非常基本的例子。

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 '';

在运行该代码之前,请问自己,您期望得到的结果是什么。一旦你确定了结果应该是什么,运行它,看看会发生什么。

1
t31os