Created
January 15, 2016 20:02
-
-
Save techslides/5b7ad88d0db970ac3393 to your computer and use it in GitHub Desktop.
Debug WP Queries. Include this file in functions.php and then add ?debug=sql to any WP URL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if ( !defined('SAVEQUERIES') && isset($_GET['debug']) && $_GET['debug'] == 'sql' ) | |
define('SAVEQUERIES', true); | |
if ( !function_exists('dump') ) : | |
/** | |
* dump() | |
* | |
* @param mixed $in | |
* @return mixed $in | |
**/ | |
function dump($in = null) { | |
echo '<pre style="margin-left: 0px; margin-right: 0px; padding: 10px; border: solid 1px black; background-color: ghostwhite; color: black; text-align: left;">'; | |
foreach ( func_get_args() as $var ) { | |
echo "\n"; | |
if ( is_string($var) ) { | |
echo "$var\n"; | |
} else { | |
var_dump($var); | |
} | |
} | |
echo '</pre>' . "\n"; | |
return $in; | |
} # dump() | |
endif; | |
/** | |
* add_stop() | |
* | |
* @param mixed $in | |
* @param string $where | |
* @return mixed $in | |
**/ | |
function add_stop($in = null, $where = null) { | |
global $sem_stops; | |
global $wp_object_cache; | |
$queries = get_num_queries(); | |
$milliseconds = timer_stop() * 1000; | |
$out = "$queries queries - {$milliseconds}ms"; | |
if ( function_exists('memory_get_usage') ) { | |
$memory = number_format(memory_get_usage() / ( 1024 * 1024 ), 1); | |
$out .= " - {$memory}MB"; | |
} | |
$out .= " - $wp_object_cache->cache_hits cache hits / " . ( $wp_object_cache->cache_hits + $wp_object_cache->cache_misses ); | |
if ( $where ) { | |
$sem_stops[$where] = $out; | |
} else { | |
dump($out); | |
} | |
return $in; | |
} # add_stop() | |
/** | |
* dump_stops() | |
* | |
* @param mixed $in | |
* @return mixed $in | |
**/ | |
function dump_stops($in = null) { | |
if ( $_POST ) | |
return $in; | |
global $sem_stops; | |
global $wp_object_cache; | |
$stops = ''; | |
foreach ( $sem_stops as $where => $stop ) | |
$stops .= "$where: $stop\n"; | |
dump("\n" . trim($stops) . "\n"); | |
if ( defined('SAVEQUERIES') && $_GET['debug'] == 'sql' ) { | |
global $wpdb; | |
foreach ( $wpdb->queries as $key => $data ) { | |
$query = rtrim($data[0]); | |
$duration = number_format($data[1] * 1000, 1) . 'ms'; | |
$loc = trim($data[2]); | |
$loc = preg_replace("/(require|include)(_once)?,\s*/ix", '', $loc); | |
$loc = "\n" . preg_replace("/,\s*/", ",\n", $loc) . "\n"; | |
dump($query, $duration, $loc); | |
} | |
} | |
if ( $_GET['debug'] == 'cache' ) | |
dump($wp_object_cache->cache); | |
if ( $_GET['debug'] == 'cron' ) { | |
$crons = get_option('cron'); | |
foreach ( $crons as $time => $_crons ) { | |
if ( !is_array($_crons) ) | |
continue; | |
foreach ( $_crons as $event => $_cron ) { | |
foreach ( $_cron as $details ) { | |
$date = date('Y-m-d H:m:i', $time); | |
$schedule = isset($details['schedule']) ? "({$details['schedule']})" : ''; | |
if ( $details['args'] ) | |
dump("$date: $event $schedule", $details['args']); | |
else | |
dump("$date: $event $schedule"); | |
} | |
} | |
} | |
} | |
return $in; | |
} # dump_stops() | |
add_action('init', create_function('$in', ' | |
return add_stop($in, "Load"); | |
'), 10000000); | |
add_action('template_redirect', create_function('$in', ' | |
return add_stop($in, "Query"); | |
'), -10000000); | |
add_action('wp_footer', create_function('$in', ' | |
return add_stop($in, "Display"); | |
'), 10000000); | |
add_action('admin_footer', create_function('$in', ' | |
return add_stop($in, "Display"); | |
'), 10000000); | |
/** | |
* init_dump() | |
* | |
* @return void | |
**/ | |
function init_dump() { | |
global $hook_suffix; | |
if ( !is_admin() || empty($hook_suffix) ) { | |
add_action('wp_footer', 'dump_stops', 10000000); | |
add_action('admin_footer', 'dump_stops', 10000000); | |
} else { | |
add_action('wp_footer', 'dump_stops', 10000000); | |
add_action("admin_footer-$hook_suffix", 'dump_stops', 10000000); | |
} | |
} # init_dump() | |
add_action('wp_print_scripts', 'init_dump'); | |
/** | |
* dump_phpinfo() | |
* | |
* @return void | |
**/ | |
function dump_phpinfo() { | |
if ( isset($_GET['debug']) && $_GET['debug'] == 'phpinfo' ) { | |
phpinfo(); | |
die; | |
} | |
} # dump_phpinfo() | |
add_action('init', 'dump_phpinfo'); | |
/** | |
* dump_http() | |
* | |
* @param array $args | |
* @param string $url | |
* @return array $args | |
**/ | |
function dump_http($args, $url) { | |
dump(preg_replace("|/[0-9a-f]{32}/?$|", '', $url)); | |
return $args; | |
} # dump_http() | |
/** | |
* dump_trace() | |
* | |
* @return void | |
**/ | |
function dump_trace() { | |
$backtrace = debug_backtrace(); | |
foreach ( $backtrace as $trace ) | |
dump( | |
'File/Line: ' . $trace['file'] . ', ' . $trace['line'], | |
'Function / Class: ' . $trace['function'] . ', ' . $trace['class'] | |
); | |
} # dump_trace() | |
if ( $_GET['debug'] == 'http' ) | |
add_filter('http_request_args', 'dump_http', 0, 2); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment