Отладка и мониторинг ошибок — важнейшая часть поддержки и развития любого сайта на WordPress. Особенно когда проект растет и возникают неожиданные баги, нужно уметь быстро собирать и анализировать информацию об ошибках, чтобы оперативно их исправлять. В этой статье подробно разберем, как создать подробный отчет об ошибках WordPress, используя готовые плагины и собственные решения на PHP.
Почему стандартный WP_DEBUG не всегда достаточен
По умолчанию WordPress предлагает включить режим отладки с помощью константы WP_DEBUG в wp-config.php. Это позволяет видеть ошибки и предупреждения прямо на сайте или в логах. Однако такой подход имеет ограничения:
- Ошибки показываются напрямую на сайте, что может негативно влиять на пользователей.
- Логи часто переполняются и трудно быстро найти нужную информацию.
- Отсутствует удобный интерфейс для просмотра и фильтрации ошибок.
Поэтому для серьезного мониторинга часто используют специальные плагины или пишут собственные обработчики ошибок.
Использование плагина Error Log Monitor
Один из простых и популярных плагинов — Error Log Monitor. Он автоматически отслеживает логи ошибок PHP и выводит количество новых ошибок в админ-панели.
Основные преимущества:
- Автоматический мониторинг файлов
error_logи логов PHP. - Уведомления в админке о новых ошибках.
- Возможность просматривать последние записи лога прямо в панели WordPress.
Установка проста — через репозиторий WordPress. После активации плагин начинает следить за логами и выводит количество ошибок в меню «Инструменты».
Настройка уведомлений на email
Для своевременного реагирования полезно настроить уведомления на почту. Например, можно использовать плагин WPRemark для расширенной работы с уведомлениями и отзывами, адаптировав его под свои нужды.
Создание собственного обработчика ошибок с сохранением в базу данных
Если нужно более гибкое решение, можно написать собственный обработчик ошибок, который будет сохранять детальную информацию в отдельную таблицу базы данных. Это позволит формировать удобные отчеты и фильтровать ошибки по дате, типу, плагину и другим параметрам.
Создаем таблицу для хранения ошибок
function wppuzzle_create_error_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppuzzle_error_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
error_type VARCHAR(50) NOT NULL,
error_message TEXT NOT NULL,
error_file VARCHAR(255) DEFAULT '',
error_line INT DEFAULT 0,
error_context TEXT,
error_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( __FILE__, 'wppuzzle_create_error_log_table' );
Этот код создаст таблицу wp_wppuzzle_error_log с полями для типа ошибки, сообщения, файла, строки и времени.
Обработчик ошибок PHP
Далее пишем функцию, которая будет ловить ошибки, фильтровать их и сохранять в таблицу:
function wppuzzle_custom_error_handler($errno, $errstr, $errfile, $errline) {
global $wpdb;
$table_name = $wpdb->prefix . 'wppuzzle_error_log';
// Фильтрация ошибок: можно исключить предупреждения или уведомления
if (!(error_reporting() & $errno)) {
return false; // Не обрабатывать
}
$wpdb->insert(
$table_name,
[
'error_type' => wppuzzle_get_error_type($errno),
'error_message' => $errstr,
'error_file' => $errfile,
'error_line' => $errline,
'error_context' => '',
'error_time' => current_time('mysql', 1),
]
);
// Можно логировать в стандартный лог
error_log("PHP Error [$errno]: $errstr in $errfile on line $errline");
return true; // Ошибка обработана
}
function wppuzzle_get_error_type($errno) {
$types = [
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parse Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Strict',
E_RECOVERABLE_ERROR => 'Recoverable Error',
E_DEPRECATED => 'Deprecated',
E_USER_DEPRECATED => 'User Deprecated'
];
return isset($types[$errno]) ? $types[$errno] : 'Unknown';
}
set_error_handler('wppuzzle_custom_error_handler');
Этот обработчик перехватывает все ошибки, которые не подавлены, и записывает их в базу с указанием типа и контекста.
Просмотр и фильтрация отчетов об ошибках в админке
Для удобства разработчиков стоит создать страницу в админке, где можно просматривать сохраненные ошибки, фильтровать по типу и дате. Пример простого вывода:
function wppuzzle_error_log_admin_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppuzzle_error_log';
$errors = $wpdb->get_results("SELECT * FROM $table_name ORDER BY error_time DESC LIMIT 100");
echo '<div class="wrap"><h1>Отчет об ошибках WP Puzzle</h1><table class="wp-list-table widefat fixed striped"><thead><tr><th>Время</th><th>Тип</th><th>Сообщение</th><th>Файл</th><th>Строка</th></tr></thead><tbody>";
if ($errors) {
foreach ($errors as $error) {
echo "<tr>" .
"<td>" . esc_html($error->error_time) . "</td>" .
"<td>" . esc_html($error->error_type) . "</td>" .
"<td>" . esc_html($error->error_message) . "</td>" .
"<td>" . esc_html($error->error_file) . "</td>" .
"<td>" . esc_html($error->error_line) . "</td>" .
"</tr>";
}
} else {
echo "<tr><td colspan='5'>Ошибок не найдено</td></tr>";
}
echo "</tbody></table></div>";
}
function wppuzzle_add_admin_menu() {
add_menu_page('Отчет об ошибках WP Puzzle', 'Отчет ошибок', 'manage_options', 'wppuzzle-error-log', 'wppuzzle_error_log_admin_page', 'dashicons-warning', 80);
}
add_action('admin_menu', 'wppuzzle_add_admin_menu');
Этот код создаст новый пункт меню в админке и выведет 100 последних ошибок в табличном виде.
Использование плагина Clearfy Pro для расширенного контроля ошибок
Если вы используете плагин Clearfy Pro, он предлагает расширенные возможности для оптимизации и контроля ошибок, включая отключение лишних скриптов, управление логами и даже интеграцию с внешними сервисами мониторинга.
Clearfy позволяет отключить ненужные функции WordPress, что снижает количество ошибок, и настраивать уведомления об ошибках, что удобно для администраторов.
Рекомендации по безопасности и производительности при логировании ошибок
Ведение логов ошибок — полезная практика, но важно учитывать:
- Не храните логи в открытом виде на сервере — используйте базы данных или защищенные файлы.
- Очищайте старые записи, чтобы база не разрасталась и не замедляла сайт.
- Отключайте подробный вывод ошибок на живом сайте, чтобы не раскрывать внутренние данные.
- Используйте фильтры и уровни ошибок, чтобы фиксировать только критичные проблемы.
Хорошей практикой будет автоматизация очистки логов, например, через WP-Cron:
function wppuzzle_cleanup_error_logs() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppuzzle_error_log';
// Удаляем записи старше 30 дней
$wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE error_time < %s", date('Y-m-d H:i:s', strtotime('-30 days'))));
}
add_action('wp_scheduled_cleanup', 'wppuzzle_cleanup_error_logs');
if (!wp_next_scheduled('wp_scheduled_cleanup')) {
wp_schedule_event(time(), 'daily', 'wp_scheduled_cleanup');
}
Вывод
Создание подробного отчета об ошибках в WordPress — задача, решаемая как с помощью готовых плагинов, так и кастомного кода. Для большинства проектов достаточен плагин Error Log Monitor, но при специфических требованиях лучше реализовать собственный механизм с сохранением в базу и удобным интерфейсом в админке. Также рекомендуем использовать Clearfy Pro для комплексной оптимизации и контроля.