15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
22.10.2024

Как встроить твиты в WordPress: объяснение каждого метода

Встраивание твита в WordPress означает отображение живого, интерактивного поста Twitter непосредственно в содержимом страницы — с сохранением оригинального форматирования, медиафайлов, атрибуции автора и кнопок взаимодействия — без написания пользовательского JavaScript. WordPress обрабатывает это нативно через реализацию протокола oEmbed, который автоматически преобразует URL Twitter в полную разметку для встраивания на стороне сервера до того, как страница будет доставлена браузеру.

Это руководство подробно охватывает все поддерживаемые методы встраивания: блочный редактор Gutenberg, Classic Editor, прямое разрешение oEmbed URL, встраивание временной шкалы на основе widget.js от Twitter и подходы на основе плагинов — включая описание ситуаций, в которых каждый метод перестаёт работать, что означают изменения политики Twitter API для ваших встраиваний в 2024 году, и как обеспечить корректное отображение встроенного контента при недоступности внешнего сервиса.

Почему встраивание твитов работает: протокол oEmbed

Прежде чем рассматривать отдельные методы, понимание базового механизма поможет избежать многих часов отладки в будущем.

oEmbed — это открытый стандарт (определённый на oembed.com), который позволяет преобразовывать URL поддерживаемого провайдера в расширенную разметку для встраивания путём запроса к конечной точке обнаружения. WordPress поставляется со встроенным потребителем oEmbed начиная с версии 2.9. Когда вы вставляете URL Twitter в редактор, WordPress обращается к конечной точке oEmbed Twitter:

https://publish.twitter.com/oembed?url=<tweet_url>

Сервер Twitter возвращает JSON-ответ, содержащий поле html — элемент <blockquote> и тег <script>, загружающий widgets.js. WordPress кэширует этот ответ в таблице метаданных записей wp_oembed, чтобы избежать избыточных вызовов API при каждой загрузке страницы.

Важное следствие: Если конечная точка oEmbed Twitter недоступна, ограничена по частоте запросов или возвращает ошибку, WordPress отображает обычную гиперссылку. Это не ошибка WordPress — это ожидаемое резервное поведение oEmbed. Кэшированные встраивания продолжают отображаться до истечения срока действия кэша (TTL по умолчанию: 24 часа, управляется фильтром oembed_ttl).

Метод 1: Блочный редактор Gutenberg (рекомендуется)

Блочный редактор обеспечивает наиболее надёжный способ встраивания, поскольку проверяет URL и отображает живой предварительный просмотр на холсте редактора до публикации.

Шаг 1: Скопируйте URL твита

В Twitter (X) перейдите к твиту. Нажмите меню с тремя точками в правом верхнем углу карточки твита и выберите Копировать ссылку на публикацию. Формат URL:

https://twitter.com/<username>/status/<tweet_id>

или более новый вариант x.com:

https://x.com/<username>/status/<tweet_id>

Оба формата URL корректно обрабатываются обработчиком oEmbed WordPress. Не используйте сокращённые URL t.co — они требуют дополнительного шага разрешения перенаправления, который может незаметно завершиться ошибкой в некоторых серверных средах.

Шаг 2: Вставьте блок встраивания

В блочном редакторе WordPress нажмите кнопку вставки + и найдите Twitter или Встраивание. Выберите блок Twitter (в категории «Встраивания»). Появится поле для ввода URL.

Либо вставьте URL твита непосредственно в пустой блок абзаца. Gutenberg обнаружит шаблон URL Twitter и предложит автоматически преобразовать блок во встраивание — нажмите Встроить, когда появится подсказка.

Шаг 3: Вставьте URL и подтвердите

Вставьте URL твита в поле URL блока и нажмите Enter или кнопку Встроить. Gutenberg обращается к конечной точке oEmbed и отображает живой предварительный просмотр. Если в предварительном просмотре отображается «Извините, этот контент не удалось встроить», твит либо принадлежит защищённому аккаунту, был удалён, либо конечная точка Twitter вернула ошибку. Обновите редактор и повторите попытку, прежде чем считать URL недействительным.

После корректного отображения предварительного просмотра опубликуйте или обновите запись.

