Skip to content

Instantly share code, notes, and snippets.

@jrfnl
Last active October 23, 2024 23:23
Show Gist options
  • Save jrfnl/5925642 to your computer and use it in GitHub Desktop.
Save jrfnl/5925642 to your computer and use it in GitHub Desktop.
Code to add to wp-config.php to enhance information available for debugging.
<?php
/**
* == About this Gist ==
*
* Code to add to wp-config.php to enhance information available for debugging.
*
* You would typically add this code below the database, language and salt settings
*
* Oh.. and *do* make sure you change the path to the log file to a proper file path on your server (make sure it exists).
*
* Set WP_DEBUG_DISPLAY to false if you don't want errors displayed on the screen.
* Independently of the WP_DEBUG settings, PHP errors, warnings and notices should now appear in your error.log file.
*
* == DO == test whether it's all working by using the code at the end of the gist.
*
* If error logging is not working, try:
* - Check if the file was created at all, if not, upload an empty (text) file named error.log and try again.
* - Fiddle around with the CHMOD settings for the error.log file to see what permissions are needed for your server setup.
* - If you put the error.log outside of the web root: this will not work in all server setups. You may need to move the directory & file to be within the web root.
*
* Source: https://gist.github.com/jrfnl/5925642
*/
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/
/**
* Turn on WP error reporting.
*/
define( 'WP_DEBUG', true );
/**
* [Optional] Load the development (non-minified) versions of all standard WP scripts and CSS, and disables compression and concatenation.
*
* This setting is often also respected by themes and plugins, but no guarantee!
*/
// define( 'SCRIPT_DEBUG', true );
/**
* [Optional] Save queries for analysis
* The SAVEQUERIES definition saves the database queries to an array and that array
* can be displayed to help analyze those queries. The information saves each query,
* what function called it, and how long that query took to execute.
*
* NOTE: This will have a performance impact on your site, so make sure to turn this
* off when you aren't debugging.
*
* To get access to the information, you can add the following snippet to the footer of your theme:
*
* <?php
* if ( current_user_can( 'administrator' ) ) {
* global $wpdb;
* echo "<pre>";
* print_r($wpdb->queries);
* echo "</pre>";
* }
* ?>
*/
// define('SAVEQUERIES', true);
/**
* Turn on error logging and show errors on-screen if in debugging mode.
*/
@error_reporting( -1 ); // everything, including E_STRICT and other newly introduced error levels.
@ini_set( 'log_errors', true );
@ini_set( 'log_errors_max_len', '0' );
/**
* Change the path to one on your webserver, the directory does not have to be in the web root
* Don't forget to CHMOD this dir+file and add an .htaccess file denying access to all
* For an example .htaccess file, see https://gist.github.com/jrfnl/5953256
*/
@ini_set( 'error_log', '/path/to/writable/file/logs/error.log' );
if ( WP_DEBUG !== true ) {
@ini_set( 'display_errors', false ); // Don't show errors on screen
}
else {
@ini_set( 'display_errors', true ); // Show errors on screen
@ini_set( 'html_errors', true );
@ini_set( 'docref_root', 'http://php.net/manual/' );
@ini_set( 'docref_ext', '.php' );
if ( ! extension_loaded( 'xdebug' ) ) {
@ini_set( 'error_prepend_string', '<span style="color: #ff0000; background-color: transparent;">' );
@ini_set( 'error_append_string', '</span>' );
}
}
/**
* Adds a backtrace to PHP errors.
*
* Copied from: https://gist.github.com/625769
* Forked from: http://stackoverflow.com/questions/1159216/how-can-i-get-php-to-produce-a-backtrace-upon-errors/1159235#1159235
* Adjusted by jrfnl.
*/
if ( ! function_exists( 'jrf_process_error_backtrace' ) ) {
function jrf_process_error_backtrace( $errno, $errstr, $errfile, $errline ) {
/*
* Only show errors which are within the scope of the current error_reporting() setting.
* As WP (and plugins/themes) sometimes change the error level, you may want to comment
* this out if you want to be sure to see all errors.
*/
if( ! ( error_reporting() & $errno ) ) {
return;
}
/**
* Make sure all error levels are present. PHP 5.2 compatibility.
*/
if ( ! defined( 'E_DEPRECATED' ) ) {
define( 'E_DEPRECATED', 8192 );
}
if ( ! defined( 'E_USER_DEPRECATED' ) ) {
define( 'E_USER_DEPRECATED', 16384 );
}
switch ( $errno ) {
case E_WARNING :
case E_USER_WARNING :
case E_STRICT :
case E_NOTICE :
case E_USER_NOTICE :
case E_DEPRECATED :
case E_USER_DEPRECATED :
$type = 'warning';
$fatal = false;
break;
default :
$type = 'fatal error';
$fatal = true;
break;
}
$trace = debug_backtrace();
array_shift( $trace );
if ( php_sapi_name() == 'cli' && ini_get( 'display_errors' ) ) {
echo 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
foreach ( $trace as $item ) {
echo ' ' . ( isset( $item['file'] ) ? $item['file'] : '<unknown file>' ) . ' ' . ( isset( $item['line'] ) ? $item['line'] : '<unknown line>' ) . ' calling ' . $item['function'] . '()' . "\n";
}
}
elseif ( ini_get( 'display_errors' ) ) {
echo '<p class="error_backtrace">' . "\n";
echo ' Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
echo '</p>' . "\n";
echo '<ol class="error_backtrace_list">' . "\n";
foreach ( $trace as $item ) {
echo ' <li>' . ( isset( $item['file'] ) ? $item['file'] : '<unknown file>' ) . ' ' . ( isset( $item['line'] ) ? $item['line'] : '<unknown line>' ) . ' calling ' . $item['function'] . '()</li>' . "\n";
}
echo '</ol>' . "\n";
}
if ( ini_get( 'log_errors' ) ) {
$items = array();
foreach ( $trace as $item ) {
$items[] = ( isset( $item['file'] ) ? $item['file'] : '<unknown file>' ) . ' ' . ( isset( $item['line'] ) ? $item['line'] : '<unknown line>' ) . ' calling ' . $item['function'] . '()';
}
$message = 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ': ' . trim( join( ' | ', $items ) );
error_log( $message );
}
flush();
if ( $fatal ) {
exit( 1 );
}
return false; // Make sure it plays nice with other error handlers (remove if no other error handlers are set).
}
set_error_handler( 'jrf_process_error_backtrace' );
}
/**
* Now test whether it all works by uncommenting the below line
*
* If all is well:
* - With WP_DEBUG set to true: You should see a red error notice on your screen
* - Independently of the WP_DEBUG setting, the below 'error'-message should have been written to your log file. *Do* check whether it has been....
*/
//trigger_error( 'Testing 1..2..3.. Debugging code is working!', E_USER_NOTICE );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment