Skip to content

Instantly share code, notes, and snippets.

@bueltge
Created May 31, 2011 08:07
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save bueltge/1000143 to your computer and use it in GitHub Desktop.
Save bueltge/1000143 to your computer and use it in GitHub Desktop.
Instruments Hooks for a Page of WordPress. Outputs during the Shutdown Hook after add get-params: ?instrument=hooks
<?php
/*
Plugin Name: Instrument Hooks for WordPress
Plugin URI: http://bueltge.de/
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: http://bueltge.de/
*/
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">
<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);
}
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 = addslashes( str_replace( $doc_root, '', $callstack[3]['file'] ) );
$line_num = $callstack[3]['line'];
if ( isset($callstack[4]['function']) )
$called_by = $callstack[4]['function'];
else
$called_by = '';
$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;
}
}
add_action('shutdown', 'instrument_hooks');
add_action('all', 'record_hook_usage');
}
@tzkmx
Copy link

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