
🚫 Как выборочно отключить плагины WordPress на отдельных страницах и записях
Каждый плагин WordPress добавляет PHP-код, который исполняется при загрузке страницы, тянет скрипты и стили, а иногда и дополнительные запросы к базе данных. Чем больше плагинов, тем тяжелее страница. Но проблема не только в количестве: даже один «разговорчивый» плагин вроде Contact Form 7 по умолчанию грузит свои .css и .js на каждой странице сайта, включая те, где формы нет и в помине.
Разработчики CF7 честно признают: плагин подключает ресурсы везде, потому что шорткод может появиться где угодно. И это логика не одного CF7, так работает большинство плагинов. Результат: главная страница блога тянет скрипты слайдера галереи, которого на ней отродясь не было.
Хорошая новость: WordPress позволяет отключать загрузку плагинов выборочно, только на тех страницах, где они реально нужны. Разберём оба пути: программный (через mu-plugin с фильтром option_active_plugins) и плагинный (Plugin Organizer, Perfmatters, Plugin Load Filter). В конце замерим результат через браузерный монитор сети.
💡 Быстрый обзор:
- Выбирайте плагины по трём критериям: репутация разработчика, производительность под нагрузкой и реальная необходимость
- Программный способ: пишем PHP-сниппет, который через
get_option('active_plugins')получает список активных плагинов и фильтрует их по URL страницы - Mu-plugin: выносим фильтр в
/wp-content/mu-plugins/, чтобы он срабатывал ДО всех обычных плагинов, и отключаем ненужные на лету - Плагинный способ: Plugin Organizer и Perfmatters дают визуальный интерфейс для тех же задач, без единой строчки кода
- Замеряем эффект через Chrome/Firefox DevTools: после фильтрации HTTP-запросы падают, время загрузки заметно сокращается
Три правила выбора плагинов
Прежде чем фильтровать загрузку, стоит убедиться, что плагины на сайте вообще заслуживают места в wp_options. Три правила, которые экономят нервы и серверные ресурсы.
Ставьте только проверенные плагины от разработчиков с историей. Открывайте страницу плагина на WordPress.org и смотрите: количество активных установок, рейтинг, дату последнего обновления и число решённых тикетов в поддержке. Плагин с 100 000+ установок, оценкой 4.5+ и обновлением в пределах последних 3 месяцев, безопасный выбор.

Предпочитайте масштабируемые плагины. Два плагина с одинаковой функцией могут по-разному влиять на скорость. Сравнивайте кандидатов через браузерный инспектор (вкладка Network) или онлайн-сервисы вроде Google PageSpeed Insights, Pingdom и GTmetrix, замеряйте время загрузки и число HTTP-запросов до и после установки.
Не держите мёртвый груз. Каждый неиспользуемый плагин, лишний PHP-код в каждом запросе. Периодически ревизируйте список активных плагинов и удаляйте те, без которых сайт живёт спокойно. Если плагин «возможно пригодится через полгода», деактивируйте и удалите, а через полгода поставите свежую версию.
Реальный пример: Contact Form 7
Contact Form 7, идеальный подопытный. Он добавляет на каждую страницу:
style.css, стили формscripts.js, логику валидации и отправки
Даже если на странице нет шорткода [contact-form-7], оба файла исправно грузятся. На скриншоте ниже, панель Network в Chrome DevTools, которая не даст соврать:

Решение: либо править логику загрузки внутри плагина (что слетит при обновлении), либо выборочно отключать плагин для всех страниц, кроме нужной. Второй путь надёжнее, им и займёмся.
Шаг 1. Получаем список активных плагинов через PHP
Перед тем как фильтровать, нужно понимать, где WordPress хранит список активных плагинов. Все они лежат в таблице wp_options, в строке с ключом active_plugins. Достать массив можно одной функцией get_option.
Добавьте этот код в плагин Code Snippets или в собственный файл плагина (не забудьте заголовок плагина в начале):
1 <?php 2 /** 3 * Plugin Name: Active Plugins Lister 4 */ 5 6 add_shortcode( 'activeplugins', function() { 7 $active_plugins = get_option( 'active_plugins' ); 8 $plugins = ""; 9 if ( count( $active_plugins ) > 0 ) { 10 $plugins = "<ul>"; 11 foreach ( $active_plugins as $plugin ) { 12 $plugins .= "<li>" . $plugin . "</li>"; 13 } 14 $plugins .= "</ul>"; 15 } 16 return $plugins; 17 } );
Файл сохраните как active-plugins.php и загрузите в /wp-content/plugins/. Создайте тестовую страницу, вставьте шорткод [activeplugins], получите нумерованный список всех активных плагинов в формате папка/файл.php.

