Посетитель оставил один комментарий — и почти на год перестал получать сайт из кэша. Каждая страница для него рендерится заново, хотя он ничем не отличается от остальных. Причина — кука, которую ставит штатный 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: браузерное хранилище на сервер не уходит и на кэш не влияет.

Как проверить свой сайт

  1. оставьте комментарий и отметьте «сохранить имя»;
  2. посмотрите куки сайта в инструментах разработчика — есть ли comment_author_*;
  3. откройте любую страницу и посмотрите заголовок статуса кэша: если там BYPASS на странице, которая у анонима HIT, — это оно.

Постоянные читатели жалуются, что сайт медленный, а у вас быстро?

Пришлите адрес — проверю, какие куки выводят их из кэша.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.