我已经看过好几次了,但我不明白的是:functions.php
定义一个函数,然后将其附加到挂钩,如下所示(简化示例):
function do_stuff($a, $b) {
// Do stuff with $a and $b
}
add_filter( \'bloginfo_url\', \'do_stuff\', 10, 2 );
基本上我想我知道那里发生了什么,但我怎么知道呢
$a
和
$b
是吗
在“传统”PHP方式中,可以这样调用函数:
do_stuff("var a content", $var_b_content);
那很清楚什么
$a
和
$b
包含,但我怎么能用Wordpress知道呢?
现实生活中的示例,以以下函数为例(贷记到Frank Bültge):
if ( ! function_exists( \'fb_css_cache_buster\' ) ) {
function fb_css_cache_buster( $info, $show ) {
if ( ! isset($pieces[1]) )
$pieces[1] = \'\';
if ( \'stylesheet_url\' == $show ) {
// Is there already a querystring? If so, add to the end of that.
if ( strpos($pieces[1], \'?\' ) === FALSE ) {
return $info . "?" . filemtime( WP_CONTENT_DIR . $pieces[1] );
} else {
$morsels = explode( "?", $pieces[1] );
return $info . "&" . filemtime( WP_CONTENT_DIR . $morsles[1] );
}
} else {
return $info;
}
}
add_filter( \'bloginfo_url\', \'fb_css_cache_buster\', 9999, 2 );
}
该函数可用于CSS版本控制,方法是附加上次更改的日期(使用
filemtime
) 作为对CSS调用的查询字符串。
你可以看到$info
和$show
作为传递给该函数的变量。但是我怎么知道这些变量包含什么呢?他甚至在条件逻辑中使用这些变量(\'stylesheet_url\' == $show
) 所以某种程度上,有些东西必须自动传递?
最合适的回答,由SO网友:s1lv3r 整理而成
基本上,每个过滤器都必须在原始函数代码中注册(因为过滤器只是一种覆盖默认函数中发生的内容的方法)。因此,在将自定义函数附加到过滤器之前,请使用add_filter()
过滤器必须在注册之前使用apply_filters()
(还有其他功能也可以做到这一点,但这是最重要的功能)。
因此,在您在original function 有一个呼叫apply_filters()
(第533行):
$output = apply_filters(\'bloginfo_url\', $output, $show);
如您所见,原始函数上下文中的两个参数是
$output
和
$show
.
综上所述,找出过滤器参数的最佳方法是:
查看codex (尽管并非所有过滤器都有完整的文档记录)查看原始函数的源代码,查看哪些参数传递给过滤器
my_function($output);
function my_function($info) {
// in the context of this function the content of $output is now inside the variable $info.
}
还有,名为“bloginfo\\u url”的过滤器中到底发生了什么?我试图在核心找到它,但它不在那里。
默认情况下bloginfo_url
. WordPress Core未将任何函数附加到此筛选器。它只是为您提供了这个过滤器,因此您可以更改本机WordPress行为,而无需修改任何核心文件。(这只是这个过滤器的情况,其他一些过滤器由WordPress自己使用。)
在使用这些过滤器时,您始终要记住的一件事是,其他人(插件或WordPress本身)可以附加与您希望通过功能实现的内容冲突的功能。您可以使用$priority
参数。