Вот как выглядит результат после вставки шорткода на страницу:

Шаг 2. Фильтр option_active_plugins, главный инструмент
Теперь главный инструмент, фильтр option_active_plugins. Он относится к семейству фильтров option_$option_name и срабатывает каждый раз, когда WordPress извлекает значение опции из базы данных. Поскольку активные плагины хранятся именно как опция active_plugins, этот фильтр даёт возможность на лету подменить массив: убрать ненужные плагины или, наоборот, добавить новый.
Вот минимальный пример, программно активируем Advanced Custom Fields (при условии что плагин уже установлен):
1 add_filter( 'option_active_plugins', function( $plugins ) { 2 $myplugin = "advanced-custom-fields/acf.php"; 3 if ( ! in_array( $myplugin, $plugins ) ) { 4 $plugins[] = $myplugin; 5 } 6 return $plugins; 7 } );
Этот код добавит ACF в список активных плагинов на каждой странице. Не особо практично, но принцип понятен: массив $plugins можно модифицировать как угодно.
Важный нюанс: фильтр должен сработать раньше обычных плагинов, иначе WordPress успеет прочитать неотфильтрованный список. Для этого есть mu-plugins.
Шаг 3. Создаём mu-plugin для выборочного отключения
Must-use плагины живут в /wp-content/mu-plugins/ и выполняются до всех обычных плагинов. Это именно то, что нужно: наш фильтр получит управление первым.
Есть одна тонкость: условные теги WordPress (is_page(), is_single() и другие) в mu-plugin не работают, запрос ещё не разобран, и все они вернут false. Приходится анализировать URL вручную через $_SERVER['REQUEST_URI'].
Вот готовый mu-plugin, который отключает Contact Form 7 на всех страницах, кроме /contact/:
1 $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); 2 $is_admin = strpos( $request_uri, '/wp-admin/' ); 3 4 if ( false === $is_admin ) { 5 add_filter( 'option_active_plugins', function( $plugins ) { 6 global $request_uri; 7 8 $is_contact_page = strpos( $request_uri, '/contact/' ); 9 $myplugin = "contact-form-7/wp-contact-form-7.php"; 10 $k = array_search( $myplugin, $plugins ); 11 12 if ( false !== $k && false === $is_contact_page ) { 13 unset( $plugins[ $k ] ); 14 } 15 16 return $plugins; 17 } ); 18 }
Разберём построчно:
parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), извлекает путь запроса (например,/blog/kak-otkljuchit-plaginy/)strpos( $request_uri, '/wp-admin/' ), проверяет, в админке ли мы; если да, фильтр не применяется, чтобы страницы настроек плагинов оставались доступныarray_search( $myplugin, $plugins ), ищет CF7 в массиве активных плагиновunset( $plugins[ $k ] ), удаляет плагин из списка, если мы НЕ на странице контактов
Сохраните файл, загрузите в /wp-content/mu-plugins/, сбросьте кеш. Теперь шорткод [activeplugins] должен показывать Contact Form 7 только на странице /contact/.
Вот как тот же принцип выглядит для нескольких плагинов одновременно. Вместо array_search с одним плагином, массив и array_diff:
1 $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); 2 $is_admin = strpos( $request_uri, '/wp-admin/' ); 3 4 if ( false === $is_admin ) { 5 add_filter( 'option_active_plugins', function( $plugins ) { 6 global $request_uri; 7 8 $is_contact_page = strpos( $request_uri, '/contact/' ); 9 $myplugins = array( 10 "contact-form-7/wp-contact-form-7.php", 11 "code-snippets/code-snippets.php", 12 "query-monitor/query-monitor.php", 13 "autoptimize/autoptimize.php" 14 ); 15 16 if ( false === $is_contact_page ) { 17 $plugins = array_diff( $plugins, $myplugins ); 18 } 19 20 return $plugins; 21 } ); 22 }
Функция array_diff возвращает значения из первого массива, которых нет во втором, именно то, что нужно для массового отключения.
Результат виден сразу в панели Network: файл script.js от Contact Form 7 исчезает из списка ресурсов на всех страницах, кроме страницы контактов.

