描述
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 | 开始引入 |
使用示例
示例:让我们在TwentySeventeen首页添加额外的部分。
默认情况下,TwentySeventeen主题在首页有4个部分。此示例将使它们成为6add_filter( 'twentyseventeen_front_page_sections', 'prefix_custom_front_page_sections' ); function prefix_custom_front_page_sections( $num_sections ) { return 6; }
要将变量传递给过滤器的被调用函数,可以在原始编码的apply_filters中没有参数时使用闭包(自从PHP 5.3+)。例如:
add_filter('wp_footer', function($arguments) use ($myvar) { return $myvar; }, $priority_integer, $accepted_arguments_integer);
示例:让我们显示文章摘要的自定义长度。
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的一个很好且最简单的用法。
示例:如果要在内容中注入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; }
在过滤器钩子触发之前,不需要定义回调
$function_to_add
。这意味着:add_filter
函数不检查$function_to_add
是否存在$function_to_add
的function
语句可以在add_filter
语句之后定义,即使是在条件(例如–if
块)中,其中$function_to_add
函数在add_filter
函数执行之后才实际存在- 如果过滤器挂钩从未触发,则未定义的$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
在特殊情况下,您必须在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()。示例
过滤器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>'; }