Недавно один из моих клиентов пришёл ко мне с такой проблемой: карта сайта, которая генерируется плагином 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 за чуточку магии.
Ссылки
Источник: https://www.kobzarev.com/wordpress/yoast-seo-sitemaps-fixed/