如何对所有东西都应用滤镜?

时间:2016-06-28 作者:ditto

我想对所有东西都应用一个过滤器。

add\\u filter(\'the\\u content\',word\\u swap);

有我可以替代的术语吗the_content 这将针对所有功能?

3 个回复
SO网友:Danny Cohen

没有“过滤所有内容”功能。

WordPress对他们的capital_P_dangit() 附加到“the\\u title”、“the\\u content”和“comment\\u text”的函数。https://developer.wordpress.org/reference/functions/capital_p_dangit/

SO网友:C C

看看kfriend的解决方案。。。它起作用了。不确定是否有其他风险,但确实有效。

https://stackoverflow.com/questions/772510/wordpress-filter-to-modify-final-html-output

使用这个,你几乎可以用其他任何东西替换任何东西。

SO网友:Hovo

有一个名为“all”的预定义过滤器,您可以使用add_filter(\'all\', \'word_swap\');

功能word_swap 作为回调传递,将接受过滤器标记(过滤器名称)作为第一个参数,第二个参数将是值。对于某些筛选器(如“shutdown”),可以跳过value参数,因此它必须保留默认值。

function word_swap($tag, $value = null){
    // change value the way you want here
    return $changed_value;
}
用法示例1:限制您的功能word_swap 在为某些筛选器标记执行时,可以保留一组标记以进行排除。

function get_tags_to_exclude(){
    return [\'some_filter_to_exclude_1\', \'some_filter_to_exclude_2\'];
}
function word_swap($tag, $value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // do whatever you want here
    return changed_value;
}
用法示例2:允许您的函数word_swap 要仅对某些筛选器标记执行,可以保留允许的标记数组。

function get_tags_to_allow(){
    return [\'some_filter_to_allow_1\', \'some_filter_to_allow_2\'];
}
function word_swap($tag, $value = null){
    if( !in_array( $tag, get_tags_to_allow() ) ){
        return $value;
    }
    // do whatever you want here
    return changed_value;
}
如果您希望仅在少数情况下调用筛选器,那么最好使用add_filter 一个接一个像

add_filter(\'tag1\', \'word_swap\');
add_filter(\'tag2\', \'word_swap\');
因此,如果允许的过滤器数组不包含几乎所有的过滤器,那么示例2是一个糟糕的用法示例。

但是,如果您真的希望对几乎所有的情况都调用过滤器(可能不包括其中的一些),或者如果您想在开发阶段做一些事情,比如跟踪过滤器的执行,那么就可以了。

“all”过滤器总是在过滤器本身之前执行,因此如果有这样的代码

add_filter(\'all\', \'word_swap\');
add_filter(\'some_filter\', \'other_function\');
您的功能word_swap 将始终在other_function. 您甚至可以在函数中使用add\\u filterword_swap 像这样。

function get_tags_to_exclude(){
    return [\'some_filter_to_exclude_1\', \'some_filter_to_exclude_2\'];
}
function word_swap_wrapper($tag, $value = null){
    add_filter($tag, \'word_swap\');
    return $value;
}
add_filter(\'all\', \'word_swap_wrapper\');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // do whatever you want here
    return changed_value;
}
如果你想彻底过滤所有东西,我想你不会想要它的。如果你想要你的功能word_swap 要在执行所有其他回调后工作,可以使用如下优先级:

function get_tags_to_exclude(){
    return [\'some_filter_to_exclude_1\', \'some_filter_to_exclude_2\'];
}
function word_swap_wrapper($tag, $value = null){
    add_filter($tag, \'word_swap\', PHP_INT_MAX);
    return $value;
}
add_filter(\'all\', \'word_swap_wrapper\');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // do whatever you want here
    return changed_value;
}
我不知道有什么更好的方法来注册要在最后执行的回调,所以请为我修复任何人。

让我们看看函数word_swap_wrapper, 它将注册word_swap 函数,以限制我们可以在注册之前检查它word_swap 一次又一次地为同一个标签。因此,最终解决方案将是:

function get_tags_to_exclude(){
    return [\'some_filter_to_exclude_1\', \'some_filter_to_exclude_2\'];
}
function word_swap_wrapper($tag, $value = null){
    static $lookup;
    if(!$lookup){
        $lookup = [];
    } elseif( !isset($lookup[ $tag ]) ){
        $lookup[ $tag ] = true;
        add_filter($tag, \'word_swap\', PHP_INT_MAX);
    }
    return $value;
}
add_filter(\'all\', \'word_swap_wrapper\');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // do whatever you want here
    return changed_value;
}
您可以找到WP预定义筛选器的不完整列表herehere

相关推荐

Apply_Filters()对所需的参数进行切片

我正在尝试向WooCommerce订单中的每个退款行添加一个按钮(其功能超出了这个问题的范围,足以说明它需要退款id作为参数)。我发现这些行是在woocommerce\\includes\\admin\\meta Box\\views\\html订单退款中创建的。无法重写的php。然而,有一项行动:do_action( \'woocommerce_admin_order_item_values\', null, $refund, $refund->get_id() ); 这似乎非常适合我的