前两天学习了 add_filters() 函数,详见>>> WordPress学习——add_filter()详解 ,今天趁热打铁再来学习下它的使用。一般情况下 add_filters() 有两种方式触发,一种是当程序运行到特定时候 WordPress 程序会判断用户是否对某些参数做了新的定义,如果有则优先使用用户的设置;另一种方式是,用户可以直接通过 apply_filters() 函数直接调用。代码示例如下:

// 预定义的过滤器回调函数
function example_callback( $string, $arg1, $arg2 ) {
    // (maybe) modify $string
    return $string;
}
add_filter( 'example_filter', 'example_callback', 10, 3 );

// 通过 apply_filters() 传参调用定义好的过滤器回调函数
$value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );

apply_filters() 有两个固定参数以及其他我们需要传递给过滤器回调函数的参数,其调用方法如下所示:

apply_filters( string $tagmixed $value,$var,... )

$tag:必填(字符串)。过滤器钩子的名称。

$value:必填(混合)。可以被过滤器函数修改的值要过滤的值,如果没人过滤则直接返回这个值。

$var:可选(混合)传给过滤函数的额外的参数,辅助过滤函数对返回值进行操作,可以添加无限个。

最后,apply_filters() 函数定义在 wp-includes/plugin.php 文件中,具体代码如下:

function apply_filters( $tag, $value ) {
    global $wp_filter, $wp_current_filter;
    $args = array();
    // Do 'all' actions first.
    if ( isset($wp_filter['all']) ) {
        $wp_current_filter[] = $tag;
        $args = func_get_args();
        _wp_call_all_hook($args);
    }

    if ( !isset($wp_filter[$tag]) ) {
        if ( isset($wp_filter['all']) )
        array_pop($wp_current_filter);
        return $value;
    }

    if ( !isset($wp_filter['all']) )
        $wp_current_filter[] = $tag;
    if ( empty($args) )
        $args = func_get_args();
        // don't pass the tag name to WP_Hook
        array_shift( $args );
	$filtered = $wp_filter[ $tag ]->apply_filters( $value, $args );
	array_pop( $wp_current_filter );
    return $filtered;
}

文档参考:https://developer.wordpress.org/reference/functions/apply_filters/