Диагностика проблемы: зачем отключать неиспользуемые плагины
Часто на сайтах WordPress накапливается множество плагинов, которые перестали быть актуальными, но остаются активными или просто установлены. Они замедляют загрузку сайта, создают риски безопасности и усложняют администрирование. Ручное отключение и удаление — долгий процесс, особенно если плагинов много. Решение — автоматизировать отключение неиспользуемых плагинов по заданным критериям.
Как определить, что плагин не используется
Критерии неиспользуемости могут быть разными, например:
- Плагин не активировался (не запускался) за последние 30 дней.
- Плагин не влияет на фронтенд (нет вызовов его функций на страницах).
- Плагин не обновлялся и не менялся длительное время.
В примере ниже мы сосредоточимся на первом критерии — плагин не был активен (не вызывал свои хуки) в течение 30 дней.
Пошаговое решение: код для автоматического отключения плагинов
Для реализации понадобится отслеживать последнее время активности плагина и периодически проверять эти данные с помощью WP-Cron. Если плагин неактивен более 30 дней, он автоматически отключается.
1. Сохраняем время активности плагина
Добавим код, который на каждом вызове плагина обновляет метку времени в опциях:
function update_plugin_last_active( $plugin_file ) {
$last_active = get_option( 'plugin_last_active_times', array() );
$last_active[$plugin_file] = time();
update_option( 'plugin_last_active_times', $last_active );
}
// Пример для конкретного плагина (замените 'my-plugin/my-plugin.php')
add_action( 'init', function() {
update_plugin_last_active( 'my-plugin/my-plugin.php' );
} );Этот код необходимо адаптировать для каждого плагина, который хотите отслеживать, добавляя соответствующий хук, который плагин запускает в любом случае, например, init или wp_loaded.
2. Проверка и отключение неактивных плагинов
Создадим функцию, которая запускается по расписанию и отключает плагины, неактивные более 30 дней:
function auto_deactivate_unused_plugins() {
$threshold = 30 * DAY_IN_SECONDS;
$last_active = get_option( 'plugin_last_active_times', array() );
$active_plugins = get_option( 'active_plugins', array() );
$now = time();
foreach ( $active_plugins as $plugin_file ) {
if ( ! isset( $last_active[ $plugin_file ] ) || ( $now - $last_active[ $plugin_file ] ) > $threshold ) {
deactivate_plugins( $plugin_file );
error_log( "Автоматически отключен плагин: $plugin_file из-за неактивности" );
}
}
}
// Планируем задачу раз в сутки
if ( ! wp_next_scheduled( 'auto_deactivate_unused_plugins_hook' ) ) {
wp_schedule_event( time(), 'daily', 'auto_deactivate_unused_plugins_hook' );
}
add_action( 'auto_deactivate_unused_plugins_hook', 'auto_deactivate_unused_plugins' );Проверка результата после внедрения
Чтобы проверить, что решение работает, выполните следующие шаги:
- Добавьте код отслеживания активности для нескольких плагинов.
- Искусственно измените время последней активности в опции
plugin_last_active_times(через phpMyAdmin или WP CLI), установив дату старше 30 дней. - Запустите задачу вручную через WP-CLI:
wp cron event run auto_deactivate_unused_plugins_hook. - Проверьте, что соответствующие плагины отключены (
get_option('active_plugins')не содержит их). - Проверьте логи сервера или error_log на наличие сообщений об отключении.
Частые ошибки и как их исправить
- Плагины не отслеживаются: Не добавлен вызов
update_plugin_last_active()для плагина — нужно вставить вызов в хук, который точно срабатывает при его работе. - Автоматическое отключение не происходит: WP-Cron может не запускаться из-за отсутствия трафика или неправильных настроек сервера. Запустите крон вручную через WP-CLI или настройте системный cron.
- Отключение нужных плагинов: Проверьте логи и исключите плагины из автоматического отключения, добавив фильтр или проверку по списку исключений.
- Проблемы с правами: Функция
deactivate_plugins()требует, чтобы код выполнялся с достаточными правами (обычно в админке). Если код запускается в другом контексте, могут быть ошибки.
Практические советы по безопасности и производительности
- Не отключайте критичные для сайта плагины (например, безопасность, кэширование) без проверки.
- Добавьте в код список исключений, чтобы защитить важные плагины от автоотключения.
- Для повышения производительности не обновляйте время активности при каждом запросе, а например, не чаще одного раза в час.
- Используйте WP-CLI для ручного управления и проверки плагинов — это проще и надежнее.
- Для удобства администрирования можно добавить в админ-панель страницу с отчетом об активности плагинов и истории отключений.
Пример кода с исключениями
function auto_deactivate_unused_plugins() {
$threshold = 30 * DAY_IN_SECONDS;
$last_active = get_option( 'plugin_last_active_times', array() );
$active_plugins = get_option( 'active_plugins', array() );
$now = time();
$excluded_plugins = array(
'akismet/akismet.php',
'wordpress-seo/wp-seo.php',
);
foreach ( $active_plugins as $plugin_file ) {
if ( in_array( $plugin_file, $excluded_plugins, true ) ) {
continue; // исключаем важные плагины
}
if ( ! isset( $last_active[ $plugin_file ] ) || ( $now - $last_active[ $plugin_file ] ) > $threshold ) {
deactivate_plugins( $plugin_file );
error_log( "Автоматически отключен плагин: $plugin_file из-за неактивности" );
}
}
}Сравнение подходов к отключению неиспользуемых плагинов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное отключение | Полный контроль, простота | Долго при большом количестве плагинов | Маленькие сайты, редкие изменения |
| Автоматизация через WP-Cron и код | Экономия времени, систематизация | Требует настройки, риски отключения нужных плагинов | Средние и крупные проекты с множеством плагинов |
| Плагины для управления плагинами | Удобный интерфейс, дополнительные функции | Дополнительная нагрузка, может конфликтовать | Если хочется GUI и расширенный контроль |