40

Is there a way to know what functions are hooked to a particular hook? For example if I'd like to know what functions are hooked to the wp_head hook.

8
  • I'm pretty sure that this does what you want: @Rarst's Debug WordPress hooks
    – anu
    May 16, 2011 at 14:23
  • take a look at this answer to a similar question and more specifically the plugin posted there by mike.
    – Bainternet
    May 16, 2011 at 14:26
  • 1
    I could be wrong, but doesn't that just produce a comprehensive list of hooks? The way I'm reading the question is the he wants to know what functions are attached to the hook.
    – anu
    May 16, 2011 at 14:37
  • Partially wrong, he said "for example what's hooked to wp_head", so its a full list not only a single hook.
    – Bainternet
    May 16, 2011 at 15:21
  • Indeed, I wanted to see what functions are attached to a particular hook, so for example if 10 functions are hooked to wp_head then I'd like to list those 10. May 16, 2011 at 16:13

5 Answers 5

19

Look into the global variable $wp_filter. See my plugin for a list of all comment filters for an example:

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

Sample output for pre_comment_author_email:

array (
  10 => 
  array (
    'trim' => 
    array (
      'function' => 'trim',
      'accepted_args' => 1,
    ),
    'sanitize_email' => 
    array (
      'function' => 'sanitize_email',
      'accepted_args' => 1,
    ),
    'wp_filter_kses' => 
    array (
      'function' => 'wp_filter_kses',
      'accepted_args' => 1,
    ),
  ),
)
0
21

to see list of functions or actions hooked to a particular action hook you can use the following code.

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

For debug-purposes a simple

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

would do it ...

1
  • 3
    In my case, calling var_dump($wp_filter) produced too much output. I preferred using var_dump($wp_filter["<action name>"]). (Same goes for print_r - I personally preferred var_dump.)
    – Acsor
    Jun 17, 2017 at 21:42
5

This shows a more readable list of filters

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

I found the answer from @Simone G useful, but it didn't take into account the fact, that sometimes Closures can be hooked. Here's my more verbose (and ugly) version:

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.