Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Where can I find a list of all the WordPress hooks and over-ridable functions (pluggable, scriptable, etc)?

Edit: Plugin is here: http://wordpress.stackexchange.com/questions/307/where-can-i-find-a-list-of-wordpress-hooks/339#339

share|improve this question
add comment

5 Answers

up vote 32 down vote accepted

@Arlen: As Keith S points out Adam Brown's List of Hooks is the defacto resource of hooks for WordPress. However, it's not perfect:

  • It doesn't show the hooks in order of when they are called,
  • It doesn't provide file name or line number where invoked,
  • It doesn't provide a number of arguments passed,
  • It's not a complete list because some hooks can be called dynamically,
  • And it doesn't show hooks from plugins.

So while Adam's list is a great resource especially for understanding when hooks were historically added it's not nearly as useful as if you were able to instrument the hooks on any given page on your own site.

I've been toying with this idea for a while so your question triggered me to write a plugin called "Instrument Hooks for WordPress." You can find the full source below the screen shot and can you can also download it from gist here.

So here's a screenshot of what the instrumentation looks like:

Screenshot of Instrument Hooks for WordPress Plugin in action

You trigger the instrumentation by using the URL parameter instrument=hooks, i.e.:

http://example.com?instrument=hooks

And as promised, here's the source (or download it here.):

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/

if ($_GET['instrument']=='hooks') {

    add_action('shutdown','instrument_hooks');
    function instrument_hooks() {
        global $wpdb;
        $hooks = $wpdb->get_results("SELECT * FROM wp_hook_list ORDER BY first_call");
        $html = array();
        $html[] = '<style>#instrumented-hook-list table,#instrumented-hook-list th,#instrumented-hook-list td {border:1px solid gray;padding:2px 5px;}</style>
<div align="center" id="instrumented-hook-list">
    <table>
        <tr>
        <th>First Call</th>
        <th>Hook Name</th>
        <th>Hook Type</th>
        <th>Arg Count</th>
        <th>Called By</th>
        <th>Line #</th>
        <th>File Name</th>
        </tr>';
        foreach($hooks as $hook) {
            $html[] = "<tr>
            <td>{$hook->first_call}</td>
            <td>{$hook->hook_name}</td>
            <td>{$hook->hook_type}</td>
            <td>{$hook->arg_count}</td>
            <td>{$hook->called_by}</td>
            <td>{$hook->line_num}</td>
            <td>{$hook->file_name}</td>
            </tr>";
        }
        $html[] = '</table></div>';
        echo implode("\n",$html);
    }

    add_action('all','record_hook_usage');
    function record_hook_usage($hook){
        global $wpdb;
        static $in_hook = false;
        static $first_call = 1;
        static $doc_root;
        $callstack = debug_backtrace();
        if (!$in_hook) {
            $in_hook = true;
            if ($first_call==1) {
                $doc_root = $_SERVER['DOCUMENT_ROOT'];
                $results = $wpdb->get_results("SHOW TABLE STATUS LIKE 'wp_hook_list'");
                if (count($results)==1) {
                    $wpdb->query("TRUNCATE TABLE wp_hook_list");
                } else {
                    $wpdb->query("CREATE TABLE wp_hook_list (
                    called_by varchar(96) NOT NULL,
                    hook_name varchar(96) NOT NULL,
                    hook_type varchar(15) NOT NULL,
                    first_call int(11) NOT NULL,
                    arg_count tinyint(4) NOT NULL,
                    file_name varchar(128) NOT NULL,
                    line_num smallint NOT NULL,
                    PRIMARY KEY (first_call,hook_name))"
                    );
                }
            }
            $args = func_get_args();
            $arg_count = count($args)-1;
            $hook_type = str_replace('do_','',
                str_replace('apply_filters','filter',
                    str_replace('_ref_array','[]',
                        $callstack[3]['function'])));
            $file_name = str_replace($doc_root,'',$callstack[3]['file']);
            $line_num = $callstack[3]['line'];
            $called_by = $callstack[4]['function'];
            $wpdb->query("INSERT wp_hook_list
                (first_call,called_by,hook_name,hook_type,arg_count,file_name,line_num)
                VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
            $first_call++;
            $in_hook = false;
        }
    }
}
share|improve this answer
    
Excellent plugin Mike. I added it to my dev collection. –  Keith S. Aug 14 '10 at 3:01
3  
Thanks. Maybe I should put it in the repository? –  MikeSchinkel Aug 14 '10 at 3:03
    
I would...it's one of those things that you might only use once or twice, but when you do use it, you thank the stars for it :) –  Keith S. Aug 14 '10 at 3:09
1  
Mike, that's very cool! But what would you recommend for actually understanding what each filter/action does? is there a file where all of those are listed along with their 'activity'? Thanks! –  Amit Aug 14 '10 at 13:10
2  
@Mike: Quick question, why do you store that into the database instead of memory or a temporary stream? –  hakre Aug 18 '10 at 8:31
show 8 more comments

This is my go-to site when I'm looking for hook info... WordPress Hooks Database

share|improve this answer
    
Ditto on the reference. –  EAMann Aug 13 '10 at 15:35
add comment

The Codex has an Action Reference and a Filter Reference. Adam Brown created a hook database that has all hooks in the source code, and adds the documentation from the wiki pages, version information and links to the source code. You can improve it by writing documentation in the Codex.

Of course, some hooks are dynamic, depending on other data. Take the wp_transition_post_status function:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

If you register a custom post type event and a custom post status cancelled, you will have a cancelled_event action hook.

share|improve this answer
    
Adam Browns database is not just a combination of those 2 pages, it has every single action and filter in WordPress listed. Or is that not what you meant. –  Arlen Beiler Aug 13 '10 at 18:25
    
@Arlen: Yes indeed, I rewrote it so that is more clear. –  Jan Fabry Aug 13 '10 at 18:56
add comment

Debug Bar Action Hooks plugin

Displays a list of actions fired for the current request. Requires the debug bar plugin.

share|improve this answer
1  
There’s also Debug Bar Actions and Filters Addon and Debug Bar Hook Log. –  Synetech Jul 28 '13 at 17:24
add comment

Although primitive, perhaps this plugin code can help? Switch "add_action" with "add_filter" if you want to look at filters instead. Load the plugin and then refresh the homepage of the site. Once loaded, it's a serious pain to deactivate, so just rename the plugin file under the plugins folder and refresh the site again -- it will deactivate automatically. I've used this trick many a time to troubleshoot things or find a place where I can insert something.

<?php
/*
Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/
*/

add_action('all','hook_catchall');
function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
    echo "<h1>1</h1>\n";
    print_r($s1);
    echo "<br />\n";
    echo "<h1>2</h1>\n";
    print_r($s2);
    echo "<br />\n";
    echo "<h1>3</h1>\n";    
    print_r($s3);
    echo "<br />\n";
    echo "<h1>4</h1>\n";    
    print_r($s4);
    echo "<br />\n";
    return $s1;
}
share|improve this answer
    
It may not be pretty, but it might actually be the quickest and easiest way in some scenarios (I often use “printf debugging” to fix little things in small, Notepad+command-line projects instead of using a whole IDE). –  Synetech Jul 28 '13 at 17:02
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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