Инструкция по pre_http_request для Yoast SEO Premium

Инструкция по pre_http_request для Yoast SEO Premium

Проблема

Yoast SEO Premium отправляет HTTP-запросы к внешним ресурсам на yoast.com. На российских хостингах этот домен часто заблокирован, что приводит к зависанию страниц админки WordPress на 1–10 секунд.

Симптомы

  • wp-admin/edit.php, wp-admin/post.php, wp-admin/post-new.php — долгая загрузка (1–10+ с)
  • Chrome DevTools → Network: запросы к yoast.com с transferSize:0 или (failed), duration > 1000 ms
  • wp-admin/plugins.php, wp-admin/admin.php?page=wpseo_dashboard — аналогичные тормоза
  • Query Monitor / New Relic: медленные HTTP API-запросы, уходящие на yoast.com

Корневые причины

  1. Draft.js Emoji Picker — Yoast Premium грузит внешний скрипт emoji picker с yoast.com/emoji-picker/... при каждом открытии редактора поста/списка постов.
  2. HelpScout Beacon — виджет саппорта загружается с beacon-v2.helpscout.net, тоже заблокирован из РФ.
  3. Orphaned / Cornerstone COUNT-запросы — на страницах списков выполняются тяжёлые COUNT-запросы для orphaned и cornerstone-постов всех post types.
  4. Прочие HTTP-запросы к yoast.com — лицензионные проверки, проверка обновлений, телеметрия — все блокируются и добавляют задержку.

Решение: четыре фикса в functions.php темы

Все фиксы — в functions.php темы. Они переживают обновление плагина Yoast. НЕ патчить файлы плагина напрямую.

  1. add_filter( 'wpseo_premium_load_emoji_picker', '__return_false' ); — отключает Draft.js Emoji Picker.
  2. add_filter( 'wpseo_helpscout_show_beacon', '__return_false' ); — отключает HelpScout Beacon.
  3. add_filter( 'Yoast\WP\SEO\orphaned_post_types', '__return_empty_array', PHP_INT_MAX ); + add_filter( 'wpseo_cornerstone_post_types', '__return_empty_array', PHP_INT_MAX ); — отключает тяжёлые COUNT-запросы orphaned/cornerstone.
  4. add_filter( 'pre_http_request', ... ); — блокирует ВСЕ HTTP-запросы к yoast.com, my.yoast.com, my-yoast.com. Возвращает WP_Error — Yoast получает ошибку вместо таймаута и продолжает работу (graceful degradation).

Дополнительная проблема: sitemap 404 — XML-карта сайта не генерируется

Симптомы

  • /sitemap_index.xml возвращает 404.
  • В админке Yoast → Настройки → Карта сайта: переключатель «XML-карта сайта» — в положении «включено» (зелёный).
  • Проверка через SSH: get_option('wpseo')['enable_xml_sitemap'] — возвращает string(1) "1".

Корневая причина

Опция enable_xml_sitemap хранится в БД как строка "1", а не как boolean true. В файле wp-content/plugins/wordpress-seo/wp-seo-main.php:354 Yoast использует строгое сравнение:

if ( WPSEO_Options::get( 'enable_xml_sitemap', null, [ 'wpseo' ] ) === true ) {
	$GLOBALS['wpseo_sitemaps'] = new WPSEO_Sitemaps();
}

"1" === truefalse → класс WPSEO_Sitemaps не загружается → динамические rewrite-правила Yoast не регистрируются → sitemap отдаёт 404.

Почему админка показывает sitemap включённым: в админке Yoast используется нестрогое сравнение (==), поэтому "1" == truetrue — переключатель в положении «включено». Расхождение между админкой и реальным поведением сбивает с толку.

Исправление

Привести опцию к boolean и сбросить rewrite-правила. Выполнить через SSH или WP CLI:

wp eval "
\$wpseo = get_option( 'wpseo', [] );
\$wpseo['enable_xml_sitemap'] = true;
update_option( 'wpseo', \$wpseo );
global \$wp_rewrite;
\$wp_rewrite->flush_rules( true );
"

Проверка после исправления:

# Должен вернуть bool(true)
wp eval "var_dump( WPSEO_Options::get( 'enable_xml_sitemap', null, [ 'wpseo' ] ) === true );"

# Должны появиться sitemap-правила
wp rewrite list | grep sitemap

Ожидаемые rewrite-правила после исправления:

  • sitemap_index\.xml$index.php?sitemap=1
  • ([^/]+?)-sitemap([0-9]+)?\.xml$index.php?sitemap=$matches[1]&sitemap_n=$matches[2]
  • ([a-z]+)?-?sitemap\.xsl$index.php?yoast-sitemap-xsl=$matches[1]

Важно: эта проблема не связана с блокировкой pre_http_request. Это отдельный баг — тип опции в БД. Может проявиться на любом хостинге, не только на российском.

Напоминалка при обновлении плагина

На странице wp-admin/plugins.php над каждой строкой Yoast (WordPress SEO и Yoast SEO Premium) отображается красная плашка-напоминание с текстом:

⚠ При обновлении плагина Yoast не забудьте внести фикс pre_http_request, иначе в админке будут тормоза

CSS-класс плашки: mlab-yoast-warn. Кастомизация — через admin.css.

Диагностика (если проблема сохраняется)

  1. Chrome DevTools → Network: фильтр по домену yoast.com. Есть ли запросы? transferSize:0 = блокировка.
  2. WP CLI: wp eval "var_dump(has_filter('pre_http_request'));" — должен вернуть bool(true).
  3. WP CLI: wp eval "var_dump(apply_filters('wpseo_premium_load_emoji_picker', true));" — должен вернуть bool(false).
  4. Query Monitor: HTTP API Calls — нет запросов к yoast.com.
  5. WP Debug Log: define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); — нет cURL timeout-ошибок на yoast.com.

Примечания

  • Все фиксы — в functions.php темы. Они переживают обновление плагина Yoast. НЕ патчить файлы плагина напрямую.
  • pre_http_request возвращает WP_Error — Yoast получает ошибку вместо таймаута и продолжает работу (graceful degradation).
  • Если Yoast обновился и админка снова тормозит — проверить, что фильтры на месте: grep pre_http_request functions.php.
  • Фильтр orphaned_post_typesPHP_INT_MAX приоритет, чтобы перебить любые фильтры плагина.
  • Если на хосте НЕТ блокировки yoast.com (западный сервер) — pre_http_request фильтр не обязателен, но emoji picker + HelpScout всё равно стоит отключить (лишние внешние зависимости).