Диагностика проблемы: зачем отключать неиспользуемые плагины
Сильное количество активных плагинов в WordPress часто ведёт к замедлению сайта, конфликтам и повышенному риску безопасности. Часто плагины активируются для проверки, а потом остаются включёнными «на всякий случай», но не используются в реальных процессах. Автоматическое отключение неиспользуемых плагинов поможет:
- Снизить нагрузку на сервер и повысить скорость загрузки;
- Уменьшить вероятность конфликтов и ошибок;
- Снизить риск уязвимостей за счёт уменьшения числа активных входных точек;
- Упростить администрирование и аудит безопасности.
Проблема в том, что WordPress по умолчанию не предоставляет инструментов для анализа активности плагинов или их автоматического отключения. Решение можно реализовать с помощью собственного кода и WP-Cron.
Пошаговое решение: как реализовать автоматическое отключение неиспользуемых плагинов
1. Отслеживаем активность плагинов
Для начала нам нужно определить, какой плагин считается «неиспользуемым». Логично ориентироваться на отсутствие вызовов хука init или admin_init, либо на отсутствие активности пользователя с этим плагином.
Ниже пример кода, который при каждом вызове init записывает текущую метку времени активности плагина в опцию базы данных. В данном случае мы предполагаем, что каждый плагин добавляет этот код в свой главный файл. Для централизованного контроля можно реализовать через MU-плагин, который проверяет активность через фильтры и хуки.
<?php
add_action('init', function() {
$plugin = plugin_basename(__FILE__); // например 'my-plugin/my-plugin.php'
update_option('plugin_last_active_'.md5($plugin), current_time('timestamp'));
});
?>2. Создаем скрипт для проверки неактивных плагинов и их отключения
Далее создадим функцию, которая будет запускаться периодически (через WP-Cron) и проверять, когда последний раз плагин был активен. Если прошло более N дней, плагин отключается.
<?php
function auto_deactivate_inactive_plugins() {
$plugins = get_plugins();
$threshold = 30 * DAY_IN_SECONDS; // 30 дней
$now = current_time('timestamp');
foreach ($plugins as $plugin_file => $plugin_data) {
$last_active = get_option('plugin_last_active_'.md5($plugin_file), 0);
if ($last_active && ($now - $last_active > $threshold)) {
if (is_plugin_active($plugin_file)) {
deactivate_plugins($plugin_file);
error_log("Plugin {$plugin_file} was deactivated due to inactivity.");
}
}
}
}
if (!wp_next_scheduled('auto_deactivate_plugins_event')) {
wp_schedule_event(time(), 'daily', 'auto_deactivate_plugins_event');
}
add_action('auto_deactivate_plugins_event', 'auto_deactivate_inactive_plugins');
?>3. Добавляем уведомления администратору
Рекомендуется уведомлять администратора сайта о деактивации плагинов, чтобы не допустить неожиданностей. Для этого можно добавить отправку email или отображение админ-уведомлений.
<?php
add_action('admin_notices', function() {
$deactivated = get_transient('deactivated_plugins_notice');
if ($deactivated) {
echo '<div class="notice notice-warning is-dismissible">';
echo '<p>Автоматически отключены плагины: '.esc_html($deactivated).'</p>';
echo '</div>';
delete_transient('deactivated_plugins_notice');
}
});
function auto_deactivate_inactive_plugins() {
$plugins = get_plugins();
$threshold = 30 * DAY_IN_SECONDS;
$now = current_time('timestamp');
$deactivated = [];
foreach ($plugins as $plugin_file => $plugin_data) {
$last_active = get_option('plugin_last_active_'.md5($plugin_file), 0);
if ($last_active && ($now - $last_active > $threshold)) {
if (is_plugin_active($plugin_file)) {
deactivate_plugins($plugin_file);
$deactivated[] = $plugin_data['Name'];
}
}
}
if (!empty($deactivated)) {
set_transient('deactivated_plugins_notice', implode(', ', $deactivated), 12 * HOUR_IN_SECONDS);
// Можно также добавить wp_mail для отправки уведомления
}
}
?>Проверка результата после внедрения
Чтобы убедиться, что автоматическое отключение работает:
- Проверьте дату последней активности плагинов – в базе данных или с помощью
get_option('plugin_last_active_'.md5($plugin_file)); - Проверьте, что плагины, которые не использовались более 30 дней, отключены через меню «Плагины»;
- Посмотрите лог ошибок сервера или
error_logдля записи деактиваций; - В админке должны отображаться уведомления о деактивации, если они реализованы;
- Протестируйте работу WP-Cron, чтобы убедиться, что событие ежедневно запускается (например, через плагин WP Crontrol).
Частые ошибки и как исправить
- Неверный подсчет времени активности. Если плагин не вызывает
initили код активности не вставлен, время не обновится. Решение — централизованно отслеживать активность через MU-плагин или хуки и не полагаться на плагины. - Отключение критически важных плагинов. Добавьте белый список плагинов, которые не следует отключать, например:
$whitelist = ['akismet/akismet.php', 'woocommerce/woocommerce.php'];
if (in_array($plugin_file, $whitelist)) continue;- WP-Cron не запускается. На некоторых серверах WP-Cron зависит от посещений сайта. Используйте системный cron для запуска
wp-cron.phpили плагины мониторинга. - Привилегии пользователя. Для деактивации плагинов функция должна запускаться с правами администратора, убедитесь, что код размещён в правильном контексте.
Практические советы по безопасности и производительности
- Регулярно обновляйте список исключений — не отключайте плагины, обеспечивающие безопасность и кеширование.
- Для мониторинга активности используйте системные логи и плагины аудита, чтобы не полагаться только на простое обновление опций.
- Ограничьте доступ к странице плагинов, чтобы несанкционированные пользователи не включали устаревшие плагины.
- Для больших сайтов с десятками плагинов лучше запускать проверку поэтапно или с задержками, чтобы избежать нагрузок.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Ручное отключение | Полный контроль, простота | Трудозатратно, забывается | Регулярный аудит плагинов |
| Плагин мониторинга активности | Автоматизация, удобство | Дополнитель нагрузка, может быть платным | Использовать проверенные решения |
| Собственный код с WP-Cron | Полная кастомизация, бесплатность | Требует разработки, риски ошибок | Резервное копирование и тестирование |