wpcache.ru wordpress WPCache.ru

WooCommerce: исключение кэширования страниц оплаты и корзины без потери данных

Проблема кэширования страниц корзины и оплаты в WooCommerce

Страницы корзины и оплаты в WooCommerce динамические и содержат персональные данные пользователя. Если эти страницы попадают под кэширование, покупатели могут видеть устаревшую информацию, например, пустую корзину или неправильные суммы, что приводит к потере заказов и ухудшению пользовательского опыта.

Диагностика: как понять, что кэширование затрагивает корзину и оплату

  • Пользователь добавляет товар в корзину, но при переходе на страницу корзины она отображается пустой.
  • Сумма к оплате не обновляется при изменении товаров в корзине.
  • Функции AJAX обновления корзины не работают корректно.
  • В консоли браузера видны ошибки или предупреждения, связанные с кэшированием.

Для проверки используйте режим инкогнито и отключите все серверные и плагиновые кэши, затем постепенно включайте по одному.

Пошаговое решение: исключение страниц корзины и оплаты из кэширования

1. Определяем страницы WooCommerce программно

Для правильного исключения кэша нужно динамически получить URL или ID страниц корзины и оплаты, поскольку они могут быть изменены в настройках WooCommerce.

function wpcache_get_woocommerce_critical_pages() {
    if ( ! function_exists('wc_get_page_id') ) {
        return [];
    }
    return [
        wc_get_page_id('cart'),
        wc_get_page_id('checkout'),
        wc_get_page_id('myaccount')
    ];
}

2. Исключаем страницы из кэширования на уровне PHP (например, в плагине кэширования или functions.php)

Многие плагины кэширования предоставляют фильтры для задания исключений. Пример для WP Super Cache:

add_filter('wp_cache_is_cacheable', function($cacheable) {
    if ( is_admin() ) return false;
    $excluded_pages = wpcache_get_woocommerce_critical_pages();
    if ( in_array(get_queried_object_id(), $excluded_pages) ) {
        return false;
    }
    return $cacheable;
});

Для WP Rocket можно добавить исключения в настройках, либо использовать фильтр:

add_filter('rocket_cache_reject_uri', function($reject_uris) {
    $cart_url = wc_get_cart_url();
    $checkout_url = wc_get_checkout_url();
    $reject_uris[] = parse_url($cart_url, PHP_URL_PATH);
    $reject_uris[] = parse_url($checkout_url, PHP_URL_PATH);
    return $reject_uris;
});

3. Исключение кэширования на уровне сервера (Nginx/Apache)

Если кэширование настроено на уровне сервера (FastCGI Cache, Varnish), необходимо добавить правила исключения для путей:

  • /cart/
  • /checkout/

Пример для Nginx:

location /cart/ {
    set $no_cache 1;
}
location /checkout/ {
    set $no_cache 1;
}

И далее в конфигурации FastCGI Cache добавить условие пропуска кэша, если $no_cache = 1.

Проверка результата после внедрения

  • Добавьте товар в корзину в режиме инкогнито.
  • Перейдите на страницу корзины и убедитесь, что отображается актуальный список товаров.
  • Проверьте обновление корзины и переход к оплате без ошибок.
  • Проверьте заголовки HTTP: страницы корзины и оплаты должны иметь заголовок Cache-Control: no-cache или отсутствовать в кэше.
  • Используйте инструменты разработчика браузера (Network) для проверки отсутствия кэширования.

Частые ошибки и как их исправить

  • Забыли исключить страницу "Мой аккаунт". Если она кэшируется, могут возникать проблемы с авторизацией. Добавьте её в исключения.
  • Неправильное определение ID страниц WooCommerce. Используйте wc_get_page_id(), а не жестко прописанные ID.
  • Конфликты с другими плагинами кэширования. Отключайте по очереди, чтобы выявить конфликт.
  • Кэш на уровне CDN. Не забудьте настроить исключения и там (например, Cloudflare Page Rules).

Практические советы по безопасности и производительности

  • Для динамического контента используйте AJAX с минимальным кэшированием.
  • Не кэшируйте страницы с пользовательскими данными, чтобы избежать утечки информации.
  • Проверяйте заголовки HTTP для контроля политики кэширования.
  • Используйте Transients API для кэширования данных, не влияющих на процесс покупки.

Сравнение подходов по исключению кэширования

МетодПлюсыМинусы
Исключение через PHP-фильтры плагинаГибко, легко обновлятьЗависит от поддержки плагина
Исключение на уровне сервера (Nginx, Varnish)Работает быстро, до WordPressТребует доступа к серверу и знаний
Настройки CDN (Cloudflare, etc.)Внешняя оптимизацияНе всегда достаточно для динамического контента
×
Обнови свой WordPress!

Держи скидку 15% на премиум тему Reboot

Купить со скидкой ⋙