Метод 2: Classic Editor

Classic Editor использует тот же конвейер oEmbed, но URL должен быть размещён правильно для активации автоматического встраивания.

Правила активации автоматического встраивания

Класс WP_Embed WordPress сканирует содержимое записей на наличие URL, которые расположены на отдельной строке, окружены пробелами или разрывами абзацев, без окружающих тегов якоря или HTML-атрибутов. Если вы обернёте URL в гиперссылку (<a href="...">) или разместите его внутри предложения, автоматическое встраивание будет подавлено и URL отобразится как обычный текст.

На вкладке Визуальный Classic Editor вставьте URL твита на новую пустую строку. Не добавляйте никакого окружающего текста на той же строке.

На вкладке Текст (HTML) URL должен находиться между тегами <p> отдельно, вот так:

<p>https://twitter.com/username/status/1234567890123456789</p>

Нажмите Обновить или Опубликовать. На фронтенде отобразится встроенный твит; вкладка «Визуальный» Classic Editor может не показывать живой предварительный просмотр — это ожидаемое поведение.

Метод 3: Прямой oEmbed URL (программное встраивание)

Для разработчиков, создающих пользовательские шаблоны страниц или программно заполняющих контент, WordPress предоставляет функцию wp_oembed_get() и шорткод </code>.</p>
<h3>Использование <code>wp_oembed_get()</code></h3>
<pre class="ppt-code-block"><code class="language-php"><?php
$tweet_url = 'https://twitter.com/WordPress/status/1234567890123456789';
$embed_html = wp_oembed_get( $tweet_url, array( 'width' => 550 ) );
if ( $embed_html ) {
echo $embed_html;
} else {
echo '<a href="' . esc_url( $tweet_url ) . '">View tweet</a>';
}
?></code></pre>
<p>Ветка <code>else</code> обязательна в производственном коде. <code>wp_oembed_get()</code> возвращает <code>false</code> при ошибке — отображение ничего без резервного варианта создаёт невидимые пробелы в контенте, которые сбивают с толку как пользователей, так и поисковых роботов.</p>
<h3>Использование шорткода <code></code></h3>
<pre class="ppt-code-block"><code>https://twitter.com/username/status/1234567890123456789

Этот шорткод обрабатывается WP_Embed::shortcode() и следует той же логике кэширования и резервного поведения, что и конвейер автоматического встраивания.

Метод 4: Встраивание временной шкалы или виджета профиля Twitter

oEmbed для одного твита не применяется к временным шкалам. Для полной временной шкалы профиля, временной шкалы списка или коллекции хэштегов требуется виджет Embedded Timelines от Twitter, генерируемый через инструмент публикации Twitter.

Шаг 1: Сгенерируйте код виджета

Перейдите на publish.twitter.com. Введите один из следующих форматов URL в поле ввода:

Тип контентаФормат URL
Временная шкала профиляhttps://twitter.com/username
Временная шкала спискаhttps://twitter.com/username/lists/listname
Понравившиеся твитыhttps://twitter.com/username/likes
Поиск по хэштегуhttps://twitter.com/hashtag/keyword
Моментhttps://twitter.com/i/moments/moment_id

Выберите Embedded Timeline, затем нажмите Set customization options, чтобы настроить ширину, высоту, тему (светлая/тёмная) и язык. Нажмите Copy Code.

Сгенерированный код выглядит следующим образом:

<a class="twitter-timeline"
   data-width="600"
   data-height="800"
   data-theme="dark"
   href="https://twitter.com/username">
  Tweets by username
</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Шаг 2: Добавьте код в WordPress

В Gutenberg добавьте блок Произвольный HTML в нужное место и вставьте код встраивания напрямую.

В Classic Editor переключитесь на вкладку Текст (не Визуальный) и вставьте код в позицию курсора. Если вставить на вкладке «Визуальный», HTML-санитайзер редактора может удалить тег <script>, полностью нарушив работу виджета.

Важно: Тег скрипта widgets.js должен появляться на странице только один раз. Если вы встраиваете несколько виджетов Twitter на одной странице, включайте тег <script> только с первым виджетом и опускайте его в последующих, чтобы избежать избыточной загрузки скриптов и потенциальных состояний гонки при отображении.