Программный подход гибкий, но требует правки кода при каждом новом плагине. Для тех, кто предпочитает визуальный интерфейс, есть готовые плагины-фильтры.
Способ с плагинами: фильтрация без кода
Plugin Load Filter
Plugin Load Filter, бесплатный инструмент для фильтрации плагинов по нескольким условиям. Поддерживает:
- фильтрацию по типу поста (записи, страницы, произвольные типы)
- фильтрацию по формату записи
- исключения для модулей Jetpack
- фильтрацию URL для REST API, Heartbeat, AJAX и AMP-запросов

Настройки активации фильтра по типам страниц:

После активации администратор настраивает, на каких страницах применять фильтр, через вкладку «Filter Activation by Page Type». Минималистично и без лишних усложнений.
Plugin Organizer
Plugin Organizer, ветеран среди плагинов фильтрации, с рейтингом 5 звёзд. Даёт полный контроль над загрузкой:
- выборочное отключение плагинов по URL страницы
- отключение по ролям пользователей
- группы плагинов (включить/отключить сразу пачку)
- изменение порядка загрузки плагинов

На странице «Global Plugins» можно перетаскиванием глобально отключить плагин для всего сайта и точечно включить его обратно на отдельных страницах через метабокс в редакторе поста. На скриншоте ниже Contact Form 7 глобально отключён:

А здесь, тот самый метабокс на странице редактирования контактов, который переопределяет глобальные настройки:

Plugin Organizer также показывает отладочную информацию: какие плагины реально загрузились на каждой странице и почему. Документация доступна на сайте разработчика.
Perfmatters
Perfmatters, премиальный инструмент от команды разработчиков Kinsta. Его главная фишка, Script Manager, где все скрипты и стили сгруппированы по имени плагина или темы.

Можно отключить плагин целиком или выборочно убрать отдельные CSS/JS-файлы внутри него. Для сайтов со сложной структурой URL есть отключение скриптов по регулярным выражениям.
Три сценария, где Perfmatters даёт мгновенный выигрыш:
- Плагины соцсетей (кнопки «Поделиться»), отключаются везде, кроме записей блога
- Contact Form 7, отключается везде, кроме страницы с формой
- Стили блочного редактора Гутенберга (
block-library/style.min.cssиtheme.min.css), убираются для сайтов на классическом редакторе
В независимом тесте на woorkup.com отключение ненужных скриптов через Perfmatters сократило общее время загрузки на 20,2%, число HTTP-запросов на главной, с 46 до 30, а размер страницы, с 506,3 КБ до 451,6 КБ.

Perfmatters, платный плагин, и это оправдано для сайтов, где скорость напрямую влияет на конверсию. Для небольшого блога хватит Plugin Organizer или программного mu-plugin.
Замеряем результат через браузерный монитор сети
Оптимизация без замера, гадание. Браузерные DevTools дают точную картину «до и после» без сторонних сервисов. Подойдёт любой современный браузер:
На тестовой установке WordPress с 18 активными плагинами мы замерили скорость страницы до фильтрации (пустой кеш, Firefox Network Monitor):

Результат: 255,19 КБ, загрузка 1,24 секунды, 12 запросов.
После установки Plugin Organizer и глобального отключения Contact Form 7 круговая диаграмма поменялась:

Показатели: 104,21 КБ, загрузка 0,80 секунды, 8 запросов.
Наконец, отключили все неиспользуемые плагины:

