Create a gist now

Instantly share code, notes, and snippets.

Instruments Hooks for a Page of WordPress. Outputs during the Shutdown Hook after add get-params: ?instrument=hooks
Plugin Name: Instrument Hooks for WordPress
Plugin URI:
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook after add get-params <code>?instrument=hooks</code>.
Version: 0.0.1
Author: Frank B&uuml;ltge
Author URI:
if ( isset( $_GET['instrument'] ) && $_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 {
"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',
str_replace( '_ref_array', '[]', $callstack[3]['function'] )
$file_name = addslashes( str_replace( $doc_root, '', $callstack[3]['file'] ) );
$line_num = $callstack[3]['line'];
if ( isset($callstack[4]['function']) )
$called_by = $callstack[4]['function'];
$called_by = '';
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)
$in_hook = FALSE;
add_action('shutdown', 'instrument_hooks');
add_action('all', 'record_hook_usage');

@bueltge what does this hook do exactly

tzkmx commented Feb 10, 2017

@hoshomoh putting this functions into your active theme's functions.php file, it will allow you to register all called hooks and display the calls at the end of a request if you put ?instrument=hooks at the end of the URL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment