跳到主要内容

如何配置 WooCommerce 的缓存插件

从缓存中排除网页

通常,在使用缓存插件时,它们已经会自动排除某些网页。如果不是,请确保通过缓存系统的相应设置,从缓存中排除以下网页:

  • 购物车
  • 我的账户
  • 结账

这些网页需要保持动态状态,因为它们显示特定于当前客户及其购物车的信息

从缓存中排除 WooCommerce 会话

如果使用的缓存系统提供数据库缓存功能,那么将 _wc_session_ 从缓存中排除可能会有所帮助。这取决于插件或主机缓存的配置,请参考该系统的具体说明或文档。

WooCommerce 中的 Cookie 用于跟踪客户购物车的产品,可以保留客户离开网站时的购物车数据,并驱动“最近浏览”小工具。以下是 WooCommerce 使用的 Cookie 列表,您可以将它们从缓存中排除。

COOKIE 名称持续时间作用
woocommerce_cart_hash会话帮助 WooCommerce 确定购物车内容/数据何时发生变化。
woocommerce_items_in_cart会话帮助 WooCommerce 确定购物车内容/数据何时发生变化。
wp_woocommerce_session_2 天包含每个客户的唯一代码,以便知道在数据库中为每个客户查找购物车数据的位置
woocommerce_recently_viewed会话驱动“最近浏览产品”小工具。
store_notice[notice id]会话允许客户不再显示商店通知。

我们无法涵盖所有选项,但我们添加了一些关于常用缓存插件的提示。如需更具体的支持,请联系负责您缓存集成支持团队。

W3 Total Cache 压缩设置

请确保在“压缩”设置中的“忽略的注释开头”选项中添加 'mfunc'。

WP-Rocket

WooCommerce 与 WP-Rocket 完全兼容。请确保在插件的设置中,不要将以下网页(购物车、结账、我的账户)缓存。

我们建议避免 JavaScript 文件压缩。

WP Super Cache

WooCommerce 原生支持 WP Super Cache。WooCommerce 会向 WP Super Cache 发送信息,以便默认情况下不缓存购物车、结账或我的账户网页。

Varnish

if (req.url ~ "^/(cart|my-account|checkout|addons)") {
return (pass);
}
if ( req.url ~ "\\?add-to-cart=" ) {
return (pass);
}

故障排除

为什么我的 Varnish 配置在 WooCommerce 中无法正常工作?

请查看 WordPress.org 上的以下支持论坛帖子,了解cookie 如何影响您的 Varnish 配置

在 "if (req.http.cookie) {" 之前,添加以下内容:

# 移除除了 WordPress 管理和 WooCommerce 页面之外的所有 Cookie
if (!(req.url ~ "(wp-login|wp-admin|cart|my-account/*|wc-api*|checkout|addons|logout|lost-password|product/*)")) {
unset req.http.cookie;
}
# 允许访问 WooCommerce 动态页面
if (req.url ~ "^/(cart|my-account/*|checkout|wc-api/*|addons|logout|lost-password|product/*)") {
return (pass);
}
# 允许访问 WooCommerce 的“加入购物车”功能
if (req.url ~ "\?add-to-cart=") {
return (pass);
}
# 允许访问 WooCommerce API
if (req.url ~ "\?wc-api=") {
return (pass);
}
# 通过网站阻止访问 php 管理页面
if (req.url ~ "^/phpmyadmin/.*$" || req.url ~ "^/phppgadmin/.*$" || req.url ~ "^/server-status.*$") {
error 403 "出于安全原因,此 URL 只能通过主机名为 localhost (127.0.0.1) 的方式访问";
}

在 vcl_fetch 中添加以下内容:

# 移除除了 WordPress 管理和 WooCommerce 页面之外的所有 Cookie
if ( (!(req.url ~ "(wp-(login|admin)|login|cart|my-account/*|wc-api*|checkout|addons|logout|lost-password|product/*)")) || (req.request == "GET") ) {
unset beresp.http.set-cookie;
}

为什么我的密码重置功能陷入循环?

这是因为“我的账户”页面被缓存了。 一些具有服务器端缓存的主机可能不会阻止 my-account.php 被缓存。

如果您无法重置密码,并且始终返回到登录页面,请联系您的主机,以确保该页面已从其缓存中排除。