Сбросы кэша приходят из двух очень разных источников. Человек в админке сохраняет одну запись и ждёт увидеть её на сайте. Обмен с 1С сохраняет сотни товаров волной раз в несколько минут. Одна стратегия для обоих не работает.
Это восемнадцатая часть цикла «Кэш страниц без MISS».
| Правка из админки | Поток 1С | |
|---|---|---|
| чего ждут | «сохранил — и вижу» | ничего, лишь бы не тормозило |
| объём | одна запись | сотни записей волной |
| когда чистить | сразу, в конце запроса | с задержкой (дебаунс), пачкой |
| как греть | тут же, все варианты | общей очередью прогрева |
Как различить источник
function cache_is_human_edit(): bool {
return is_admin()
&& !wp_doing_cron()
&& !(defined('REST_REQUEST') && REST_REQUEST);
}
add_action('shutdown', function () {
if (cache_is_human_edit()) {
cache_flush_pending_now(); // сразу: чистка + прогрев
} else {
cache_schedule_flush(60); // обмен: копить и чистить пачкой
}
});
Обмен 1С приходит через REST API или крон, поэтому проверки REST_REQUEST и wp_doing_cron отделяют его от человека.
Почему не всё сразу
Если чистить сразу и поток обмена, каждая волна превращается в сотни синхронных чисток и прогревов. Дебаунс собирает адреса за минуту, убирает повторы и чистит один раз. Для обмена задержка в минуту незаметна — для человека в админке она выглядит как «не сохранилось».
На одном сайте мы нашли ровно эту ошибку: функция немедленной чистки была написана, но не вызывалась — правки редактора шли через ту же минутную задержку (четырнадцатая часть).
Как проверить, не трогая контент на рабочем сайте
Не нужно править реальную запись: достаточно поставить адрес в очередь чистки и вызвать немедленный сброс из консоли WordPress, а потом запросить страницу и проверить, что она пересобралась и снова в кэше.
Редакторы жалуются, что правки появляются не сразу?
Пришлите адрес — проверю, как у вас разделены правки и обмен.
// загружаю комментарии…