Финальный результат: 101,98 КБ, загрузка 0,46 секунды, 8 запросов.
Сравним крайние точки: размер ресурсов сократился более чем вдвое (с 255 до 102 КБ), время загрузки, с 1,24 до 0,46 секунды, HTTP-запросы, с 12 до 8. Цифры говорят сами за себя: выборочное отключение плагинов даёт ощутимый прирост скорости даже на небольшом сайте, а просадка по TTFB и LCP напрямую влияет на позиции в выдаче.
⁉️🤔 Частые вопросы
Обязательно ли использовать mu-plugin, или можно оставить код в обычном плагине?
Можно и в обычном, но тогда порядок загрузки может всё испортить. Если ваш фильтр
option_active_pluginsзагрузится после того, как WordPress уже прочитал список активных плагинов, он не сработает. Mu-plugin, единственный способ быть уверенным, что фильтр получит управление до всех остальных плагинов. В обычном плагине вы зависите от алфавитного порядка или хуков, которые могут измениться после обновления любого другого плагина.
Что делать, если я не могу создать папку mu-plugins на хостинге?
Папку
/wp-content/mu-plugins/можно создать через FTP, файловый менеджер хостинга или WP-CLI командойwp scaffold mu-plugin. Если доступа к файловой системе нет совсем, используйте Plugin Organizer: он делает то же самое, но через собственный механизм фильтрации и не требует правки серверных файлов. Большинство хостингов дают доступ к wp-content через файловый менеджер в панели управления. Права на папку: 0755.
Повлияет ли отключение плагина через фильтр на его настройки?
Нет, настройки плагина хранятся в базе данных (таблица
wp_options) и не затрагиваются. Вы просто не даёте WordPress загружать код плагина при обработке конкретного запроса. Все настройки останутся на месте, и при следующем запросе, где плагин не отфильтрован, он загрузится с полным функционалом. Отключение черезoption_active_plugins, это именно блокировка загрузки кода на лету, а не деактивация. В админке плагин остаётся активным, его настройки не трогаются, запланированные задачи (WP-Cron) продолжают работать.
Как проверить, что фильтр реально работает?
Самый наглядный способ, панель Network в Chrome DevTools (F12 → Network). Откройте её на странице, где плагин должен быть отключён, обновите с зажатой клавишей Ctrl (пустой кеш) и вбейте в поиск название плагина или его CSS/JS-файла. Если запросов нет, фильтр работает. Плагины вроде Query Monitor также показывают перечень загруженных компонентов и время их исполнения. Для Contact Form 7 в поиске Network введите
contact-form-7, если фильтр сработал, вы не увидите ниstyle.css, ниscripts.jsот CF7 в списке загруженных ресурсов.
Есть ли смысл отключать плагины на совсем маленьком сайте, где их 5-7 штук?
Если все 5 плагинов реально нужны на каждой странице, нет. Но даже на маленьком сайте часто висит пара плагинов, которые работают лишь на одной странице: форма обратной связи, галерея в портфолио, слайдер на главной. Отключение такой пары на остальных страницах заметно сокращает число HTTP-запросов и ускоряет загрузку, как мы видели выше на тестовой установке, даже один отфильтрованный плагин отгрызает десятки миллисекунд. Для сайта с посещаемостью от 1000 человек в сутки эти миллисекунды складываются в ощутимую разницу и для пользователя, и для Core Web Vitals.
Код, плагин или Perfmatters: что выбрать под вашу задачу
Если на сайте 5 плагинов и все они реально нужны на каждой странице, эта инструкция не для вас. Но типичный WordPress-сайт тянет 15-25 активных плагинов, из которых на конкретной странице работают от силы 5-7. Остальные просто расходуют серверное время и замедляют загрузку.
Программный mu-plugin, бесплатный, лёгкий и полностью контролируемый способ, но требует внимания при каждом новом плагине. Plugin Organizer, золотая середина: визуальный интерфейс, гибкость и бесплатность. Perfmatters, выбор для коммерческих проектов, где каждая десятая секунды загрузки конвертируется в деньги.
Если вы накопили плагинов больше, чем нужно, начните с ревизии и чистки неиспользуемых, а затем возьмите под контроль загрузку оставшихся. Выберите свой способ по уровню комфорта и нагрузке на сайт, и увидите разницу в первом же замере Network. Не ждите, пока плагины съедят ваш TTFB.



