当前浏览:首页 / WordPress函数 / add_filter()

add_filter( string $hook_name, callable $callback, int $priority = 10, int $accepted_args = 1 )

将回调函数添加到过滤器钩子

addmore...

filter 过滤


描述

WordPress提供了过滤器钩子,允许插件在运行时修改各种类型的内部数据。

插件可以通过将回调绑定到过滤器挂钩来修改数据。稍后应用过滤器时,每个绑定回调都会按优先级顺序运行,并有机会通过返回新值来修改值。

下面的示例展示回调函数如何绑定到过滤器钩子。

请注意,$example被传递给回调函数,(可能)修改,然后返回:

function example_callback( $example ) {
    // Maybe modify $example in some way.
    return $example;
}
add_filter( 'example_filter', 'example_callback' );

绑定回调可以接受从“无”到在相应的apply_filters()调用中作为参数传递的参数总数。

换句话说,如果一个apply_filters()调用总共传递了4个参数,
则绑定的回调可以不接受任何参数(与1相同),或者最多接受4个参数。
重要的一点是$accepted_args值必须反映绑定回调实际选择接受的参数数量。
如果回调没有接受参数,则认为与接受1个参数相同。例如:

// Filter call.
$value = apply_filters( 'hook', $value, $arg2, $arg3 );

// Accepting zero/one arguments.
function example_callback() {
    ...
    return 'some value';
}
add_filter( 'hook', 'example_callback' ); // Where $priority is default 10, $accepted_args is default 1.

// Accepting two arguments (three possible).
function example_callback( $value, $arg2 ) {
    ...
    return $maybe_modified_value;
}
add_filter( 'hook', 'example_callback', 10, 2 ); // Where $priority is 10, $accepted_args is 2.

注意:无论回调是否有效,函数都将返回true。这样做是为了优化,所以一切都尽可能快。


参数

$hook_name

(string)(必填) 要添加回调的过滤器的名称。

$callback

(callable)(必填) 应用过滤器时要运行的回调。

$priority

(int)(可选) 用于指定与特定过滤器关联的函数的执行顺序。较低的数字对应较早的执行,具有相同优先级的函数按照它们添加到过滤器的顺序执行。

默认值: 10

$accepted_args

(int)(可选) 函数接受的参数个数。

默认值: 1


返回

(true) 它总是返回true。


更多信息

  • 钩子函数可以接受在运行匹配的do_action()apply_filters()调用时设置的额外参数。例如,comment_id_not_found动作将向每个回调传递评论ID。
  • 虽然可以传递$accepted_args的数量,但只能操作$value。其他参数仅用于提供上下文,它们的值不能由过滤函数更改。
  • 还可以将类方法作为回调传递。
静态类方法:

 	add_filter( 'media_upload_newtab', array( 'My_Class', 'media_upload_callback' ) );
	
实例方法:

 	add_filter( 'media_upload_newtab', array( $this, 'media_upload_callback' ) );
	
  • 还可以将匿名函数作为回调传递。例如:
 	add_filter( 'the_title', function( $title ) { return '<strong>' . $title . '</strong>'; } );
	


源码

查看源码 官方文档


更新日志

版本描述
0.71开始引入

