32

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.

  • I'm pretty sure that this does what you want: @Rarst's Debug WordPress hooks – anu May 16 '11 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 '11 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 '11 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 '11 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. – Javier Villanueva May 16 '11 at 16:13
16

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,
    ),
  ),
)
  • Great little function toscho, thanks for sharing this. I'm using it to evaluate all of the action hooks loaded for a theme at the shutdown action. – Kevin Leary Feb 22 '12 at 16:01
11

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
    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 '17 at 21:42
3

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 @user3623530 useful, but it didn't take in to 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, privacy policy and cookie policy

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