Инструкция по 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
Корневые причины
- Draft.js Emoji Picker — Yoast Premium грузит внешний скрипт emoji picker с
yoast.com/emoji-picker/...при каждом открытии редактора поста/списка постов. - HelpScout Beacon — виджет саппорта загружается с
beacon-v2.helpscout.net, тоже заблокирован из РФ. - Orphaned / Cornerstone COUNT-запросы — на страницах списков выполняются тяжёлые COUNT-запросы для orphaned и cornerstone-постов всех post types.
- Прочие HTTP-запросы к yoast.com — лицензионные проверки, проверка обновлений, телеметрия — все блокируются и добавляют задержку.
Решение: четыре фикса в functions.php темы
Все фиксы — в functions.php темы. Они переживают обновление плагина Yoast. НЕ патчить файлы плагина напрямую.
add_filter( 'wpseo_premium_load_emoji_picker', '__return_false' );— отключает Draft.js Emoji Picker.add_filter( 'wpseo_helpscout_show_beacon', '__return_false' );— отключает HelpScout Beacon.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.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" === true → false → класс WPSEO_Sitemaps не загружается → динамические rewrite-правила Yoast не регистрируются → sitemap отдаёт 404.
Почему админка показывает sitemap включённым: в админке Yoast используется нестрогое сравнение (==), поэтому "1" == true → true — переключатель в положении «включено». Расхождение между админкой и реальным поведением сбивает с толку.
Исправление
Привести опцию к 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.
Диагностика (если проблема сохраняется)
- Chrome DevTools → Network: фильтр по домену
yoast.com. Есть ли запросы?transferSize:0= блокировка. - WP CLI:
wp eval "var_dump(has_filter('pre_http_request'));"— должен вернутьbool(true). - WP CLI:
wp eval "var_dump(apply_filters('wpseo_premium_load_emoji_picker', true));"— должен вернутьbool(false). - Query Monitor: HTTP API Calls — нет запросов к yoast.com.
- 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_types—PHP_INT_MAXприоритет, чтобы перебить любые фильтры плагина. - Если на хосте НЕТ блокировки yoast.com (западный сервер) — pre_http_request фильтр не обязателен, но emoji picker + HelpScout всё равно стоит отключить (лишние внешние зависимости).