我想了解$wp_filter
对象,我正在查看Fuxia在这个问题中发布的代码How to know what functions are hooked to an action/filter?
function list_comment_filters()
{
global $wp_filter;
$comment_filters = array ();
$h1 = \'<h1>Current Comment Filters</h1>\';
$out = \'\';
$toc = \'<ul>\';
foreach ( $wp_filter as $key => $val )
{
if ( FALSE !== strpos( $key, \'comment\' ) )
{
$comment_filters[$key][] = var_export( $val, TRUE );
}
}
foreach ( $comment_filters as $name => $arr_vals )
{
$out .= "<h2 id=$name>$name</h2><pre>" . implode( "\\n\\n", $arr_vals ) . \'</pre>\';
$toc .= "<li><a href=\'#$name\'>$name</a></li>";
}
print "$h1$toc</ul>$out";
}
据我所知,第一个
foreach
循环,并调用
implode
在第二个
foreach
处理以下情况:
$wp_filter
对象包含两个具有相同键的条目。所以我的问题是
这可能吗在什么情况下会发生这种情况
Edit
根据Jacob Peattie的回答,我可以看出
$wp_filter[\'save_post\']
可以包含多个值,用另一种方式表述我的问题,在代码的这一部分
foreach ( $wp_filter as $key => $val )
{
if ( FALSE !== strpos( $key, \'comment\' ) )
{
$comment_filters[$key][] = var_export( $val, TRUE );
}
}
有没有同样的情况
$key
值可能遇到两次?我怀疑
$comment_filters[$key][] = var_export( $val, TRUE );
可以更改为
$comment_filters[$key] = var_export( $val, TRUE );
函数返回的结果总是相同的。
或者是否存在这样一种情况$wp_filter
可以包含具有相同键的两个元素(不是一个元素包含引用多个函数的数组/WP\\u挂钩)?
最合适的回答,由SO网友:Jacob Peattie 整理而成
首先,请记住$wp_filter
已在WordPress 4.7中更改:https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/
关于您的问题:
这可能吗?
对
在什么情况下会发生这种情况?
如果多个函数已连接到同一操作/筛选器,例如:
add_action( \'save_post\', \'do_a_thing\' );
add_action( \'save_post\', \'do_another_thing\' );
在这种情况下
$wp_filter[\'save_post\']
将具有多个值。
要解决您的编辑问题,请执行以下操作:
是否有可能遇到两次相同的$键值?我怀疑
$comment_filters[$key][] = var_export( $val, TRUE );
可以更改为
$comment_filters[$key] = var_export( $val, TRUE );
不,不可能两次遇到相同的键。PHP数组不能多次具有相同的键。
您修改的代码是正确的。事实上,如果没有改变implode( "\\n\\n", $arr_vals )
可能不会产生预期的结果。