Когда сайт начинает тормозить или в шаблоне внезапно появляются лишние блоки, проблема часто не в одном «тяжелом» плагине, а в цепочке хуков: add_action(), add_filter(), anonymous functions, дублирующиеся подключения из темы и плагинов. На практике это видно по мелким симптомам: лишний HTML в head, повторные баннеры, двойная загрузка скриптов, странные правки контента после сохранения.
Ниже — рабочий сценарий: как найти источник, отключить только нужное и не сломать обновляемую тему.
Когда стоит искать лишние хуки
Сначала важно понять, что именно вы лечите. Хуки не нужно «чистить» наугад. Ищите их, если есть один или несколько признаков:
- один и тот же скрипт подключается дважды;
- в
headили перед</body>появляются лишние метатеги, пиксели, счетчики; - контент постов меняется после сохранения без вашего кода;
- в админке или на фронтенде есть заметная просадка по времени генерации;
- после установки плагина часть шаблона стала выводиться не там, где ожидалось.
Если проблема проявляется только на одной странице, не начинайте с глобальной зачистки. Сначала локализуйте: это тема, конкретный плагин, mu-plugin или кастомный код в functions.php.
Диагностика проблемы: где именно сидит лишний код
Самый быстрый путь — не гадать, а посмотреть, кто именно цепляется к хуку. Если у вас есть доступ к коду, начните с поиска по проекту:
grep -R "add_action(\|add_filter(" wp-content/themes wp-content/plugins wp-content/mu-pluginsЭта команда не решает проблему сама по себе, но сразу показывает, где искать. Дальше смотрите на три вещи:
1. Повторяющиеся callbacks
Одинаковая функция может быть подключена несколько раз в разных местах. Например, в дочерней теме и в плагине. Если callback именованный, его проще снять через remove_action() или remove_filter().
2. Анонимные функции
С anonymous functions сложнее: снять их можно только если у вас есть точная ссылка на тот же объект closure. На практике это часто означает, что проще убрать регистрацию в исходном месте, чем пытаться «выдернуть» callback снаружи.
3. Приоритеты
Иногда проблема не в самом хуке, а в приоритете. Один код отрабатывает раньше другого и перезаписывает результат. Это особенно заметно на фильтрах the_content, wp_head, wp_enqueue_scripts.
Как отключить лишний хук безопасно
Если callback именованный, используйте remove_action() или remove_filter() в том же хуке, но позже по времени выполнения. Обычно это делают на after_setup_theme, init или wp_loaded — в зависимости от того, где был добавлен исходный код.
add_action('after_setup_theme', function () {
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
}, 20);Это типичный пример для удаления лишнего мусора из head. Но если вы не уверены, что именно делает callback, не удаляйте его вслепую. Сначала проверьте, не нужен ли он теме, плагину или интеграции.
Если нужно убрать фильтр из контента
Фильтры часто цепляются к the_content. Например, плагин может автоматически добавлять обертки, кнопки или рекламные вставки. Если функция именованная, ее можно снять так:
add_action('init', function () {
remove_filter('the_content', 'plugin_add_banner_to_content', 10);
});Если вы не знаете точное имя функции, ищите его в коде плагина. Для этого полезно открыть файл и посмотреть, где вызывается add_filter('the_content', ...).
Сравнение подходов: плагин, код, ручная правка
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Код в дочерней теме или mu-plugin | Нужно точечно снять хук | Контроль, предсказуемость, не зависит от UI | Нужно понимать порядок загрузки |
| Плагин для оптимизации/чистки | Нужно быстро убрать типовые лишние элементы | Меньше ручной работы | Не всегда видно, что именно отключено |
| Правка исходного плагина | Только для временной диагностики | Быстро проверить гипотезу | Слетит при обновлении, риск поломки |
Для постоянного решения лучше использовать код в дочерней теме или отдельный mu-plugin. Это особенно удобно, если вы не хотите зависеть от редактора темы и не планируете каждый раз лезть в functions.php.
Пошаговый сценарий: убрать лишний вывод и не сломать сайт
Ниже практический порядок, который обычно работает без лишней магии.
- Сделайте бэкап файлов и базы.
- Включите логирование ошибок в staging или на локальной копии.
- Найдите конкретный callback через поиск по
add_actionилиadd_filter. - Проверьте, не используется ли он в нескольких местах.
- Добавьте
remove_action()илиremove_filter()в дочернюю тему илиmu-plugin. - Очистите кэш страницы и объектный кэш, если он есть.
- Проверьте исходный HTML и поведение страницы.
Если нужно отключить код только на части сайта, добавляйте условия. Например, не трогать главную, но убрать блок на одиночных записях:
add_action('wp', function () {
if (is_singular('post')) {
remove_action('wp_footer', 'theme_render_related_posts', 15);
}
});Такой подход лучше, чем глобально вырезать вывод, если блок нужен в других типах контента.
Как проверить, что решение сработало
Проверка должна быть не визуальной «на глаз», а технической. Смотрите на три уровня:
- HTML-вывод — откройте исходный код страницы и убедитесь, что лишний блок исчез;
- Поведение интерфейса — проверьте формы, меню, кнопки, lazy-load, метки и виджеты;
- Ошибки в логах — после удаления callback не должно быть fatal error или warning о несуществующей функции.
Если вы убирали подключение скрипта, проверьте, что он действительно исчез из списка enqueued assets. Это можно сделать через инструменты разработчика браузера на вкладке Network или Sources.
Мини-проверка через код
Для диагностики удобно временно вывести список зарегистрированных callbacks на конкретном хуке. Это не боевой код, а инструмент проверки:
add_action('wp_footer', function () {
global $wp_filter;
if (isset($wp_filter['wp_head'])) {
echo '<!-- wp_head callbacks registered -->';
echo '<!-- ' . esc_html(print_r($wp_filter['wp_head'], true)) . ' -->';
}
}, 9999);После проверки такой код нужно убрать. Он полезен только на staging, потому что может засорять HTML и раскрывать внутреннюю структуру сайта.
Частые ошибки и как их исправить
Снимают хук не в том месте
Если remove_action() вызывается раньше, чем исходный add_action(), ничего не произойдет. Решение простое: переносите код позже по цепочке загрузки или в тот же контекст, где hook уже зарегистрирован.
Путают action и filter
remove_action() не снимет filter, а remove_filter() не уберет action. Ошибка банальная, но встречается часто, особенно когда код копируют из чужого сниппета без проверки.
Удаляют не ту функцию
Имя callback должно совпадать полностью, включая namespace и класс. Если функция вызывается как array( $object, 'method' ), снять ее без доступа к тому же объекту не получится обычным способом.
Не учитывают приоритет
Иногда callback зарегистрирован с приоритетом 20, а вы снимаете его как будто он стоит на 10. В remove_action() приоритет должен совпадать с тем, который был в add_action().
Ломают кэш и делают вывод «нерабочим»
После правки код может быть уже исправлен, но вы все еще видите старую версию страницы из page cache, CDN или браузера. Перед выводом о результате очистите все уровни кэширования.
Безопасность и производительность: что не стоит делать
Не редактируйте код плагина напрямую, если это не одноразовая диагностика. Обновление затрет изменения, а вы получите повторную проблему через неделю. Для постоянных правок используйте дочернюю тему или mu-plugin.
Если у вас много точечных отключений, не распихивайте их по нескольким файлам без структуры. Лучше собрать все в один небольшой файл с комментариями: что отключено, почему и при каком условии. Это экономит время при отладке и снижает риск случайно удалить важную интеграцию.
Для типовых задач по чистке сайта и удалению лишнего технического мусора иногда удобнее использовать специализированный инструмент вроде Clearfy Pro, если вам нужен не только ручной код, но и набор готовых переключателей для SEO и оптимизации: https://wpshop.ru/plugins/clearfy. Но даже в этом случае полезно понимать, какой именно хук вы отключаете и зачем.
Короткий чек-лист перед выкладкой на прод
- Проверен точный callback и его приоритет.
- Код добавлен не в исходный плагин, а в дочернюю тему или mu-plugin.
- Проверены страницы, где отключение не должно сработать.
- Очистен page cache, object cache и CDN, если они есть.
- Проверен исходный HTML и консоль браузера.
- Нет новых ошибок в
debug.log.
Если после отключения лишнего хука сайт стал вести себя стабильнее, значит вы нашли не симптом, а источник. Дальше имеет смысл пройтись по соседним точкам: дублирующиеся подключения скриптов, лишние фильтры контента и автодобавления в wp_head и wp_footer. Именно там обычно прячется большая часть технического шума.