Верх страницы
Обложка к записи Чиним карту сайта Yoast SEO на огромном WordPress сайте
Время для прочтения: 0 мин. 11 сек.

Чиним карту сайта Yoast SEO на огромном WordPress сайте

Недавно один из моих клиентов пришёл ко мне с такой проблемой: карта сайта, которая генерируется плагином Yoast SEO ломается на их огромном высоконагруженном WordPress сайте.

Yoast SEO разбивает карту сайта на несколько отдельных кусков. На этом сайте отдельные куски успешно создаются, а вот общий индексный файл — нет, скрипту просто не хватает времени на все эти операции. Это влечёт за собой другую проблему — поисковые системы не видят карту сайта.

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

Учитывая, что сайт имеет десятилетний опыт, можно легко предположить, почему карта сайт ломается: из-за огромного количества записей сервер шлёт скрипт далеко и надолго, потому что тот не успевает выполнить свои задачи за отведённые ему 30 секунд.

Увеличиваем таймаут до 120 секунд — всё плохо.

Увеличиваем таймаут до 300 секунд. Пять грёбаных минут, Карл!

Стало немного получше.

Если и дальше увеличивать таймаут, то это чревато тем, что сервер рано или поздно ляжет совсем.

Решение

Yoast SEO не имеет (пока) WP-CLI (WordPress command line interface) команд, но мы же можем использовать wp eval для запуска произвольного PHP кода в инфраструктуре WordPress.

После глубокого анализа исходного кода плагина Yoast SEO был найден PHP класс и его методы для вывода индексной карты сайта (та, что содержит ссылки на другие карты).

Пробуем запусить процесс через wp eval:

wp eval '
$sm = new WPSEO_Sitemaps;
$sm->build_root_map();
$sm->output();
'

Выполнение задачи заняло небольшое количество времени и индексный файл был успешно получен. Значит, мы пошли правильным путём.

Теперь вешаем всё это добро на крон с выводом результата в статический файл:

0 3 * * * cd /srv/www/example.com && /usr/local/bin/wp eval '$sm = new WPSEO_Sitemaps;$sm->build_root_map();$sm->output();' > /srv/www/example.com/wp-content/uploads/sitemap_index.xml

Финальным шагом меняем конфигурацию веб-сервера Nginx таким образом, чтобы ботам, которые пытаются получить файл sitemap_index.xml в корне сайта, отдавалась его статическая версия из папки uploads, куда его кладёт наш крон:

location ~ ([^/]*)sitemap(.*).x(m|s)l$ {
    rewrite ^/sitemap.xml$ /sitemap_index.xml permanent;
    rewrite ^/([a-z]+)?-?sitemap.xsl$ /index.php?xsl=$1 last;
    rewrite ^/sitemap_index.xml$ /wp-content/uploads/sitemap_index.xml last;
    rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
}

Теперь роботы поисковых систем рады, так как им больше не нужно ждать по 5 минут завершения процесса генерации карты сайта, а сам сайт не прикладывается поспать в это время, так как крон запускает скрипт в отдельном PHP процессе пактически без ограничений.

А клиент счастлив, что ему нет необходимости менять SEO плагин и его бизнес спасён.

Отдельная благодарность WP-CLI за чуточку магии.

Ссылки

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

9 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Артём
Артём
5 лет назад

Данный метод больше не работает? Версия плагина 9+. Удивительно что до сих пор никто не сделал адекватного решения для генерации статической карты сайта запускаемый через крон. Ведь это значительно снизило бы нагрузку на сайт и по хорошему такое решение должно быть в ядре движка, как к примеру у DLE.

Артём
Артём
5 лет назад

WordPress 4.9.8 + Yoast SEO 9.2.1 + WP CLI 2.0.1 (PHP 7+)

Проверил на 5 разных сайтах, которые установлены на разные сервера, с хостинг панелью и без. Сайты с 10-20 постами и сайты с 300к+ постов. Ошибка одна и та же на всех ресурсах:

Warning: Invalid argument supplied for foreach() in /srv/www/wordpress/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php on line 359

Артём
Артём
5 лет назад
Ответить на  Кобзарёв Михаил

Благодарю, так похоже что работает, буду тестировать на сайте с 300к+ постов.

Артём
Артём
5 лет назад
Ответить на  Кобзарёв Михаил

На сайте с > 320 000 постов, генерирует карту за 20 секунд, правда сервер очень мощный. Отдает карту моментально, но оно и понятно, а вот если открыть внутри ссылку на другую карту (/post-sitemap283.xml), то её генерирует отдельно 5-10 сек. В любом случае лучше делать конечно же так, запускаю в крон 1 раз в час. Если будут интересные новости или наблюдения через какое-то время, то отпишусь.

В любом случае спасибо за метод.

Предыдущая запись

Давайте дружить
в Telegram

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы