Обходчик греет то, что есть в его перечне. Если перечень составлен руками — «главная, каталог, типы записей такие-то», — он устаревает с первой же новой рубрикой. Гарантия «никогда MISS» начинается с того, что перечень выводится сам.
Это двадцать восьмая часть цикла «Кэш страниц без MISS».
Что пропадает при ручном перечне
На двух сайтах одной темы в перечне не оказалось архива каталога — самой главной страницы после главной. Перечислены были типы записей и рубрики, а архив типа (has_archive) — нет. Ни один список, составленный руками, не знал, что такая страница существует.
Три источника
- Перечисление из WordPress: публичные типы записей (только те, у которых есть свои страницы), все архивы типов с пагинацией, все таксономии с непустыми терминами, страница блога.
- Карта сайта (Yoast или встроенная в ядро) — ловит то, что перечисление пропустило.
- Самоочистка по коду ответа — адреса, которые отвечают редиректом или 404, запоминаются как мёртвые и больше не греются; у редиректа греется цель.
foreach (get_post_types(['public' => true], 'objects') as $type) {
// у типа без своих страниц get_permalink рисует ссылку на 404
if (!$type->publicly_queryable && $type->name !== 'page') {
continue;
}
if ($type->has_archive) {
$paths[] = wp_make_link_relative(get_post_type_archive_link($type->name));
}
// + все записи этого типа
}
Самоочистка: что запоминать
| Ответ | Что делать |
|---|---|
| 301, 302, 308 | запомнить как мёртвый, прогреть цель редиректа |
| 404, 410 | запомнить как мёртвый |
| 5xx, таймаут, нет ответа | не запоминать — только посчитать |
Пятисотку не запоминать. Сначала мы записывали в мёртвые любой неуспешный ответ — навсегда. Одна ошибка при перезапуске PHP вычеркнула бы живую страницу из прогрева, а при кэше на неделю это холодный рендер посетителю. Теперь запись о мёртвом адресе живёт месяц, а временные сбои только считаются.
Цифры
- тестовая копия: из 63 адресов живых 37, отброшено 26 — из них 25 давали 404 у служебного типа записи;
- рабочий сайт: 90 адресов, карта сайта дала 119, из них 37 — мусор;
- на другом сайте за первый час самоочистка поймала 7 адресов, карта сайта дала 327.
Бонус: отчёт о мусоре в карте сайта
Список мёртвых адресов — готовый отчёт для SEO. На одном сайте Yoast публиковал в карте около 33 адресов, которые отвечали 404.
Грабли
- Карту сайта берите из кэша и обновляйте отдельным кроном. Сначала мы собирали её прямо в запросе выката — до шести HTTP-запросов по 15 секунд. Запрос не доживал до постановки очереди, и в кэше оставался 1 файл.
- Событие круга ставьте до сбора адресов, а не после: если сбор упадёт, круг всё равно состоится.
- Служебные типы — в исключения отдельным списком.
- Потолок списка мёртвых — с запасом: одна волна дала 472 мусорных адреса, а потолок был 500.
Не уверены, что прогрев видит все страницы?
Пришлите адрес — сверю перечень обхода с тем, что реально есть на сайте.
// загружаю комментарии…