В работе с WordPress важно оперативно выявлять и анализировать ошибки, чтобы быстро реагировать на проблемы и поддерживать сайт в стабильном состоянии. В этой статье разберём, как создать автоматическую систему логирования ошибок в WordPress с помощью собственного кода, без привлечения громоздких плагинов. Такой подход позволит вам гибко настраивать обработку ошибок, хранение логов и уведомления.
Зачем нужен автоматический лог по ошибкам в WordPress
По умолчанию WordPress может записывать ошибки в файл debug.log, если включён режим отладки, но это не всегда удобно. Логи могут быстро заполняться, нет гибкой фильтрации, а также неудобно получать уведомления о критических ошибках.
Создание собственного логирования позволит:
- Фильтровать и группировать ошибки по типам или важности.
- Автоматически отправлять уведомления администратору.
- Хранить логи в базе данных или файлах с удобным доступом.
- Интегрироваться с кастомными хуками и плагинами.
Мы рассмотрим пример, как реализовать такой функционал с помощью простого плагина или сниппета.
Включение базового логирования в WordPress
Для начала убедимся, что в WordPress включён режим отладки и логирования ошибок. В файле wp-config.php должны быть прописаны следующие константы:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Это заставит WordPress записывать все ошибки в файл wp-content/debug.log и не показывать их на сайте, что важно для безопасности.
Но как собрать эти ошибки и обрабатывать их автоматически? Для этого можно воспользоваться хуком error_log или встроенными механизмами PHP, например, установкой пользовательского обработчика ошибок.
Создание пользовательского обработчика ошибок с логированием
Давайте создадим функцию wptool_custom_error_handler, которая будет перехватывать все ошибки PHP и записывать их в отдельный файл лога с расширенной информацией.
function wptool_custom_error_handler($errno, $errstr, $errfile, $errline) {
$log_file = WP_CONTENT_DIR . '/wptool-error.log';
$date = date('Y-m-d H:i:s');
$error_types = [
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing 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 => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Recoverable Error',
E_DEPRECATED => 'Deprecated',
E_USER_DEPRECATED => 'User Deprecated',
];
$type = isset($error_types[$errno]) ? $error_types[$errno] : 'Unknown Error';
$message = "[$date] $type: $errstr in $errfile on line $errline\n";
error_log($message, 3, $log_file);
// Можно добавить отправку почты или другие действия
return false; // Передать обработку стандартному обработчику
}
set_error_handler('wptool_custom_error_handler');Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. Он создаст файл wp-content/wptool-error.log и будет записывать туда подробные ошибки.
Что делает код?
Функция получает параметры ошибки, определяет её тип, формирует строку с датой и всеми деталями, а затем пишет в файл. Возвращая false, мы даём системе возможность также обрабатывать ошибку стандартным образом.
Автоматизация уведомлений об ошибках по email
Иногда важно мгновенно узнавать о критических ошибках. Для этого расширим обработчик и добавим отправку почты при возникновении ошибок определённого уровня.
function wptool_custom_error_handler($errno, $errstr, $errfile, $errline) {
$log_file = WP_CONTENT_DIR . '/wptool-error.log';
$date = date('Y-m-d H:i:s');
$error_types = [
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing 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 => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Recoverable Error',
E_DEPRECATED => 'Deprecated',
E_USER_DEPRECATED => 'User Deprecated',
];
$type = isset($error_types[$errno]) ? $error_types[$errno] : 'Unknown Error';
$message = "[$date] $type: $errstr in $errfile on line $errline\n";
error_log($message, 3, $log_file);
// Отправка почты только для ошибок серьезного уровня
if (in_array($errno, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR])) {
$admin_email = get_option('admin_email');
$subject = "[WPTool] Критическая ошибка на сайте";
wp_mail($admin_email, $subject, $message);
}
return false;
}
set_error_handler('wptool_custom_error_handler');Теперь при серьёзных ошибках администратор будет получать уведомления. Это помогает быстро реагировать на проблемы.
Использование плагинов для расширенного логирования ошибок в WordPress
Если вы не хотите писать код самостоятельно, можно использовать готовые плагины с расширенным функционалом. Например:
- Error Log Monitor — простой мониторинг и просмотр логов прямо в админке.
- WP Debugging — помогает управлять режимом отладки и логами.
- Clearfy Pro — комплексный набор инструментов оптимизации, включая расширенное логирование и очистку ошибок.
Однако собственное решение даёт полную свободу и позволяет интегрировать логи с вашими процессами.
Хранение логов ошибок в базе данных WordPress
Иногда удобнее хранить логи в базе данных для удобного поиска и фильтрации. Пример создания таблицы и записи ошибок:
function wptool_create_error_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wptool_error_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
error_type VARCHAR(100) NOT NULL,
error_message TEXT NOT NULL,
error_file VARCHAR(255) NOT NULL,
error_line INT NOT NULL,
error_date DATETIME NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wptool_create_error_log_table');
function wptool_custom_error_handler_db($errno, $errstr, $errfile, $errline) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptool_error_log';
$error_types = [
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
// остальные типы...
];
$type = isset($error_types[$errno]) ? $error_types[$errno] : 'Unknown Error';
$wpdb->insert($table_name, [
'error_type' => $type,
'error_message' => $errstr,
'error_file' => $errfile,
'error_line' => $errline,
'error_date' => current_time('mysql')
]);
return false;
}
set_error_handler('wptool_custom_error_handler_db');Так вы сможете создавать запросы к таблице для анализа и создавать админ-панель с фильтрами.
Панель управления логами в админке WordPress
Для удобства можно добавить меню в админке и выводить логи с пагинацией и фильтрами. Пример простого добавления меню:
function wptool_error_log_menu() {
add_menu_page(
'Логи ошибок WPTool',
'Логи ошибок',
'manage_options',
'wptool-error-log',
'wptool_error_log_page',
'dashicons-warning'
);
}
add_action('admin_menu', 'wptool_error_log_menu');
function wptool_error_log_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'wptool_error_log';
$logs = $wpdb->get_results("SELECT * FROM $table_name ORDER BY error_date DESC LIMIT 50");
echo '<div class="wrap"><h1>Логи ошибок WPTool</h1><table class="widefat"><thead><tr><th>ID</th><th>Тип</th><th>Сообщение</th><th>Файл</th><th>Строка</th><th>Дата</th></tr></thead><tbody>';
foreach ($logs as $log) {
echo '<tr>';
echo '<td>' . esc_html($log->id) . '</td>';
echo '<td>' . esc_html($log->error_type) . '</td>';
echo '<td>' . esc_html($log->error_message) . '</td>';
echo '<td>' . esc_html($log->error_file) . '</td>';
echo '<td>' . esc_html($log->error_line) . '</td>';
echo '<td>' . esc_html($log->error_date) . '</td>';
echo '</tr>';
}
echo '</tbody></table></div>';
}Это базовый пример, который можно расширять фильтрами, поиском и пагинацией.
Итоговые рекомендации по организации логирования
Для эффективного логирования ошибок на WordPress рекомендуем:
- Включать WP_DEBUG и WP_DEBUG_LOG в режиме разработки.
- Использовать собственный обработчик ошибок для расширенной записи.
- Добавить уведомления по email для критических ошибок.
- Рассмотреть хранение логов в базе для удобства анализа.
- Создавать админ-панель для просмотра и управления логами.
- Использовать проверенные плагины, если хотите быстрое решение без кода.
Таким образом, вы получите мощный инструмент контроля состояния сайта и сможете оперативно реагировать на любые сбои и ошибки.