WordPress как на ладони
Плагин рекламы для WordPress wordpress jino

Дебаг в WordPress (отладка кода, WP_DEBUG)

В разработке нужно иметь возможность смотреть где ошибка, когда что-то вдруг сломалось. В WordPress для этого есть специальный режим «дебаг» (режим отладки). В этой заметке разберем его на части и посмотрим что это за константа такая WP_DEBUG.

Зачем нужен «дебаг режим»? Допустим, вы изменили код файла functions.php темы и сайт перестал работать. Вместо него белый экран - ничего не понятно. «дебаг» поможет разобраться, он покажет ошибку и скажет в какой она строке какого файла.

«Дебаг» выводит не только ошибки, из-за которых сайт перестает работать, но и заметки. Заметки могут создаваться самим PHP (например, когда неправильно используется переменная) или кодом PHP скрипта (например, WP создает такие заметки, если сайт использует устаревшую функцию WordPress, или устаревший параметр функции).

Есть два варианта режима «дебаг»: показ ошибок на экран и запись ошибок в лог файл. За показ ошибок отвечает константа WP_DEBUG_DISPLAY, а за запись в лог WP_DEBUG_LOG. Сам «дебаг» режим включается константой WP_DEBUG. Все три константы могут принимать значения true или false (1 или 0). Подробнее читайте ниже.

По умолчанию дебаг отключен: WP_DEBUG = false, WP_DEBUG_DISPLAY = true и WP_DEBUG_LOG = false. WP_DEBUG_DISPLAY и WP_DEBUG_LOG работают только если включена константа WP_DEBUG.

WP_DEBUG_DISPLAY всегда отключена для AJAX запросов, там удивить ошибки можно только через лог файл... Это устанавливается в wp_debug_mode():

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
	@ini_set( 'display_errors', 0 );
}

Рекомендуется использовать «дебаг режим» в процессе работы над сайтом (темой или плагином).

Рекомендуется отключать «дебаг» на рабочем сайте. В целях защиты приватной информации от третьих лиц. Проще говоря, чтобы хакеры не могли получить информацию из «дебага».

Как включить «дебаг» (показ ошибок в WordPress)

Базовое включение

Откройте файл wp-config.php в корне сайта и измените false на true в строке:

define( 'WP_DEBUG', false ); // true - включить показ ошибок

При таком включении ошибки и заметки будут выводиться на экран, но ничего логироваться не будет.

Включение и настройка дебага

Код ниже, включит запись ошибок, предупреждений и заметок в файл wp-content/debug.log и выключит показ заметок и предупреждений на экране, чтобы они не мешались при просмотре сайта.

define( 'WP_DEBUG', true );     // включение дебаг режима
define( 'WP_DEBUG_LOG', true ); // true - логирование ошибок в файл /wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false ); // false - отключает показ ошибок на экране
define( 'SCRIPT_DEBUG', true ); // используем полные версии JS и CSS файлов движка

Вставлять этот код нужно в файл wp-config.php куда угодно, но до строки:

require_once( ABSPATH . 'wp-settings.php' );
к началу

Динамическое включение показа ошибок

Этот код помогает быстро включать константу WP_DEBUG, которая на рабочем сайте должна быть выключена. Также код позволяет включить принудительный вывод ошибок на экран или запись ошибок в файл debug.log в папку /wp-content.

Зачем это надо? Допустим, мы сделали сайт и он у нас работает, но мы периодически изменяем код и улучшаем некоторые моменты. При этом конечно возникают разные ошибки, в том числе фатальные. Чтобы видеть в чем причина, нам нужно включить дебаг, для этого нужно открыть wp-config.php, изменить константу. А главное по завершению работ надо вернуть все обратно. И такое нужно проделывать каждый раз при работе с сайтом. Это неудобно, гораздо удобнее добавить в URL переменную и увидеть ошибки когда это нужно. Или сохранить настройку в куку и удобно включить/отключать дебаг через URL.

Чтобы все начало работать, замените строку define( WP_DEBUG, false ); в файле wp-config.php на такой код:

/**
 * Динамическое включение показа и логирования ошибок PHP в WordPress.
 *
 * Установка: замените строку 'define( WP_DEBUG, false );' в файле 'wp-config.php' на этот код.
 *
 * Использование: добавьте в URL параметр запроса 'debug' (рекомендуется изменить см. ниже).
 *     http://site.com/?debug   - стандартное включение константы WP_DEBUG
 *     http://site.com/?debug=1 - принудительный вывод ошибок на экран
 *     http://site.com/?debug=2 - логирование ошибок в файл '/wp-content/debug.log'
 *     http://site.com/?debug=3 - подключение несжатых скриптов и сохранение всех SQL запросов в $wpdb->queries
 * Куки: настройку можно сохранить в куку на год. Для этого добавьте в значение 'cookie'. Добавьте 'delcookie', чтобы удалить куку.
 *     http://site.com/?debug=cookie
 *     http://site.com/?debug=1cookie
 *     http://site.com/?debug=2cookie
 *     http://site.com/?debug=3cookie
 *     http://site.com/?debug=delcookie - удаление текущей куки с любым значением
 * Комбинирование:
 *     http://site.com/?debug=12
 *     http://site.com/?debug=123cookie
 *
 * @author Kama (http://wp-kama.ru)
 * ver 1.1
 */