Сравнение методов

МетодРедакторТребует вызова APIОтображает предварительный просмотр в редактореЛучше всего подходит для
Блок Twitter (oEmbed)GutenbergДаДаОдиночные твиты, стандартные записи
Автоматическое встраивание URLClassic EditorДаНетБыстрое встраивание, устаревшие конфигурации
wp_oembed_get()PHP/ШаблоныДаН/ДПользовательские темы, программный контент
Шорткод ОбаДаЧастичноКонструкторы страниц на основе шорткодов
Произвольный HTML (widget.js)ОбаНет (на стороне клиента)НетВременные шкалы, ленты хэштегов, виджеты профиля
Встраивание через плагинОбаВарьируетсяВарьируетсяРасширенная курация, обработка резервных вариантов

Изменения Twitter API и их влияние на встраивания в WordPress

После перехода Twitter на платформу X и реструктуризации уровней доступа к API в 2023 году произошли изменения, которые непосредственно влияют на встраивания в WordPress:

Доступность конечной точки oEmbed: Конечная точка publish.twitter.com/oembed остаётся общедоступной без аутентификации для встраивания одиночных твитов. Однако ограничение частоты запросов стало более агрессивным. Сайты с высокой посещаемостью, которые часто инвалидируют кэш oEmbed (например, сбрасывая объектный кэш WordPress при каждом развёртывании), могут получать ответы HTTP 429, из-за чего встраивания деградируют до обычных ссылок.

Производительность загрузки widgets.js: Скрипт platform.twitter.com/widgets.js загружается асинхронно, но всё равно создаёт зависимость от стороннего ресурса, блокирующую отображение. Для оптимизации Core Web Vitals рассмотрите его загрузку с атрибутом defer или использование паттерна фасада (статический скриншот-заглушка, загружающий реальный виджет только при взаимодействии пользователя).

Защищённые и удалённые твиты: После удаления твита или перевода аккаунта в режим защиты конечная точка oEmbed возвращает 404. WordPress кэширует этот ответ 404, то есть встраивание не восстановится автоматически, даже если твит будет позднее восстановлен. Необходимо вручную очистить кэш oEmbed записи, удалив соответствующие записи метаданных _oembed_* из базы данных или используя плагин, например Oembed Reset.

Совместимость URL X.com: Список провайдеров oEmbed WordPress был обновлён для распознавания URL x.com в дополнение к URL twitter.com в WordPress 6.4. Если вы используете более старую версию WordPress, URL x.com не будут автоматически встраиваться — используйте вместо них формат URL twitter.com.

Встраивание через плагины: когда это нужно

Нативного oEmbed достаточно для большинства случаев использования. Рассмотрите специализированный плагин, если вам необходимо:

  • Резервное отображение при недоступности конечной точки Twitter (плагины могут кэшировать статический скриншот)
  • Курация твитов — отображение подобранного набора твитов по ID без зависимости от живого виджета временной шкалы
  • Отложенная загрузка с соблюдением GDPR — откладывание запроса widgets.js до тех пор, пока пользователь явно не даст согласие на сторонний контент
  • Пользовательские стили, переопределяющие стандартный внешний вид карточки Twitter

Популярные варианты включают Smash Balloon Twitter Feed (для курации временной шкалы с локальным кэшированием) и Embed Social (для мультиплатформенных социальных лент). Оба полностью обходят конвейер oEmbed и используют собственные интеграции с API.

Производительность и SEO

Отложенная загрузка виджетов Twitter: Скрипт widgets.js добавляет примерно 150–200 КБ к полезной нагрузке страницы и инициирует несколько дополнительных сетевых запросов. Используйте Intersection Observer API или платформу управления согласием для отложенной загрузки до момента появления виджета в области просмотра.

Структурированные данные: Встроенные твиты не генерируют разметку Schema.org автоматически. Если твит содержит цитату или фактическое утверждение, на которое вы ссылаетесь, добавьте <blockquote> с itemscope и itemtype="https://schema.org/Quotation" вокруг встраивания для семантической ясности.

