oEmbed в WordPress удобно работает до тех пор, пока сайт не начинает тянуть лишние запросы, подставлять предпросмотр чужих ссылок и раздувать фронтенд ненужными скриптами. На небольшом блоге это почти незаметно, а на контентном сайте с десятками публикаций и внешними вставками уже появляется повод отключить часть механики и оставить только то, что реально используется.
Ниже разберём, что именно отключать, как не сломать редактор и как проверить, что WordPress больше не генерирует лишние oEmbed-эндпоинты и автоподключения.
Когда oEmbed действительно мешает
Проблема обычно проявляется не в одном месте, а сразу в нескольких:
- в исходном коде страниц остаётся подключение
wp-embed.min.js, хотя встраивания с WordPress-сайтов не используются; - в
<head>есть ссылки на oEmbed endpoint и discovery; - редактор Gutenberg продолжает грузить предпросмотр встраиваемого контента, хотя на сайте это не нужно;
- на старых темах и кэширующих плагинах появляются лишние запросы к REST и embed-ресурсам;
- внутренние ссылки иногда превращаются в предпросмотр карточки, что мешает чистой верстке.
Важно не путать отключение oEmbed на фронтенде с полной поломкой встраиваний в админке. Если вы публикуете посты с YouTube, ВК, RuTube или другими сервисами, это отдельная история: WordPress всё равно может вставлять внешние блоки через редактор, а вот автоподдержка oEmbed для ссылок WordPress-сайтов вам может быть не нужна.
Диагностика: что именно сейчас подключено
Перед изменениями проверьте страницу в браузере и исходный код. Ищите такие признаки:
wp-embed.min.jsвнизу страницы;link rel="alternate" type="application/json+oembed"в<head>;link rel="alternate" type="text/xml+oembed"в<head>;- в консоли Network запросы к
/wp-json/oembed/1.0/embed; - в редакторе при вставке ссылки WordPress-поста появляется блок предпросмотра.
Если у вас установлен плагин оптимизации, сначала проверьте его настройки. Иногда oEmbed уже отключён частично, а ручной код только создаст конфликт и усложнит отладку.
Как отключить oEmbed безопасно
Есть три практических варианта: плагин, код в теме или mu-plugin. Для продакшена чаще всего удобнее код в mu-plugins или в дочерней теме, если вы точно контролируете обновления.
| Способ | Плюсы | Минусы | Когда выбирать |
|---|---|---|---|
| Плагин оптимизации | Быстро, без правки кода | Может отключать лишнее вместе с нужным | Если нужен интерфейс и уже есть такой плагин |
| Код в теме | Прозрачно, легко проверить | Слетит при смене темы | Если тема дочерняя и вы ведёте код сами |
| mu-plugin | Не зависит от темы, всегда загружается | Нужно один раз создать файл | Если это системная настройка сайта |
Вариант с кодом: отключаем автоподключение и discovery
Добавьте в functions.php дочерней темы или в отдельный mu-plugin такой код:
<?php
/**
* Disable oEmbed frontend extras.
*/
add_action( 'init', function () {
// Убираем автоподключение скрипта wp-embed.
wp_deregister_script( 'wp-embed' );
} );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
add_filter( 'embed_oembed_discover', '__return_false' );
add_filter( 'oembed_response_data', function ( $data ) {
return $data;
} );На практике достаточно первых трёх строк: снятие скрипта и удаление discovery-ссылок из <head>. Последний фильтр здесь не обязателен и приведён только как пример того, что не стоит пытаться «ломать всё подряд» без понимания, что именно используется на сайте.
Если нужен mu-plugin
Создайте файл, например wp-content/mu-plugins/disable-oembed.php. Если папки mu-plugins нет, её можно создать вручную. Содержимое файла:
<?php
/**
* Plugin Name: Disable oEmbed extras
*/
add_action( 'init', function () {
wp_deregister_script( 'wp-embed' );
} );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );Этот вариант хорош тем, что не зависит от темы и не исчезнет после обновления шаблона.
Что делать, если нужен только фронтенд без редактора
Иногда задача не в полном отключении oEmbed, а в том, чтобы убрать только фронтенд-скрипт и лишние теги, но оставить предпросмотр в админке. Тогда не трогайте всё подряд через глобальные фильтры. Ограничьтесь снятием wp-embed на публичной части сайта и проверьте, не ломаются ли блоки в редакторе.
Если у вас кастомная тема, можно дополнительно проверить, не подключает ли она свой собственный JS для embed-карточек. Встречается редко, но именно такие дубли потом сложно искать, если смотреть только на WordPress-ядро.
Проверка результата после внедрения
После правки откройте любую публичную страницу и проверьте три вещи:
- В исходном коде нет
wp-embed.min.js. - В
<head>отсутствуют oEmbed discovery-ссылки. - В Network нет запросов к
/wp-json/oembed/1.0/embedпри обычной загрузке страницы.
Дополнительно откройте редактор записи и вставьте ссылку на внутреннюю публикацию WordPress. Если предпросмотр не нужен и не появляется — значит отключение сработало. Если нужен, а он пропал, вы отключили лишнее и надо вернуть часть кода.
Для быстрой проверки можно использовать поиск по исходнику страницы через DevTools или команду вроде curl:
curl -s https://example.com/ | grep -E "wp-embed|oembed|embed"Если сайт отдаёт кэш, не забудьте очистить его до проверки. Иначе вы будете смотреть на старую версию страницы и решите, что код не работает.
Частые ошибки и как их исправить
Отключили oEmbed через плагин и сломали редактор
Так бывает, когда плагин убирает не только фронтенд, но и часть редакторских возможностей. Решение простое: переносите настройку в код и отключайте только то, что реально видно на сайте, а не всё подряд.
Сняли скрипт, но теги в head остались
Это значит, что убрали только wp-embed, но не удалили действия wp_oembed_add_discovery_links и wp_oembed_add_host_js. Для чистого результата нужны оба шага.
Проверяли без очистки кэша
Очень частая причина ложного вывода. После изменений очистите кэш плагина, серверный кэш и, если есть, CDN. Иначе в исходнике останется старая версия.
Добавили код в родительскую тему
После обновления темы настройка исчезнет. Для постоянных технических правок используйте дочернюю тему или mu-plugin.
Практические советы по безопасности и производительности
Если вы уже чистите oEmbed, имеет смысл заодно проверить, не держится ли сайт на случайных технических хвостах. На практике полезно:
- не отключать функциональность «на глаз», а сначала смотреть исходный код и Network;
- не смешивать в одном фрагменте кода отключение oEmbed, REST и XML-RPC, если задача касается только встраиваний;
- хранить такие правки отдельно от дизайна темы;
- после изменений прогонять хотя бы одну реальную публикацию с внутренней ссылкой и одну обычную страницу без встраиваний.
Если вы регулярно чистите сайт от технического мусора, удобно держать такие настройки в одном месте. Для этого подойдут инструменты уровня Clearfy Pro: там проще централизованно отключать лишние элементы, чем разносить все мелкие правки по теме и плагинам. Но даже в этом случае проверка исходника и Network остаётся обязательной.
В итоге отключение oEmbed имеет смысл только тогда, когда вы понимаете, что именно убираете. Если на сайте нет нужды в автопредпросмотре ссылок WordPress и вам важнее чистый фронтенд, это аккуратная и безопасная оптимизация. Если же редактор активно использует встраивания, отключайте только фронтенд-часть и тестируйте на реальных записях, а не на пустой странице.
}