В процессе работы WordPress-сайта иногда возникают ситуации, когда один из плагинов начинает вызывать критические ошибки — это может привести к белому экрану смерти (WSOD), сбоям в работе сайта и потере посетителей. В таких случаях полезно иметь механизм, который автоматически отключит проблемный плагин, чтобы сайт остался доступен, а администратор получил уведомление для дальнейшего анализа.
Почему автоматическое отключение плагинов полезно
Часто ошибки от плагинов возникают после обновления или конфликта с другими компонентами сайта. Если вовремя не отключить плагин, сайт может перестать работать, а для многих владельцев и разработчиков это становится настоящей проблемой, особенно если нет доступа к админке через браузер.
Автоматическая система отключения позволяет:
- Быстро восстановить работоспособность сайта без ручного вмешательства;
- Получить информацию о проблемном плагине для последующего устранения;
- Избежать потери посетителей и ухудшения SEO;
- Облегчить поддержку и сопровождение WordPress-сайтов.
Основные принципы реализации автоматического отключения плагинов
Для реализации такой системы нужно уметь:
- Отловить критические ошибки PHP, вызванные плагинами;
- Определить, какой именно плагин вызвал ошибку;
- Отключить проблемный плагин программно;
- Отправить уведомление администратору (например, на email) с деталями ошибки;
- Обеспечить безопасность и минимизировать ложные срабатывания.
В WordPress есть несколько способов обрабатывать ошибки и отключать плагины. Рассмотрим наиболее эффективный.
Пример реализации автоматического отключения плагинов при ошибках
Ниже приведён пример кода, который можно включить в wp-config.php или отдельный файл плагина. Он регистрирует обработчик фатальных ошибок, пытается определить плагин, вызвавший ошибку, и отключает его.
function wpmy_handle_fatal_error() {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
// Получаем стек вызовов с помощью debug_backtrace невозможно, но можно проанализировать $error['message']
$message = $error['message'];
$plugin_dir = wpmy_detect_plugin_from_error($message);
if ($plugin_dir) {
// Отключаем плагин
wpmy_deactivate_plugin_by_dir($plugin_dir);
// Отправляем уведомление администратору
wpmy_send_error_notification($plugin_dir, $message);
}
}
}
register_shutdown_function('wpmy_handle_fatal_error');
function wpmy_detect_plugin_from_error($message) {
// Получаем список активных плагинов
$active_plugins = get_option('active_plugins');
foreach ($active_plugins as $plugin) {
// Плагин обычно хранится в папке вида plugin-folder/plugin-file.php
$plugin_folder = dirname($plugin);
// Проверяем, есть ли упоминание папки плагина в сообщении ошибки
if (strpos($message, $plugin_folder) !== false) {
return $plugin_folder;
}
}
return false;
}
function wpmy_deactivate_plugin_by_dir($plugin_folder) {
$active_plugins = get_option('active_plugins');
foreach ($active_plugins as $key => $plugin) {
if (strpos($plugin, $plugin_folder . '/') === 0) {
unset($active_plugins[$key]);
update_option('active_plugins', $active_plugins);
break;
}
}
}
function wpmy_send_error_notification($plugin_folder, $message) {
$admin_email = get_option('admin_email');
$subject = 'Автоматическое отключение плагина из-за ошибки';
$body = "Плагин '{$plugin_folder}' был автоматически отключен из-за критической ошибки:\n\n{$message}";
wp_mail($admin_email, $subject, $body);
}
Как работает код
Код регистрирует функцию wpmy_handle_fatal_error как функцию, которая вызывается при завершении выполнения скрипта. Если обнаруживается фатальная ошибка, то в сообщении ищется имя папки плагина, чтобы понять, какой из активных плагинов вызвал проблему.
После определения плагина он отключается из опции active_plugins в базе данных, а администратору отправляется письмо с информацией.
Дополнительные рекомендации и улучшения
Использование плагинов для мониторинга и отключения
Существуют плагины, которые помогают отслеживать ошибки и отключать проблемные плагины, например, Clearfy Pro. Он включает функции безопасности и оптимизации, среди которых есть защита от конфликтов.
Логирование ошибок в отдельный файл
Для удобства отладки рекомендуется вести лог ошибок в отдельный файл с помощью функции error_log или расширенных средств, таких как Monolog. Это позволит анализировать причины сбоев и принимать меры без отключения сайта.
Ограничение срабатываний
Чтобы избежать постоянного отключения и включения плагина, можно добавить механизм блокировки повторных попыток активации или предупреждения через админ-панель.
Пример расширения: создание шорткода для отображения статуса плагинов
Для удобства контроля можно создать простой шорткод, который выводит список активных плагинов и их состояние. Это поможет наглядно увидеть, какие плагины активны, а какие были отключены автоматически.
function wpmy_plugin_status_shortcode() {
$active_plugins = get_option('active_plugins');
$all_plugins = get_plugins();
$output = '<ul>';
foreach ($all_plugins as $plugin_file => $plugin_data) {
$status = in_array($plugin_file, $active_plugins) ? 'Активен' : 'Отключен';
$output .= '<li>' . esc_html($plugin_data['Name']) . ' — ' . $status . '</li>';
}
$output .= '</ul>';
return $output;
}
add_shortcode('wpmy_plugins_status', 'wpmy_plugin_status_shortcode');
В админке или на странице сайта можно вставить шорткод [wpmy_plugins_status], чтобы получить список с состоянием плагинов.
Заключение
Автоматическая система отключения плагинов при ошибках — мощный инструмент для повышения стабильности WordPress-сайта. Она позволяет своевременно реагировать на проблемы, минимизируя время простоя и улучшая опыт пользователей. Несмотря на то, что полностью избежать ошибок невозможно, грамотное автоматическое управление активными плагинами значительно упрощает поддержку проекта.
Реализация, приведённая в статье, является базовой и может быть расширена с учётом специфики вашего сайта. Обязательно тестируйте код на тестовом сервере, прежде чем использовать на продакшене.