Доступность: Встроенный виджет Twitter включает роли ARIA, но заголовок iframe по умолчанию содержит общую строку. Переопределите его с помощью атрибута data-aria-label в теге <a> в коде встраивания временной шкалы для лучшей совместимости со скринридерами.

Политика безопасности контента (CSP): Если ваша установка WordPress применяет строгий заголовок CSP, необходимо добавить platform.twitter.com и cdn.syndication.twimg.com в белый список в директивах script-src и frame-src. Несоблюдение этого требования незаметно блокирует виджет без каких-либо видимых ошибок в административной панели WordPress.

Если ваш сайт WordPress работает в среде VPS Хостинга, где вы управляете заголовками на уровне сервера, вы можете добавить директивы CSP непосредственно в конфигурацию Nginx или Apache, не прибегая к плагину. Это даёт вам точный контроль над тем, каким сторонним источникам разрешено выполнять скрипты на ваших страницах.

Для сайтов, использующих VPS с cPanel, заголовки CSP можно настроить через редактор правил ModSecurity или добавив директивы Header set Content-Security-Policy в файл .htaccess в директории public_html домена.

Очистка кэша oEmbed

Когда встраивание твита перестаёт корректно отображаться, наиболее распространённой причиной является устаревший или закэшированный ответ с ошибкой oEmbed. WordPress хранит данные oEmbed в виде метаданных записей с ключами, начинающимися с _oembed_. Для очистки кэша конкретной записи:

DELETE FROM wp_postmeta
WHERE post_id = <your_post_id>
AND meta_key LIKE '_oembed_%';

Выполните этот запрос через phpMyAdmin, WP-CLI или ваш инструмент управления базой данных. После очистки при следующей загрузке страницы данные oEmbed будут повторно получены с конечной точки Twitter.

С помощью WP-CLI можно более безопасно обратиться к конкретной записи:

wp post meta delete <post_id> --all --match="_oembed_*"

Или сбросить все кэши oEmbed на всём сайте (используйте с осторожностью на крупных сайтах):

wp eval 'global $wpdb; $wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE "_oembed_%"");'

Для команд, запускающих WordPress на Выделенных серверах, планирование этой команды WP-CLI в качестве задания cron после каждого развёртывания гарантирует, что устаревшие кэши встраиваний не сохранятся между обновлениями контента.

Особенности хостинговой среды

Надёжность встраивания твитов напрямую зависит от способности вашего сервера выполнять исходящие HTTP-запросы к publish.twitter.com. Несколько конфигураций хостинга могут незаметно блокировать эти запросы:

  • Правила брандмауэра, ограничивающие исходящие соединения на нестандартных портах или определёнными диапазонами IP
  • Директивы PHP disable_functions, блокирующие curl_exec() или file_get_contents() с внешними URL
  • allow_url_fopen = Off в php.ini, что препятствует использованию резервного варианта с обёрткой потока HTTP API WordPress
  • Среды общего хостинга с агрессивным ограничением исходящих запросов

На тарифах Общего веб-хостинга, если oEmbed постоянно не работает, убедитесь, что allow_url_fopen включён в вашей конфигурации PHP и что cURL доступен. Проверить оба параметра можно в административной панели WordPress в разделе Инструменты > Состояние сайта > Информация > Сервер.

Если ваш сайт также обрабатывает транзакционную электронную почту или контент рассылок со ссылками на встроенные твиты, убедитесь, что ваша среда Почтового хостинга настроена отдельно от веб-сервера, чтобы избежать конкуренции за ресурсы в периоды высокой нагрузки.

SSL и смешанный контент

Если ваш сайт WordPress работает по HTTPS (что обязательно для любого современного развёртывания), встроенные iframe твитов также должны загружаться по HTTPS. Конечная точка oEmbed Twitter и widgets.js обслуживаются исключительно по HTTPS, поэтому со стандартными встраиваниями это обычно не является проблемой.

Однако если вы вручную создаёте HTML для встраивания или используете старый кэшированный embed, ссылающийся на URL http://, браузеры заблокируют iframe как смешанный контент. Проверьте содержимое ваших записей на наличие ссылок http://platform.twitter.com и замените их на https://. Для сайтов с правильно настроенными SSL-сертификатами этот сценарий со смешанным контентом является наиболее распространённой причиной отображения встраиваний в виде пустых блоков в продакшене, тогда как в административной панели WordPress они отображаются корректно (доступ к которой может осуществляться по HTTP в неправильно настроенных конфигурациях).

