Ошибки WordPress - самая частая причина простоев сайтов на CMS: от белого экрана после установки плагина до критических PHP-фаталов и медленных SQL-запросов, из-за которых сайт не грузится. В этом руководстве разберём полный цикл диагностики: как включить режим отладки WP_DEBUG, где читать логи, как использовать Query Monitor и как исправить самые распространённые ошибки. Инструкция подходит для WordPress 6.x и новее.
Классификация ошибок WordPress
Все ошибки WordPress делятся на четыре большие группы. От правильной классификации зависит, какой инструмент диагностики использовать.
| Тип ошибки |
Как проявляется |
Где искать причину |
| PHP Fatal Error |
Белый экран, сообщение «Критическая ошибка» |
debug.log, error_log хостинга |
| Warning / Notice |
Видны на странице, но сайт работает |
debug.log, Query Monitor |
| Медленные SQL-запросы |
Сайт долго грузится, TTFB > 1 сек |
Query Monitor, Slow Query Log |
| HTTP 500 |
Ошибка сервера на всём сайте |
.htaccess, error_log сервера |
| WSOD (белый экран) |
Пустая страница без сообщения |
debug.log, memory_limit |
| Database Error |
«Error establishing a database connection» |
wp-config.php, MySQL |
Важно: в продакшене нельзя оставлять отображение ошибок включённым. Они попадают в индекс и раскрывают структуру сервера. Диагностика проводится только через логирование в файл.
Как включить отладку в WordPress: WP_DEBUG
Главный инструмент диагностики - встроенный режим отладки WordPress. Он контролируется тремя константами в wp-config.php.
1Откройте wp-config.php
Файл находится в корневой директории сайта. Подключитесь по FTP, SFTP или через файловый менеджер хостинга.
2Добавьте константы отладки
Найдите строку /* That's all, stop editing! */ и вставьте перед ней следующий блок:
// Включаем режим отладки
define( ‘WP_DEBUG’, true );// Записываем ошибки в файл debug.log
define( ‘WP_DEBUG_LOG’, true );
// Скрываем ошибки на сайте (для продакшена)
define( ‘WP_DEBUG_DISPLAY’, false );
@ini_set( ‘display_errors’, 0 );
// Логируем устаревшие функции и стили
define( ‘WP_DEBUG_LOG’, true );
define( ‘SCRIPT_DEBUG’, true );
define( ‘SAVEQUERIES’, true );
3Расшифровка каждой константы
| Константа |
Назначение |
Когда использовать |
WP_DEBUG |
Главный переключатель отладки |
Всегда включается первой |
WP_DEBUG_LOG |
Пишет ошибки в wp-content/debug.log |
Обязательно для продакшена |
WP_DEBUG_DISPLAY |
Показывает ошибки на экране |
Только для локальной разработки |
SCRIPT_DEBUG |
Загружает несжатые версии скриптов WP |
При отладке JS/CSS ядра |
SAVEQUERIES |
Сохраняет все SQL-запросы в массиве |
Для анализа медленных запросов |
Ошибка: никогда не включайте WP_DEBUG_DISPLAY на боевом сайте. Посетители увидят стек-трейс с путями к файлам, и это станет уязвимостью для злоумышленников.
Где искать логи ошибок WordPress
После включения отладки ошибки пишутся в несколько мест. Каждое полезно для своего типа задач.
Совет: если вы работаете с клиентским сайтом и не можете открыть файл через FTP, используйте плагин Error Log Monitor или WP Log Viewer - они показывают debug.log прямо в админке WordPress.
Что делать, если debug.log не создаётся
- Проверьте права доступа на папку
wp-content - должно быть 755.
- Создайте пустой файл
debug.log вручную через FTP и задайте права 644.
- Убедитесь, что на хостинге достаточно дискового пространства.
- Проверьте в панели хостинга, не отключена ли запись логов администратором сервера.
Query Monitor: главный плагин диагностики
Query Monitor - бесплатный плагин, который показывает все запросы к базе данных, хуки, PHP-ошибки, HTTP-запросы и кэш в админ-баре WordPress. Это must-have для любого разработчика.
Установка и активация
- Перейдите в Плагины → Добавить новый.
- Введите
Query Monitor, автор John Blackbourn.
- Установите и активируйте.
- В верхней панели админ-бара появится новая ссылка.
Рекомендация по безопасности: Query Monitor раскрывает чувствительные данные. Настройте отображение только для администраторов: Настройки → Query Monitor → Capabilities - оставьте галочку только у manage_options.
Что можно увидеть в Query Monitor
| Раздел |
Что показывает |
Зачем смотреть |
| Queries |
Все SQL-запросы страницы |
Найти медленные запросы и N+1 проблемы |
| PHP Errors |
Fatal, Warning, Notice, Deprecated |
Локализовать проблемный плагин или тему |
| HTTP API Calls |
Внешние запросы к API |
Найти тормозящие интеграции |
| Scripts & Styles |
Подключённые JS и CSS |
Оптимизировать загрузку фронта |
| Template |
Какой шаблон отрендерил страницу |
Понять, какой файл нужно править |
| Blocks |
Использованные Gutenberg-блоки |
Диагностика блочных тем |
| Conditionals |
Текущие условные теги WP |
Отладка логики шаблонов |
| Object Cache |
Статистика Redis / Memcached |
Проверка эффективности кэша |
Как найти медленный запрос в Query Monitor
- Откройте проблемную страницу сайта в режиме администратора.
- Кликните на пункт Query Monitor в админ-баре.
- Перейдите во вкладку Queries.
- Отсортируйте по столбцу Time (время выполнения).
- Запросы, которые занимают больше 100 мс, выделены красным.
- Кликните на медленный запрос - увидите трассировку: какой файл и функция его вызвали.
Результат: вместо того чтобы гадать, почему сайт тормозит, вы точно видите, что запрос wp_postmeta к таблице с 2 миллионами записей выполняется 1.8 секунды, и вызывается из single.php:47.
10 самых частых PHP ошибок WordPress и их исправление
1Allowed memory size exhausted
Сообщение: Allowed memory size of 134217728 bytes exhausted
Причина: PHP-скрипт превысил лимит памяти.
Исправление: увеличьте лимит в wp-config.php:
define( ‘WP_MEMORY_LIMIT’, ‘256M’ );
define( ‘WP_MAX_MEMORY_LIMIT’, ‘512M’ );
Если не помогло - увеличьте memory_limit в php.ini до 512M или попросите хостинг-провайдера.
2Maximum execution time exceeded
Сообщение: Maximum execution time of 30 seconds exceeded
Причина: скрипт выполняется дольше отведённого времени.
Исправление: в wp-config.php:
@ini_set( ‘max_execution_time’, 300 );
Если ошибка возникает при импорте или обновлении плагинов - это нормально, после завершения верните значение в 30 секунд.
3Call to undefined function
Сообщение: Fatal error: Call to undefined function some_function()
Причина: плагин или тема обращаются к функции, которая не загружена.
Исправление:
- Определите в
debug.log, какой плагин вызывает ошибку.
- Отключите этот плагин через FTP, переименовав его папку в
/wp-content/plugins/.
- Обновите плагин до последней версии или найдите альтернативу.
4Cannot redeclare function
Сообщение: Fatal error: Cannot redeclare some_function()
Причина: функция объявлена дважды - часто при копировании functions.php в дочернюю тему.
Исправление: оборачивайте функции в проверку:
if ( ! function_exists( ‘my_custom_function’ ) ) {
function my_custom_function() {
// ваш код
}
}
5Критическая ошибка WordPress (Critical Error)
Сообщение: «На сайте возникла критическая ошибка. Проверьте email для инструкций»
Причина: PHP Fatal Error в теме или плагине. С WordPress 5.2+ включён режим восстановления.
Исправление:
- Проверьте почту администратора - WordPress пришлёт письмо со ссылкой на режим восстановления.
- Воспользуйтесь ссылкой, войдите в админку.
- Отключите проблемный плагин или тему.
- Исправьте код в
debug.log.
Совет: если письмо не пришло (например, отключён wp_mail), откройте сайт в режиме инкогнито. На экране будет сообщение «Произошла критическая ошибка», и в debug.log вы увидите точную причину.
6Белый экран смерти (WSOD)
Проявление: пустая белая страница без текста.
Причины: переполнение памяти, конфликт плагинов, сломанный functions.php.
Пошаговое исправление:
- Включите
WP_DEBUG и WP_DEBUG_LOG в wp-config.php.
- Если сайт не открывается вообще - загрузите
wp-config.php по FTP.
- Переименуйте папку
plugins в plugins_old - отключит все плагины.
- Откройте сайт. Если заработал - включайте плагины по одному.
- Если не помогло - переименуйте папку активной темы в
/wp-content/themes/. WordPress переключится на стандартную тему.
7Error establishing a database connection
Сообщение: белая страница с этим текстом.
Причина: неверные данные в wp-config.php или упавший MySQL.
Исправление:
- Проверьте константы:
DB_NAME, DB_USER, DB_PASSWORD, DB_HOST.
- Убедитесь, что MySQL запущен:
sudo systemctl status mysql.
- Проверьте, что пользователь БД имеет права на эту базу.
- Попробуйте подключиться через phpMyAdmin с теми же данными.
8Parse error: syntax error
Сообщение: Parse error: syntax error, unexpected ...
Причина: опечатка в PHP-коде - забытая скобка, точка с запятой, кавычки.
Исправление:
- Посмотрите в
debug.log строку и столбец, где ошибка.
- Откройте файл через FTP и исправьте синтаксис.
- Перед сохранением прогоните код через онлайн-валидатор PHP.
9Deprecated: Function … is deprecated
Сообщение: Deprecated: Function create_function() is deprecated
Причина: плагин или тема используют устаревшие PHP-функции.
Исправление: это предупреждение, не ошибка. Обновите плагин до свежей версии. Если обновления нет - сообщите разработчику или найдите альтернативу.
10WP_Error: объект не существует
Сообщение: Object of class WP_Error could not be converted to string
Причина: код пытается вывести объект WP_Error как строку.
Исправление: перед использованием всегда проверяйте:
$response = wp_remote_get( $url );
if ( is_wp_error( $response ) ) {
// Обработка ошибки
return $response->get_error_message();
}
// Использование ответа
echo $response[‘body’];
Медленные SQL-запросы: диагностика и оптимизация
Медленные запросы - главная причина тормозов WordPress. На больших сайтах (от 100 000 записей) это проявляется особенно сильно.
Признаки медленных SQL-запросов
- Время до первого байта (TTFB) превышает 1 секунду.
- В Query Monitor отдельные запросы занимают > 100 мс.
- Высокая нагрузка на CPU сервера при низкой посещаемости.
- Админка WordPress тормозит сильнее фронта.
Топ-5 причин медленных запросов в WordPress
| Причина |
Как проявляется |
Решение |
| Запросы без индексов |
SELECT * FROM wp_postmeta WHERE meta_value = ... |
Добавить составной индекс на (meta_key, meta_value) |
| Проблема N+1 |
Плагин делает запрос для каждой записи отдельно |
Переписать на WP_Query с meta_query |
SELECT * вместо нужных полей |
Тяжелые запросы с большим результатом |
Запрашивать только нужные столбцы |
LIMIT с большим offset |
Пагинация на последней странице зависает |
Использовать keyset-пагинацию |
| JOIN больших таблиц |
wp_posts JOIN wp_postmeta на миллионах записей |
Денормализация или кэширование |
Как включить Slow Query Log в MySQL
# В my.cnf или my.ini
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
После перезапуска MySQL в лог попадут все запросы, выполняющиеся дольше 1 секунды, а также запросы без использования индексов.
Оптимизация запросов к wp_postmeta
Самая проблемная таблица в WordPress - wp_postmeta. Она содержит EAV-структуру и растёт очень быстро.
— Добавить индекс для ускорения запросов по мета-полям
ALTER TABLE wp_postmeta ADD INDEX meta_value_idx (meta_value(191));
ALTER TABLE wp_postmeta ADD INDEX meta_key_value_idx (meta_key, meta_value(191));
— Индекс для ускорения JOIN с wp_posts
ALTER TABLE wp_postmeta ADD INDEX post_id_meta_key_idx (post_id, meta_key);
Важно: перед добавлением индексов сделайте полный бэкап базы данных. Операция ALTER TABLE на большой таблице может занять несколько часов и заблокирует таблицу.
Как переписать медленный WP_Query
Пример плохого кода:
// ПЛОХО: N+1 запросов
$products = get_posts([ ‘post_type’ => ‘product’, ‘numberposts’ => 100 ]);
foreach ( $products as $product ) {
$price = get_post_meta( $product->ID, ‘_price’, true ); // отдельный запрос для каждого
}
Пример оптимизированного кода:
// ХОРОШО: один запрос с JOIN
global $wpdb;
$results = $wpdb->get_results(
«SELECT p.ID, p.post_title, pm.meta_value AS price
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type = ‘product’
AND p.post_status = ‘publish’
AND pm.meta_key = ‘price’
LIMIT 100»
);
Кэширование запросов
Для часто используемых, но тяжёлых запросов используйте трансиенты:
function get_expensive_data() {
$cache_key = ‘expensive_data’ . get_current_user_id();
$data = get_transient( $cache_key );
12345678
}
Полезные плагины для диагностики ошибок WordPress
Query Monitor
Главный инструмент отладки: SQL, PHP, хуки, кэш
WP Crontrol
Управление cron-задачами, запуск вручную, диагностика
Error Log Monitor
Просмотр debug.log в админке без FTP
Debug Bar
Расширение Query Monitor для продвинутой диагностики
| Плагин |
Назначение |
Когда использовать |
| Health Check |
Проверка сайта в режиме изоляции |
Когда конфликт плагинов, но не знаете какой |
| User Switching |
Быстрое переключение между пользователями |
Отладка проблем с ролями и правами |
| WP Mail SMTP |
Логирование писем |
Когда не приходят письма с сайта |
| Reroute Email |
Перенаправление писем на тестовый ящик |
На dev-окружении |
Чек-лист: алгоритм диагностики любой ошибки
Последовательность действий
- Включите
WP_DEBUG, WP_DEBUG_LOG, WP_DEBUG_DISPLAY=false в wp-config.php
- Воспроизведите ошибку на сайте
- Откройте файл
/wp-content/debug.log и найдите последние записи
- Определите тип ошибки: PHP Fatal, Warning, SQL
- Установите Query Monitor и проверьте ту же страницу
- Для SQL-проблем включите Slow Query Log в MySQL
- Определите виновника: плагин, тема, ядро WP или хостинг
- Отключите проблемный элемент через FTP (переименование папки)
- Обновите плагин/тему до последней версии
- Если обновления нет - найдите альтернативу или напишите разработчику
- После исправления выключите
WP_DEBUG на продакшене
- Проверьте сайт через 24 часа - ошибка не должна вернуться
Совет: заведите отдельный wp-config-local.php с включённой отладкой и подключайте его только на dev-сервере. Это избавит от случайного включения WP_DEBUG на боевом сайте.
FAQ: частые вопросы об ошибках WordPress
Ответы на популярные вопросы
Безопасно ли держать WP_DEBUG включённым постоянно?
На продакшене - нет. При неправильной настройке (WP_DEBUG_DISPLAY=true) ошибки будут видны посетителям и попадут в поисковую выдачу. Допускается держать только WP_DEBUG=true и WP_DEBUG_LOG=true, чтобы ошибки записывались в файл, но не отображались. Периодически проверяйте debug.log и удаляйте его после анализа - файл может вырасти до гигабайтов.
Что делать, если критическая ошибка появилась после обновления плагина?
WordPress 5.2+ пришлёт письмо администратору со ссылкой на режим восстановления. Перейдите по ней и отключите проблемный плагин. Если письма нет, подключитесь по FTP и переименуйте папку плагина в /wp-content/plugins/. После этого сайт заработает. Сообщите разработчику плагина об ошибке и приложите строки из debug.log.
Почему Query Monitor показывает много запросов, но сайт не тормозит?
WordPress на стандартной странице делает 50–150 SQL-запросов - это нормально. Обращайте внимание не на количество, а на время выполнения. Запросы до 10 мс выполняются мгновенно. Проблемой считаются запросы дольше 100 мс или отдельные запросы, занимающие более 50% общего времени загрузки страницы.
Можно ли смотреть debug.log без FTP?
Да, используйте плагины Error Log Monitor, WP Log Viewer или Log HTTP Requests. Они добавляют в админку страницу с содержимым лога. Но для безопасности ограничьте доступ к этим плагинам только администраторам и удаляйте их после решения проблемы.
Как найти плагин, вызывающий ошибку, если их установлено 30+?
Используйте бинарный поиск: отключите половину плагинов и проверьте сайт. Если ошибка исчезла - виноват один из отключённых. Если нет - проблема в оставшихся. За 5–6 шагов вы найдёте виновника быстрее, чем перебором. Плагин Health Check делает это автоматически в режиме изоляции, не затрагивая обычных посетителей.
Стоит ли использовать плагин для оптимизации SQL или делать руками?
Для 90% сайтов достаточно плагина кэширования (WP Rocket, LiteSpeed Cache, W3 Total Cache) и индексации основных таблиц. Ручная оптимизация запросов нужна на высоконагруженных проектах: интернет-магазинах с 100 000+ товаров, новостных порталах, SaaS-проектах. В этих случаях привлекайте backend-разработчика для написания кастомных запросов и настройки кэша.
Как понять, что проблема не в WordPress, а в хостинге?
Если debug.log пустой, Query Monitor не показывает медленных запросов, но сайт тормозит или падает - проблема на уровне сервера. Проверьте: загрузку CPU через htop, свободную память через free -h, дисковое пространство через df -h. На shared-хостинге соседние сайты могут потреблять все ресурсы - в этом случае поможет переход на VPS.
Итог
Диагностика ошибок WordPress строится на трёх китах: WP_DEBUG с записью в файл, Query Monitor для анализа запросов в админке и системных логах сервера для критических сбоев. 90% ошибок вызываются плагинами и темами, 9% - нехваткой ресурсов хостинга, 1% - багами ядра. Начните с включения отладки, найдите виновника через debug.log, откатите или обновите проблемный элемент - и сайт вернётся в строй за 15 минут.