$key = 'debug'; // рекомендуется изменить !!!!!!!!!!!!!!!!!
if( isset($_GET[$key]) || isset($_COOKIE[$key]) ){
	$val = trim( isset($_GET[$key]) ? $_GET[$key] : $_COOKIE[$key] );
	$set = array_flip( preg_split('/([0-9])/u', $val, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY) );

	// ставим куку '-' - чтобы не была пустой
	if( isset($set['cookie']) ){
		$host = str_replace( 'www.', '', $_SERVER['HTTP_HOST'] );
		// for cirilic domains: .сайт, .онлайн, .дети, .ком, .орг, .рус, .укр, .москва, .испытание, .бг
		if( false !== strpos($host, 'xn--') ) preg_match('~xn--[^.]+\.xn--[^.]+$~', $host, $mm );
		else preg_match('~[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6}$~', $host, $mm );
		$host = $mm[0];

		setcookie( $key, preg_replace('/cookie/', '', "$val-"), time()+3600*24*365, '/', ".$host" );
	}
	// удаляем куку
	if( isset($set['delcookie']) )
		setcookie( $key, '' );

	define('WP_DEBUG', true ); // Включает показ ошибок уровня - E_ALL. Нужна для работы WP_DEBUG_DISPLAY или WP_DEBUG_LOG

	if( isset($set[1]) ) define('WP_DEBUG_DISPLAY', true ); // принудительный вывод ошибок на экран
	if( isset($set[2]) ) define('WP_DEBUG_LOG', true );     // запись ошибок в файл '/wp-content/debug.log'
	if( isset($set[3]) ){
		define('SCRIPT_DEBUG', true ); // подключение несжатых скриптов
		define('SAVEQUERIES', true );  // сохранение всех SQL запросов в $wpdb->queries
	}
}
else define('WP_DEBUG', false );

Теперь, чтобы включить режим WP_DEBUG, нужно добавить в любой URL параметр запроса debug: http://site.com/?debug или http://site.com/?debug=1 (принудительный вывод на экран, если такой вывод отключен) или http://site.com/?debug=2 (логирование в файл).

Также можно сохранять установку в куки, чтобы постоянно не писать ?debug и еще такое сохранение пригодится для работы дебага при тестировании AJAX запросов, где установить параметр запроса сложнее...

Для защиты, параметр debug рекомендую изменить, указать что-то редкое и известное только вам.

При включении логирования, не забывайте удалять лог файл, а то его может посмотреть кто угодно. Или его можно изменить см. описание WP_DEBUG_LOG.

к началу

WP_DEBUG

WP_DEBUG - это PHP константа (глобальная постоянная - определяется всего один раз). Значение этой постоянной включает или отключает показ ошибок в PHP, а также она используется в разных местах кода WordPress для показа или подавления ошибок, где это необходимо.

WP_DEBUG нужно определять (устанавливать) в файле wp-config.php из корня сайта.

define( 'WP_DEBUG', false ); // дебаг отключен. По умолчанию.
// или
define( 'WP_DEBUG', true ); // дебаг включен

Для удобности, можно писать числа 1 или 0:

define( 'WP_DEBUG', 0 ); // дебаг отключен. По умолчанию.
// или
define( 'WP_DEBUG', 1 ); // дебаг включен

Заметка: нельзя указывать false в кавычках - 'false'. В этом случае дебаг будет включен, потому что значение равно строке false, а не логическому - нет.

PHP ошибки, предупреждения и заметки (errors, warnings и notices)

В PHP есть разные уровни ошибок. Если не вдаваться в подробности, то уровни значимости такие:

  1. errors - серьезная ошибка, которая приводит к остановке скрипта. PHP прерывает работу.
  2. warnings - не ошибка, а предупреждение о чем-либо. PHP не прерывает работу.
  3. notices - не ошибка, а заметка о чем-либо. PHP не прерывает работу. Заметки могут показать возможные баги в коде. Их исправление, как правило, делает код более стабильным.

«Режим дебаг» включает все уровни ошибок. Это не похоже на обычное поведение PHP, там обычно включены только ошибки уровня errors, а warnings и notices не отображаются. Подробнее читайте в описании error_reporting().

Устаревшие функции, хуки и устаревшие параметры функций

WP_DEBUG также включает внутренние заметки самого WordPress. В WordPress есть специальные функции вроде _deprecated_function(), которые показывают ошибку уровня notices, когда используется устаревшая функция или хук или параметр хука, функции и т.д. Эти заметки предупреждают, что функция WP считается устаревшей и её нужно заменить, потому что она в любой момент может быть удалена. В таких заметках чаще всего предлагается альтернативная функция для замены.

к началу

WP_DEBUG_DISPLAY

Еще один компонент WP_DEBUG, который контролирует показ (вывод) ошибок на экран. Зависит от WP_DEBUG - работает только если WP_DEBUG равен true.

По умолчанию: true.

Если установить в false, то ошибки не будут выводиться на экран. Это нужно, когда ошибки записываются в файл (см. WP_DEBUG_LOG) и их можно смотреть позднее.

define( 'WP_DEBUG_DISPLAY', false ); // false - отключает вывод ошибок на экран

WP_DEBUG_DISPLAY всегда отключена для AJAX запросов (см. выше)...

WP_DEBUG_LOG

Еще один компонент дебага. Включает запись ошибок в файл /wp-content/debug.log. Зависит от WP_DEBUG - работает только если WP_DEBUG равен true.

По умолчанию: false

Запись ошибок в файл может пригодится, когда нужно проверить наличие ошибок в коде, который ничего не выводит на экран. Например, при AJAX запросе или при тестировании CRON или REST.

define( 'WP_DEBUG_LOG', true ); // true - запись ошибок в файл /wp-content/debug.log

Изменение адреса файла лога ошибок

Чтобы изменить название файла, добавьте следующую строку как можно раньше, например в MU плагины:

ini_set( 'error_log', WP_CONTENT_DIR . '/hidden-debug.log' );
к началу

SAVEQUERIES

Связанная с дебагом константана. При включении, все SQL запросы будут сохраняться в переменную $wpdb->queries в виде массива. В этом массиве можно будет посмотреть все SQL запросы и при необходимости найти нужный и убедиться что он правильный и т.п.

Кроме самого запроса, также записываются данные о том сколько времени занял запрос и какой функцией он был вызван.

define( 'SAVEQUERIES', true ); // true - сохраняет SQL запросы и данные о них в  `$wpdb->queries`

Важно! что включение записи запросов, требует дополнительной памяти и PHP операций. Поэтому, в целях производительности, на рабочем сайте эта константа должна быть отключена.

к началу

SCRIPT_DEBUG

Связанная с дебагом константа. Контролирует какие JS и CSS файлы использовать: сжатые или полные. При включении WordPress будет использовать не сжатые версии (dev версии) JS и CSS файлов. По умолчанию используются min версии файлов. Это нужно для тестирования при изменении встроенных js или css файлов.

По умолчанию: false.

define( 'SCRIPT_DEBUG', true ); // true - использование полных версий `.css` и `.js` файлов

Как работает WP_DEBUG?

После установки констант дебага в wp-config.php мы заходим на сайт. И при генерации страницы, в самом начале загрузки WordPress (см. wp-settings.php) срабатывает функция wp_debug_mode(). Она, используя функции PHP, устанавливает как и какие уровни ошибок показывать, нужно ли создавать лог файл и т.д.

Не работает WP_DEBUG?

Иногда может возникнуть такая ситуация, когда вы включаете WP_DEBUG в конфиге, а ошибки все равно не видно. Такое поведение может возникнуть, когда где-то после установок параметров показа ошибок самим WordPress эти установки меняются. Например в MU плагине, обычном плагине или в теме, ошибки выключаются переустановкой ini директив PHP, примерно таким кодом:

error_reporting(0); // отключает сообщения об ошибках
ini_set('display_errors', 0); // отключает показ ошибок на экран

В этом случает установки дебага WP перебиваются и он перестает работать...

Для решения, лучше всего найти где изменяются настройки и удалить такие строки, чтобы дальше работать только с константой WP_DEBUG.

В качестве другого решения можно попробовать еще раз перебить настройки вывода ошибок, указав их снова:

error_reporting(E_ALL); // включаем сообщения об ошибках
ini_set('display_errors', 1); // включаем показ ошибок на экран
к началу

Плагины для дебага и профилирования в WordPress

В каталоге WP есть несколько хороших плагинов, которые расширяют возможности «дебага» и дают дополнительную информацию для выявления слабых мест кода. Популярные из них:

  • Query Monitor - выводит в подвале кучу полезной информации о текущем запросе. Сколько времени затрачено, сколько SQL запросов, какие запросы, сколько времени занял каждый запрос, сколько памяти затрачено, какие хуки использовались и т.д.

  • Debug Bar - комплекс плагинов по дебагингу и профилированию. Это основной плагин, после его установки к нему можно подключать еще другие плагины, которые расширяют возможности профилирования. Но я его как-то не оценил...

  • Log Deprecated Notices - записывает в лог все заметки о наличии устаревших функций WordPress или их параметров и т.д. Не зависит от WP_DEBUG - работает с отключенным WP_DEBUG.

  • WordPress mu-plugin for debugging - альтернативный дебаггер на базе библиотеки Kint.
Дебаг в WordPress (отладка кода, WP_DEBUG) 5 комментариев

Здравствуйте, !

Ваш комментарий