Контрольный список технических решений

Используйте эту матрицу для выбора правильного подхода к встраиванию для вашего конкретного сценария:

  • Одиночный твит, редактор Gutenberg, без пользовательского кода: Используйте блок встраивания Twitter — вставьте URL, подтвердите предварительный просмотр, опубликуйте.
  • Одиночный твит, Classic Editor: Вставьте URL twitter.com/status/ на отдельной строке на вкладке «Визуальный»; убедитесь на вкладке «Текст», что он не обёрнут в тег якоря.
  • Одиночный твит, PHP-шаблон или пользовательский тип записи: Используйте wp_oembed_get() с явным резервным вариантом для возвращаемых значений false.
  • Временная шкала профиля или лента хэштегов: Сгенерируйте код виджета на publish.twitter.com, вставьте через блок «Произвольный HTML» в Gutenberg или вкладку «Текст» в Classic Editor.
  • Сайт с высокой посещаемостью и частыми сбросами кэша: Реализуйте постоянное объектное кэширование (Redis или Memcached) для снижения частоты вызовов oEmbed API и предотвращения ограничения частоты запросов.
  • Аудитория, чувствительная к GDPR: Используйте плагин с загрузкой виджета, управляемой согласием; не загружайте widgets.js до получения явного согласия пользователя.
  • Встраивание перестало отображаться после удаления твита: Очистите метаданные _oembed_* для затронутой записи и замените статическим скриншотом или удалите встраивание.
  • Заголовок CSP блокирует виджеты: Добавьте platform.twitter.com и cdn.syndication.twimg.com в белый список в директивах script-src и frame-src на уровне сервера.
  • URL x.com не встраиваются: Перейдите на формат URL twitter.com, если используете WordPress старше версии 6.4, или обновите ядро WordPress.

Часто задаваемые вопросы

Почему мой встроенный твит отображается как обычная ссылка, а не как карточка?

Запрос oEmbed WordPress к конечной точке Twitter завершился ошибкой или вернул ошибку, и WordPress закэшировал этот сбой. Очистите метаданные _oembed_* для затронутой записи, убедитесь, что ваш сервер может выполнять исходящие HTTPS-запросы к publish.twitter.com, и проверьте, что твит не был удалён или переведён в режим приватности.

Влияет ли встраивание твитов на скорость загрузки страницы?

Да. Скрипт widgets.js Twitter занимает примерно 150–200 КБ и инициирует дополнительные запросы к cdn.syndication.twimg.com. Снизьте это влияние, отложив загрузку скрипта с помощью Intersection Observer или используя статический фасад, загружающий живой виджет только при взаимодействии пользователя.

Можно ли встраивать твиты из защищённых (приватных) аккаунтов?

Нет. Конечная точка oEmbed Twitter возвращает 404 для твитов из защищённых аккаунтов, независимо от статуса подписки вашего собственного аккаунта. Поддерживаемого обходного пути не существует — необходимо использовать скриншот с надлежащей атрибуцией.

Что происходит со встроенными твитами, если конечная точка oEmbed Twitter недоступна?

WordPress обслуживает кэшированный HTML встраивания до 24 часов (TTL по умолчанию). После истечения срока кэша встраивание деградирует до обычной гиперссылки до восстановления работы конечной точки. Чтобы увеличить TTL кэша, добавьте следующее в файл functions.php вашей темы:

add_filter( 'oembed_ttl', function( $ttl ) {
    return 7 * DAY_IN_SECONDS; // Cache for 7 days
} );

Учитываются ли встроенные твиты в лимитах API Twitter?

Конечная точка oEmbed (publish.twitter.com/oembed) отделена от Twitter v2 API и не потребляет токены API и не учитывается в лимитах частоты запросов уровня разработчика. Однако она подчиняется собственным недокументированным лимитам частоты запросов на основе IP-адреса, что может влиять на сайты с высокой посещаемостью, которые часто инвалидируют кэш oEmbed WordPress.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать