Как автоматически отключить неиспользуемые плагины в WordPress

|

Диагностика проблемы: зачем отключать неиспользуемые плагины

Сильное количество активных плагинов в 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 для отправки уведомления
    }
}
?>

Проверка результата после внедрения

Чтобы убедиться, что автоматическое отключение работает:

Частые ошибки и как исправить

$whitelist = ['akismet/akismet.php', 'woocommerce/woocommerce.php'];
if (in_array($plugin_file, $whitelist)) continue;

Практические советы по безопасности и производительности

Сравнение вариантов реализации

МетодПреимуществаНедостаткиКомпромисс
Ручное отключениеПолный контроль, простотаТрудозатратно, забываетсяРегулярный аудит плагинов
Плагин мониторинга активностиАвтоматизация, удобствоДополнитель нагрузка, может быть платнымИспользовать проверенные решения
Собственный код с WP-CronПолная кастомизация, бесплатностьТребует разработки, риски ошибокРезервное копирование и тестирование
Как создать многоуровневое меню WordPress с помощью кода
27.11.2025
Как отключить XML-RPC в WordPress и проверить, что он больше не доступен
16.08.2026
Как ограничить XML-RPC запросы в WordPress без поломки синхронизации
05.09.2026
Как автоматически удалять старые записи через AJAX в WordPress
24.01.2026
Как создать настройку автообновления темы WordPress через код
25.02.2026
×
Quizle
Получите больше лидов и увеличьте продажи!
-15%

на премиум плагин WordPress

Получить скидку ⋙