有没有办法知道将哪些函数挂钩到特定的挂钩?例如,如果我想知道wp_head挂钩上有哪些函数。

评论

我很确定这可以满足您的要求:@Rarst的Debug WordPress挂钩

看看这个问题的答案,更具体地说是mike在此处发布的插件。

我可能是错的,但是那不就产生了钩子的完整清单吗?我读问题的方式是他想知道钩子上附加了什么功能。

他说的是部分错误,“例如,wp_head的钩子是什么”,因此它的完整列表不仅是单个钩子。
确实,我想查看附加到特定挂钩的函数,例如,如果将10个函数挂钩到wp_head,那么我想列出那些10

#1 楼

查看全局变量$wp_filter。有关示例的所有评论过滤器列表,请参见我的插件:

<?php
/*
Plugin Name: List Comment Filters
Description: List all comment filters on wp_footer
Version:     1.1
Author:      Fuxia Scholz
License:     GPL v2
*/

add_action( 'wp_footer', 'list_comment_filters' );

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";
}


pre_comment_author_email的示例输出:

#2 楼

若要查看挂钩到特定动作挂钩的功能或动作的列表,可以使用以下代码。

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';


#3 楼

对于调试目的,简单的

global $wp_filter;
echo "<pre>" . print_r($wp_filter, true) . "</pre>";


... ...

评论


就我而言,调用var_dump($ wp_filter)会产生太多输出。我更喜欢使用var_dump($ wp_filter [“ <动作名称>”])。 (print_r也是如此-我个人更喜欢var_dump。)

–雅高
17年6月17日在21:42

#4 楼

这显示了更具可读性的过滤器列表

function print_filters_for( $hook = '' ) {
    global $wp_filter;
    if( empty( $hook ) || !isset( $wp_filter[$hook] ) ) return;

    $ret='';
    foreach($wp_filter[$hook] as $priority => $realhook){
        foreach($realhook as $hook_k => $hook_v){
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            $ret.=  "\n$priority $hook_echo";
        }

    }
     return $ret;
}


#5 楼

我发现@Simone G的答案很有用,但没有考虑到有时可以钩上Closures的事实。这是我更冗长(又丑陋)的版本:

if( isset($wp_filter[$filterName]) ){
    foreach( $wp_filter[$filterName] as $priority => $hooks){
        foreach ($hooks as $hook_k => $hook_v) {
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            if(is_object($hook_echo) && ($hook_echo instanceof Closure)){
                $hook_echo="closure";
            }
            error_log($filterName." HOOKED (".serialize($priority)."): ".serialize($hook_k)."".serialize($hook_echo));
        }
    }
} else {
    error_log($filterName." NO FILTERS HOOKED");
}


#6 楼

这可以节省我的时间,因为我可以在任何页面直接看到https://wordpress.org/plugins/show-hooks/