使用示例

  • 示例1

    示例:让我们在TwentySeventeen首页添加额外的部分。
    默认情况下,TwentySeventeen主题在首页有4个部分。此示例将使它们成为6

    add_filter( 'twentyseventeen_front_page_sections', 'prefix_custom_front_page_sections' );
    	
    function prefix_custom_front_page_sections( $num_sections )
    {
    		return 6;
    }
    
  • 示例2

    要将变量传递给过滤器的被调用函数,可以在原始编码的apply_filters中没有参数时使用闭包(自从PHP 5.3+)。例如:

    add_filter('wp_footer', function($arguments) use ($myvar) { 
        return $myvar;
    }, $priority_integer, $accepted_arguments_integer);
    
  • 示例3

    示例:让我们显示文章摘要的自定义长度。

    if( ! function_exists( 'prefix_custom_excerpt_length' ) )
    {
    	function prefix_custom_excerpt_length( $length )
    	{
    		return 40;
    	}
    }
    add_filter( 'excerpt_length', 'prefix_custom_excerpt_length', 999 );
    

    默认情况下,WordPress显示57个字符。您可以使用上述代码设置自定义长度。除了长度将是40之外,它是add_filter的一个很好且最简单的用法。

  • 示例4

    示例:如果要在内容中注入CSS CLASS/ID。让我们为文章内容添加额外的CLASS/ID。

    //Add Class/ID to Post Content
    add_filter('the_content', 'xai_my_class');
    function xai_my_class($content)
    {
        //Replace the instance with the Class/ID markup.
        $string = '<ul'; //your tag
        $replace = '<ul class="detail-list"'; //add your class/id and tag
        $content = str_replace( $string, $replace, $content );
        return $content;
    }
  • 示例5

    在过滤器钩子触发之前,不需要定义回调$function_to_add。这意味着:

    1. add_filter函数不检查$function_to_add是否存在
    2. $function_to_addfunction语句可以在add_filter语句之后定义,即使是在条件(例如–if块)中,其中$function_to_add函数在add_filter函数执行之后才实际存在
    3. 如果过滤器挂钩从未触发,则未定义的$function_to_add函数不会作为错误报告

    测试或质量控制期间需要考虑第3点

    当过滤器挂钩触发时检测到未定义的$function_to_add函数,并报告为警告错误:
    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'reg_public1' not found or invalid function name in /var/www/example.com/public_html/wp-includes/class-wp-hook.php on line 288

  • 示例6

    在特殊情况下,您必须在WordPress启动前添加过滤器,您可以创建并预填充全局$wp_filter数组,而不是使用尚未可用的add_filter(或add_action)函数:

    // Instead of add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ):
    $GLOBALS['wp_filter'][ $tag ][ $priority ][] = array(
      'function'      => $function_to_add,
      'accepted_args' => $accepted_args
    );
    

    WP_Hook::build_preinitialized_hooks将自动处理其余部分。
    尽管要删除过滤器,您只能使用remove_all_filters()

  • 示例7

    示例
    过滤器img_caption_shortcode使用以下调用应用于media.php

    // Allow plugins/themes to override the default caption template.
    $output = apply_filters( 'img_caption_shortcode', '', $attr, $content );
    if ( $output != '' )
    	return $output;
    

    将使用三个参数调用目标过滤器函数:

    '' <= 这通常是过滤器的值将被修改
    $attr
    $content

    为了使过滤器函数实际接收完整的参数列表,必须修改对add_filter()的调用,以指定参数列表上有3个参数。

    add_filter('img_caption_shortcode', 'my_img_caption_shortcode_filter',10,3);
    
    /**
     * Filter to replace the  shortcode text with HTML5 compliant code
     *
     * @return text HTML content describing embedded figure
     **/
    function my_img_caption_shortcode_filter($val, $attr, $content = null)
    {
    	extract( shortcode_atts( array(
    		'id'	=> '',
    		'align'	=> '',
    		'width'	=> '',
    		'caption' => ''
    	), $attr ) );
    	
    	if ( 1 > (int) $width || empty($caption) )
    		return $val;
    
    	$capid = '';
    	if ( $id ) {
    		$id = esc_attr( $id );
    		$capid = 'id="figcaption_' . $id . '" ';
    		$id = 'id="' . $id . '" aria-labelledby="figcaption_' . $id . '" ';
    	}
    
    	return '<figure ' . $id . 'class="wp-caption ' . esc_attr($align) . '" style="width: '
    	. (10 + (int) $width) . 'px">' . do_shortcode( $content ) . '<figcaption ' . $capid 
    	. 'class="wp-caption-text">' . $caption . '</figcaption></figure>';
    }