Ссылка скопирована

Отключение плагинов во фронтенде в WordPress

DonVardix DonVardix

Введение

Во многих проектах на WordPress используются тяжелые плагины: инструменты импорта и экспорта (CSV/XML/WP All Import), модули миграций, генераторы резервных копий или специфические интерфейсы администрирования.

  • Проблема: ядро WordPress по умолчанию загружает все активные плагины на каждый запрос к сайту, включая публичную витрину (фронтенд). Это раздувает потребление оперативной памяти, замедляет Time to First Byte (TTFB) и выполняет сотни лишних SQL-запросов и хуков.
  • Решение: перехватывать список активных плагинов через фильтр option_active_plugins на самом раннем этапе загрузки ядра с помощью Must-Use плагина (mu-plugins).
  • Результат: тяжелые административные расширения полностью исключаются из цикла загрузки фронтенда, ускоряя рендеринг страниц для посетителей без влияния на работу панели управления.

1. Создание Must-Use плагина

Обычная тема (functions.php) или стандартный плагин не подходят для этой задачи, так как загружаются слишком поздно — после того, как WordPress уже инициализировал список активных модулей. Код должен работать исключительно как Must-Use плагин.

  1. Проверьте наличие каталога wp-content/mu-plugins. Если его нет, создайте директорию:
    mkdir -p wp-content/mu-plugins
  2. Создайте файл плагина, например wp-content/mu-plugins/unload-plugins.php.
  3. Добавьте следующий оптимизированный код:
<?php
/**
 * Plugin Name: Unload Admin-Only Plugins on Frontend
 * Description: Исключает тяжелые административные плагины из загрузки на фронтенде.
 */

add_filter( 'option_active_plugins', function ( $active_plugins ) {
    // В панели управления и при AJAX-запросах админки оставляем плагины активными
    if ( is_admin() ) {
        return $active_plugins;
    }

    // Список плагинов для выгрузки в формате 'папка/главный-файл.php'
    $unload_plugins = [
        'wp-all-import-pro/wp-all-import-pro.php',
        'duplicator/duplicator.php',
    ];

    // Быстрый поиск через ассоциативный массив O(1)
    $unload_map = array_flip( $unload_plugins );

    foreach ( $active_plugins as $index => $plugin ) {
        if ( isset( $unload_map[ $plugin ] ) ) {
            unset( $active_plugins[ $index ] );
        }
    }

    return array_values( $active_plugins );
} );

Важно о путях плагинов

Имя плагина должно точно совпадать с его системным путем относительно каталога wp-content/plugins, например: contact-form-7/wp-contact-form-7.php.

2. Механизм фильтрации и условия применения

Как работает перехват

Фильтр option_active_plugins срабатывает в момент, когда ядро WordPress запрашивает опцию active_plugins из таблицы wp_options. Удаляя элемент из возвращаемого массива, мы заставляем ядро считать, что плагин не активирован, и WordPress даже не подключает его PHP-файлы к стеку выполнения.

Сценарии применения

Использовать выборочную выгрузку рекомендуется для:

  • плагинов импорта, парсинга и синхронизации по REST API;
  • утилит резервного копирования и миграции базы данных;
  • админ-панелей и конструкторов отчетов, не влияющих на шорткоды или разметку страниц;
  • тяжелых профилировщиков (Query Monitor на продакшене при избирательной отладке).

Проверка зависимостей

Не выгружайте плагины, которые регистрируют кастомные типы записей (CPT), таксономии или шорткоды, используемые на фронтенде сайта. Иначе на страницах появятся ошибки 404 или нераспарсенные теги.

Вывод

Выгрузка административных плагинов через mu-plugins — один из самых эффективных методов серверной микро-оптимизации WordPress:

  1. Экономия памяти: PHP не парсит тысячи строк чужого кода на каждый визит пользователя или краулера.
  2. Нулевой риск блокировки: Must-Use плагины активны всегда и не могут быть случайно деактивированы администратором через панель управления.
  3. Чистота хуков: уменьшается количество обработчиков в init, wp_enqueue_scripts и parse_request, делая ответ сайта ощутимо быстрее.