将不同的函数有条件地挂接到同一筛选器,还是将其他参数传递给现有筛选器?

时间:2011-10-19 作者:Rutwick Gangurde

是否可以有条件地将3个不同的函数挂接到同一个过滤器,例如:

<?php
if(a){
    add_filter(\'the_content\', \'fnc_1\');
}
else if(b){
    add_filter(\'the_content\', \'fnc_2\');
}
else{
    add_filter(\'the_content\', \'fnc_3\');
}
?>
或者如果这不可能,那么我可以向同一个函数传递一个附加参数来标记我的3个不同条件吗?类似于:

<?php
if(a){
    add_filter(\'the_content\', \'fnc_1\', \'condition_a\');
}
else if(b){
    add_filter(\'the_content\', \'fnc_1\', \'condition_b\');
}
else{
    add_filter(\'the_content\', \'fnc_1\', \'condition_c\');
}
?>
我从我的阅读中所能发现的是,它与apply_filters, 但无法回避。

谁能告诉我如何做到这一点?谢谢

1 个回复
最合适的回答,由SO网友:soulseekah 整理而成

既然这确实是一个有趣的问题,我将继续编译一个答案。

方法1非常好,可以使用。下面是我用来测试它的紧凑代码:

function fnc_1( $content ) { return \'func1 :: \'.$content;   }
function fnc_2( $content ) { return \'func2 :: \'.$content;   }
function fnc_3( $content ) { return \'func3 :: \'.$content;   }

$a = false;
$b = false;

if ( $a ) add_filter( \'the_content\', \'fnc_1\' );
elseif ( $b ) add_filter( \'the_content\', \'fnc_2\' );
else add_filter( \'the_content\', \'fnc_3\' );
方法2

add_filter 不允许将其他参数传递给过滤器函数,但如果确实需要共享一个函数,可以在过滤器周围包装一个自定义过滤器,如下所示:

add_filter( \'wpse31470_filter_wrapper\', \'wpse31470_filter_wrapper_func\', null, 2 );

function wpse31470_filter_wrapper_func( $content, $condition ) {
    if ( $condition ) return \'TRUE :: \'.$content;
    else return \'FALSE ::\'.$content;
}

add_filter( \'the_content\', \'wpse31470_the_content_filter\' );
function wpse31470_the_content_filter( $content ) {
    $condition = true;
    return apply_filters( \'wpse31470_filter_wrapper\', $content, $condition );
}
的目的wpse31470_the_content_filter 是包装由提供的参数the_content 过滤并传递给您自己wpse31470_filter_wrapper 以及任何其他参数。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