Посетитель оставил один комментарий — и почти на год перестал получать сайт из кэша. Каждая страница для него рендерится заново, хотя он ничем не отличается от остальных. Причина — кука, которую ставит штатный WordPress.
Это седьмая часть цикла «WordPress на кэшируемом сайте».
Что ставит WordPress
После отправки комментария ядро сохраняет имя, почту и сайт автора в куках, чтобы заполнить форму в следующий раз и показать ему его же комментарий на модерации:
comment_author_<хэш> имя
comment_author_email_<хэш> почта
comment_author_url_<хэш> сайт
срок — 30 000 000 секунд, почти 347 дней (фильтр comment_cookie_lifetime)
С версии 4.9.6 куки ставятся, только если человек отметил «сохранить моё имя в этом браузере». Многие отмечают — галочка стоит прямо под полем.
Почему кука выключает кэш
Штатный WordPress показывает автору его комментарий на модерации с пометкой «ожидает проверки». Это персональный ответ, поэтому почти все готовые конфигурации кэша — для nginx и в плагинах — пускают обладателя такой куки мимо кэша. У нас она тоже в этом списке:
map $http_cookie $skip_cache_cookie {
default 0;
"~*comment_author_" 1;
"~*wordpress_logged_in_" 1;
"~*wp_postpass_" 1;
}
Итог: каждый, кто прокомментировал хоть раз и отметил галочку, почти год ходит по сайту без кэша. Это ваши самые вовлечённые читатели — и они получают самый медленный сайт. Та же история, что с прикладными куками в обходе (восьмая часть цикла про кэш страниц), только кука служебная и ставится «сама».
Решение: куку не ставить
remove_action('set_comment_cookies', 'wp_set_comment_cookies');
Одна строка — и кука не появляется ни у кого, а правило обхода в nginx срабатывать перестаёт само.
Что теряем и чем заменяем:
| Было в штатном варианте | Как у нас |
|---|---|
| форма заполнена именем из куки | имя вводится заново: одно поле, это не страшно |
| автор видит свой комментарий с пометкой «ожидает проверки» | после отправки — сообщение «Спасибо! Комментарий появится после проверки» |
| почта и сайт в куках | почту и сайт мы не спрашиваем вовсе |
Если имя всё-таки хочется подставлять, храните его в localStorage: браузерное хранилище на сервер не уходит и на кэш не влияет.
Как проверить свой сайт
- оставьте комментарий и отметьте «сохранить имя»;
- посмотрите куки сайта в инструментах разработчика — есть ли
comment_author_*; - откройте любую страницу и посмотрите заголовок статуса кэша: если там
BYPASSна странице, которая у анонимаHIT, — это оно.
Постоянные читатели жалуются, что сайт медленный, а у вас быстро?
Пришлите адрес — проверю, какие куки выводят их из кэша.
// загружаю комментарии…