WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

Edit: Plugin is listed here.

share|improve this question
This is my go-to site when I'm looking for hook info... WordPress Hooks Database – Keith S. Aug 13 '10 at 15:25
WordPress has finally documented all its hooks. :D You can browse and search there. – sam Nov 21 '14 at 0:05
up vote 38 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.:


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

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') {

    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">
        <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>
        foreach($hooks as $hook) {
            $html[] = "<tr>
        $html[] = '</table></div>';
        echo implode("\n",$html);

    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_','',
            $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
                VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
            $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
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
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
@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

Debug Bar Action Hooks plugin

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

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

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

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.

Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/

function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
    echo "<h1>1</h1>\n";
    echo "<br />\n";
    echo "<h1>2</h1>\n";
    echo "<br />\n";
    echo "<h1>3</h1>\n";    
    echo "<br />\n";
    echo "<h1>4</h1>\n";    
    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

I use thiss to find the order of hooks. To get the the filters just change add_action to add_filter.

function echo_all_hooks() {
$not_arr = array('gettext','sanitize_key','gettext_with_context','attribute_escape');
if(!in_array(current_filter(),$not_arr)) echo current_filter()."<br/>";
share|improve this answer

As @kaiser suggest do not post only links i am improving it. but it is not possible to use entire code here so i am using few image here to explain that how it have a complete list for WordPress hooks with describe each. you can find it here for hooks, classes, functions, plugins, enter image description here

to describe each enter image description here

share|improve this answer

Your Answer


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.