Wp_Filter对象是否可以包含具有相同键的多个值

时间:2021-06-07 作者:ipr101

我想了解$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挂钩)?

1 个回复
最合适的回答,由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 ) 可能不会产生预期的结果。

相关推荐

绕过WP查询中的“supress_Filters”

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?这是我需要添加的过滤器:add_filter( \'posts_where\', function($where, $wp_query) {