实操指南:提升WooCommerce产品页加载速度的3个关键技术
引言:为什么WooCommerce产品页速度至关重要
在当今电子商务竞争激烈的环境中,网站加载速度直接影响着用户体验、转化率和搜索引擎排名。根据Google的研究,页面加载时间每增加1秒,移动端转化率就会下降20%。对于使用WooCommerce的WordPress电商网站来说,产品页通常是用户做出购买决策的关键页面,其加载速度尤为重要。
WooCommerce产品页通常包含大量动态内容:产品图片库、变体选择器、相关产品推荐、用户评价等,这些元素都可能成为性能瓶颈。本文将深入探讨三个关键技术,帮助您显著提升WooCommerce产品页的加载速度,从而改善用户体验并提高销售转化率。
技术一:优化图像与媒体资源
1.1 图像懒加载实现
图像通常是产品页中最大的资源,实现懒加载可以显著减少初始页面加载时间。
/**
* 为WooCommerce产品图片添加懒加载功能
* 将以下代码添加到主题的functions.php文件中
*/
function add_lazy_loading_to_product_images() {
// 检查是否为产品页面
if (is_product()) {
// 移除WooCommerce默认的产品图片输出
remove_action('woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20);
// 添加自定义的懒加载产品图片
add_action('woocommerce_before_single_product_summary', 'custom_lazy_load_product_images', 20);
}
}
add_action('wp', 'add_lazy_loading_to_product_images');
/**
* 自定义懒加载产品图片函数
*/
function custom_lazy_load_product_images() {
global $product;
// 获取产品图片ID
$product_id = $product->get_id();
$main_image_id = $product->get_image_id();
$gallery_image_ids = $product->get_gallery_image_ids();
// 输出主图片
if ($main_image_id) {
echo '<div class="woocommerce-product-gallery__image single-product-main-image">';
echo wp_get_attachment_image(
$main_image_id,
'woocommerce_single',
false,
array(
'class' => 'wp-post-image lazy-load',
'data-src' => wp_get_attachment_image_url($main_image_id, 'woocommerce_single'),
'src' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', // 占位图
'alt' => get_post_meta($main_image_id, '_wp_attachment_image_alt', true) ?: get_the_title($product_id)
)
);
echo '</div>';
}
// 输出图库图片
if ($gallery_image_ids) {
echo '<div class="product-gallery-thumbnails">';
foreach ($gallery_image_ids as $gallery_image_id) {
echo '<div class="gallery-thumbnail">';
echo wp_get_attachment_image(
$gallery_image_id,
'woocommerce_gallery_thumbnail',
false,
array(
'class' => 'lazy-load',
'data-src' => wp_get_attachment_image_url($gallery_image_id, 'woocommerce_gallery_thumbnail'),
'src' => 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'alt' => get_post_meta($gallery_image_id, '_wp_attachment_image_alt', true) ?: get_the_title($product_id)
)
);
echo '</div>';
}
echo '</div>';
}
// 添加懒加载JavaScript
add_lazy_load_script();
}
/**
* 添加懒加载JavaScript代码
*/
function add_lazy_load_script() {
?>
<script>
document.addEventListener("DOMContentLoaded", function() {
// 懒加载实现
const lazyImages = document.querySelectorAll('img.lazy-load');
// 创建Intersection Observer实例
const imageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy-load');
imageObserver.unobserve(img);
}
});
});
// 观察所有懒加载图片
lazyImages.forEach(function(img) {
imageObserver.observe(img);
});
// 备用方案:如果浏览器不支持Intersection Observer
if (!('IntersectionObserver' in window)) {
const lazyLoadFallback = function() {
lazyImages.forEach(function(img) {
if (img.getBoundingClientRect().top < window.innerHeight && img.getBoundingClientRect().bottom > 0) {
img.src = img.dataset.src;
img.classList.remove('lazy-load');
}
});
};
// 监听滚动事件
window.addEventListener('scroll', lazyLoadFallback);
window.addEventListener('resize', lazyLoadFallback);
lazyLoadFallback(); // 初始执行
}
});
</script>
<?php
}
1.2 图像格式与压缩优化
除了懒加载,正确的图像格式选择和压缩也至关重要:
- 使用WebP格式:WebP比JPEG和PNG有更好的压缩率,同时保持相同质量
- 实施响应式图像:根据设备屏幕尺寸提供不同大小的图像
- 使用图像压缩插件:如ShortPixel、Imagify或EWWW Image Optimizer
技术二:数据库查询优化与缓存策略
2.1 优化WooCommerce数据库查询
WooCommerce产品页通常执行大量数据库查询,优化这些查询可以显著提升性能。
/**
* 优化WooCommerce产品页数据库查询
* 减少不必要的查询并添加缓存
*/
// 缓存产品变体数据
function cache_product_variations($product_id) {
// 检查是否为变体产品
$product = wc_get_product($product_id);
if (!$product->is_type('variable')) {
return false;
}
// 尝试从缓存获取变体数据
$cache_key = 'product_variations_' . $product_id;
$cached_variations = wp_cache_get($cache_key, 'woocommerce');
if (false === $cached_variations) {
// 缓存中没有数据,从数据库获取
$variations = $product->get_available_variations();
// 优化变体数据,只保留必要信息
$optimized_variations = array();
foreach ($variations as $variation) {
$optimized_variations[] = array(
'variation_id' => $variation['variation_id'],
'attributes' => $variation['attributes'],
'price_html' => $variation['price_html'],
'image' => $variation['image'],
'is_in_stock' => $variation['is_in_stock']
);
}
// 将数据存入缓存,有效期1小时
wp_cache_set($cache_key, $optimized_variations, 'woocommerce', HOUR_IN_SECONDS);
return $optimized_variations;
}
return $cached_variations;
}
// 在产品页使用缓存的变体数据
function display_optimized_product_variations() {
global $product;
if ($product->is_type('variable')) {
$variations = cache_product_variations($product->get_id());
if ($variations) {
// 使用缓存的数据显示变体选择器
echo '<div class="variations_form">';
// ... 变体选择器HTML代码
echo '</div>';
}
}
}
add_action('woocommerce_before_add_to_cart_form', 'display_optimized_product_variations');
// 清除产品变体缓存
function clear_product_variation_cache($product_id) {
$cache_key = 'product_variations_' . $product_id;
wp_cache_delete($cache_key, 'woocommerce');
}
add_action('woocommerce_update_product', 'clear_product_variation_cache');
add_action('woocommerce_delete_product', 'clear_product_variation_cache');
2.2 实施对象缓存
对于高流量网站,实施对象缓存可以显著减少数据库查询:
- 使用Redis或Memcached:安装并配置对象缓存扩展
- 配置WooCommerce支持对象缓存:在wp-config.php中添加相应配置
- 使用缓存插件:如W3 Total Cache或WP Rocket
2.3 数据库索引优化
确保WooCommerce相关数据库表有适当的索引:
-- 为WooCommerce订单项表添加索引
ALTER TABLE wp_woocommerce_order_items ADD INDEX order_id (order_id);
-- 为产品元数据表添加索引
ALTER TABLE wp_postmeta ADD INDEX post_id_meta_key (post_id, meta_key(50));
-- 为产品变体属性表添加索引
ALTER TABLE wp_woocommerce_attribute_taxonomies ADD INDEX attribute_name (attribute_name(20));
技术三:JavaScript与CSS优化
3.1 延迟非关键JavaScript加载
产品页中的许多JavaScript文件可以延迟加载,直到用户交互时再执行。
/**
* 优化WooCommerce产品页JavaScript加载
* 延迟非关键脚本,异步加载必要脚本
*/
// 延迟加载WooCommerce变体脚本
function defer_woocommerce_variation_script($tag, $handle, $src) {
// 延迟的脚本列表
$scripts_to_defer = array(
'wc-add-to-cart-variation',
'zoom',
'flexslider',
'photoswipe-ui-default'
);
// 异步加载的脚本列表
$scripts_to_async = array(
'wc-single-product',
'wc-add-to-cart'
);
if (in_array($handle, $scripts_to_defer)) {
return str_replace(' src', ' defer src', $tag);
}
if (in_array($handle, $scripts_to_async)) {
return str_replace(' src', ' async src', $tag);
}
return $tag;
}
add_filter('script_loader_tag', 'defer_woocommerce_variation_script', 10, 3);
// 条件加载JavaScript
function conditionally_load_product_scripts() {
// 只在产品页面加载特定脚本
if (is_product()) {
// 移除不必要的脚本
wp_dequeue_script('some-unnecessary-script');
// 延迟加载评价相关脚本
add_filter('script_loader_tag', function($tag, $handle) {
if ($handle === 'comment-reply') {
return str_replace(' src', ' defer src', $tag);
}
return $tag;
}, 10, 2);
}
}
add_action('wp_enqueue_scripts', 'conditionally_load_product_scripts', 100);
3.2 CSS优化与关键CSS内联
/**
* 提取并内联关键CSS,延迟加载非关键CSS
*/
// 提取产品页关键CSS
function get_product_critical_css() {
// 这里应该是从CSS文件中提取的关键CSS代码
// 实际应用中可以使用自动化工具提取
return '
.woocommerce-product-gallery { opacity: 1 !important; }
.product_title { font-size: 24px; margin-bottom: 15px; }
.price { color: #77a464; font-size: 22px; }
.woocommerce-product-details__short-description { margin-bottom: 20px; }
.single_add_to_cart_button {
background: #a46497;
color: white;
padding: 10px 20px;
border: none;
}
';
}
// 内联关键CSS并延迟加载主样式表
function optimize_product_page_css() {
if (is_product()) {
// 获取关键CSS
$critical_css = get_product_critical_css();
// 内联关键CSS
echo '<style id="critical-css">' . $critical_css . '</style>';
// 延迟加载主CSS文件
add_filter('style_loader_tag', function($html, $handle) {
if ($handle === 'woocommerce-general' || $handle === 'woocommerce-layout') {
return str_replace("media='all'", "media='print' onload="this.media='all'"", $html);
}
return $html;
}, 10, 2);
}
}
add_action('wp_head', 'optimize_product_page_css', 1);
3.3 实施代码分割与动态导入
对于现代JavaScript,可以使用代码分割技术:
// 动态加载产品变体选择器脚本
if (document.querySelector('.variations_form')) {
import('./product-variation-handler.js')
.then(module => {
module.initVariationHandler();
})
.catch(error => {
console.error('动态加载变体处理器失败:', error);
});
}
// 动态加载产品图库脚本
if (document.querySelector('.woocommerce-product-gallery')) {
import('./product-gallery.js')
.then(module => {
module.initProductGallery();
})
.catch(error => {
console.error('动态加载产品图库失败:', error);
});
}
综合实施与性能测试
4.1 实施步骤检查清单
-
图像优化检查:
- [ ] 启用图像懒加载
- [ ] 转换图像为WebP格式
- [ ] 实施响应式图像
- [ ] 压缩所有产品图片
-
数据库与缓存优化:
- [ ] 实施数据库查询缓存
- [ ] 配置对象缓存(Redis/Memcached)
- [ ] 优化数据库索引
- [ ] 启用页面缓存
-
代码优化:
- [ ] 延迟非关键JavaScript
- [ ] 内联关键CSS
- [ ] 最小化CSS和JavaScript文件
- [ ] 移除未使用的代码
4.2 性能测试工具
实施优化后,使用以下工具测试性能改进:
- Google PageSpeed Insights:全面的性能分析和建议
- GTmetrix:详细的加载时间分析和瀑布图
- WebPageTest:多地点测试和视频录制功能
- Pingdom Tools:简单的速度测试和性能评分
4.3 监控与维护
性能优化不是一次性的任务,需要持续监控:
- 设置定期性能检查(每周或每月)
- 监控关键指标:首次内容绘制(FCP)、最大内容绘制(LCP)、首次输入延迟(FID)
- 使用监控工具如New Relic或Google Analytics Site Speed报告
- 定期更新WooCommerce和主题,确保兼容性和性能改进
结论
通过实施上述三个关键技术——优化图像与媒体资源、数据库查询优化与缓存策略、JavaScript与CSS优化,您可以显著提升WooCommerce产品页的加载速度。这些优化不仅改善用户体验,还能直接提高转化率和搜索引擎排名。
记住,性能优化是一个持续的过程。随着WooCommerce的更新、新功能的添加和产品数量的增加,定期重新评估和优化您的网站性能至关重要。从今天开始实施这些技术,您将很快看到网站性能的显著提升和业务指标的积极变化。
最佳实践提示:在实施任何重大更改之前,始终在暂存环境中测试,并确保有完整的网站备份。性能优化应该是一个渐进的过程,一次实施一个更改,测试其效果,然后再进行下一个优化。
实操指南:提升WooCommerce产品页加载速度的3个关键技术(续)
技术四:服务器端优化与HTTP/2配置
4.1 服务器配置优化
服务器配置直接影响WooCommerce产品页的加载性能。以下是最佳实践配置:
# Nginx服务器配置优化示例
# /etc/nginx/nginx.conf 或站点配置文件
http {
# 基础优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 启用Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# 静态资源缓存
location ~* .(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary Accept-Encoding;
# 启用Brotli压缩(如果可用)
brotli on;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
brotli_comp_level 6;
}
# WooCommerce特定规则
location /wp-content/uploads/woocommerce_uploads/ {
expires 1y;
add_header Cache-Control "public";
}
# PHP-FPM优化
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# PHP-FPM性能优化
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
4.2 PHP配置优化
; php.ini 配置优化
; 适用于WooCommerce的PHP设置
[PHP]
; 内存限制
memory_limit = 256M
; 执行时间
max_execution_time = 300
max_input_time = 300
; 输出缓冲
output_buffering = 4096
implicit_flush = Off
; 会话设置
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0
; OPcache优化(PHP 7.0+)
[opcache]
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.save_comments=1
; 实时优化配置
opcache.revalidate_freq=0
opcache.validate_timestamps=0 ; 生产环境设为0,开发环境设为1
4.3 HTTP/2与HTTP/3实施
# Apache HTTP/2配置示例
# .htaccess 或虚拟主机配置
<IfModule mod_http2.c>
# 启用HTTP/2
Protocols h2 h2c http/1.1
# HTTP/2推送配置
H2Push on
H2PushPriority * after
# 推送关键资源
<FilesMatch ".(css|js)$">
H2PushResource on
</FilesMatch>
# 连接设置
H2MaxSessionStreams 100
H2WindowSize 65535
H2StreamMaxMemSize 128000
</IfModule>
# 启用Brotli压缩
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml
</IfModule>
# 资源提示
<IfModule mod_headers.c>
# 预连接关键域名
Header add Link "</wp-content/themes/your-theme/style.css>; rel=preload; as=style"
Header add Link "</wp-includes/js/jquery/jquery.min.js>; rel=preload; as=script"
# DNS预获取
Header add Link "<//fonts.googleapis.com>; rel=dns-prefetch"
Header add Link "<//ajax.googleapis.com>; rel=dns-prefetch"
</IfModule>
技术五:CDN集成与边缘计算
5.1 CDN配置与优化
/**
* WooCommerce CDN集成配置
* 将静态资源重定向到CDN
*/
class WooCommerce_CDN_Integration {
private $cdn_domain = 'https://cdn.yourdomain.com';
private $excluded_files = array('admin-ajax.php', 'wc-api');
public function __construct() {
// 初始化CDN集成
add_action('init', array($this, 'setup_cdn'));
}
public function setup_cdn() {
// 只在前端启用CDN
if (!is_admin()) {
// 重写静态资源URL
add_filter('wp_get_attachment_url', array($this, 'rewrite_attachment_url'), 10, 2);
add_filter('stylesheet_directory_uri', array($this, 'rewrite_theme_url'));
add_filter('template_directory_uri', array($this, 'rewrite_theme_url'));
add_filter('plugins_url', array($this, 'rewrite_plugins_url'));
// 处理WooCommerce特定资源
add_filter('woocommerce_product_get_image_id', array($this, 'optimize_product_images'));
}
}
public function rewrite_attachment_url($url, $post_id) {
// 只处理图片和文档
$file_type = get_post_mime_type($post_id);
$allowed_types = array('image/jpeg', 'image/png', 'image/gif', 'image/webp', 'application/pdf');
if (in_array($file_type, $allowed_types)) {
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
// 排除特定文件
foreach ($this->excluded_files as $excluded) {
if (strpos($path, $excluded) !== false) {
return $url;
}
}
// 构建CDN URL
return $this->cdn_domain . $path;
}
return $url;
}
public function rewrite_theme_url($url) {
// 重写主题资源URL
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
// 只处理CSS、JS和字体文件
if (preg_match('/.(css|js|woff|woff2|ttf|eot|svg)$/', $path)) {
return $this->cdn_domain . $path;
}
return $url;
}
public function rewrite_plugins_url($url) {
// 重写插件资源URL
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
// 检查是否为WooCommerce资源
if (strpos($path, '/woocommerce/') !== false) {
// 只处理特定文件类型
if (preg_match('/.(css|js|png|jpg|gif|svg)$/', $path)) {
return $this->cdn_domain . $path;
}
}
return $url;
}
public function optimize_product_images($image_id) {
// 为产品图片添加CDN参数
if ($image_id) {
add_filter('wp_get_attachment_image_src', function($image, $id) use ($image_id) {
if ($id == $image_id && isset($image[0])) {
// 添加自动优化参数(适用于支持图片处理的CDN)
$image[0] = add_query_arg(array(
'width' => $image[1],
'height' => $image[2],
'fit' => 'cover',
'quality' => 85,
'format' => 'auto' // 自动选择最佳格式
), $image[0]);
}
return $image;
}, 10, 2);
}
return $image_id;
}
/**
* 生成CDN预取头
*/
public function add_cdn_prefetch_headers() {
if (!is_admin()) {
header("Link: <{$this->cdn_domain}>; rel=preconnect; crossorigin", false);
header("Link: <{$this->cdn_domain}/wp-content/uploads/>; rel=prefetch", false);
header("Link: <{$this->cdn_domain}/wp-content/themes/>; rel=prefetch", false);
}
}
}
// 初始化CDN集成
new WooCommerce_CDN_Integration();
5.2 边缘计算实现
// 边缘计算示例:在CDN边缘处理产品变体计算
// 这个示例展示如何使用Cloudflare Workers处理变体价格计算
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 只处理产品变体API请求
const url = new URL(request.url)
if (url.pathname.includes('/wc-api/variations/')) {
return handleVariationRequest(request, url)
}
// 其他请求直接传递
return fetch(request)
}
async function handleVariationRequest(request, url) {
// 从URL获取产品ID和属性
const productId = url.pathname.split('/').pop()
const searchParams = new URLSearchParams(url.search)
// 构建缓存键
const cacheKey = `variation_${productId}_${Array.from(searchParams.entries()).sort().toString()}`
// 检查边缘缓存
const cache = caches.default
let response = await cache.match(request)
if (!response) {
// 缓存未命中,从源站获取
response = await fetch(request.clone())
if (response.status === 200) {
// 克隆响应以修改
const newResponse = new Response(response.body, response)
// 添加边缘缓存头
newResponse.headers.set('Cache-Control', 'public, max-age=3600')
newResponse.headers.set('CDN-Cache-Control', 'public, max-age=3600')
newResponse.headers.set('Vary', 'Accept-Encoding, User-Agent')
// 存储到边缘缓存
event.waitUntil(cache.put(request, newResponse.clone()))
return newResponse
}
}
return response
}
// 边缘计算:实时价格计算
async function calculateDynamicPrice(productData, variationAttributes) {
// 从边缘KV存储获取价格规则
const pricingRules = await PRICING_KV.get('pricing_rules', 'json')
// 应用价格规则
let basePrice = productData.price
let finalPrice = basePrice
// 检查批量折扣
if (pricingRules.bulk_discounts) {
for (const rule of pricingRules.bulk_discounts) {
if (variationAttributes.quantity >= rule.min_quantity) {
finalPrice = basePrice * (1 - rule.discount_percent / 100)
break
}
}
}
// 检查会员折扣
if (pricingRules.member_discounts && variationAttributes.is_member) {
finalPrice *= (1 - pricingRules.member_discounts.percent / 100)
}
return {
price: finalPrice.toFixed(2),
original_price: basePrice.toFixed(2),
discount: ((basePrice - finalPrice) / basePrice * 100).toFixed(1)
}
}
技术六:高级缓存策略与预加载技术
6.1 智能缓存失效策略
/**
* 智能缓存失效系统
* 根据产品更新自动清除相关缓存
*/
class WooCommerce_Smart_Cache_Invalidation {
private $cache_groups = array(
'product_data',
'product_queries',
'related_products',
'product_html'
);
public function __construct() {
// 产品更新时清除缓存
add_action('save_post_product', array($this, 'invalidate_product_cache'), 10, 3);
add_action('woocommerce_update_product', array($this, 'invalidate_product_cache_complete'));
// 订单相关操作
add_action('woocommerce_new_order', array($this, 'invalidate_stock_cache'));
add_action('woocommerce_order_status_changed', array($this, 'invalidate_stock_cache'));
// 评论/评价更新
add_action('comment_post', array($this, 'invalidate_review_cache'), 10, 3);
add_action('wp_update_comment_count', array($this, 'invalidate_review_cache_bulk'));
}
public function invalidate_product_cache($post_id, $post, $update) {
if ($post->post_type !== 'product' || wp_is_post_revision($post_id)) {
return;
}
// 清除产品数据缓存
$this->clear_product_specific_cache($post_id);
// 清除相关产品缓存
$this->clear_related_products_cache($post_id);
// 清除分类页面缓存
$this->clear_category_cache($post_id);
// 延迟清除HTML缓存(避免并发问题)
wp_schedule_single_event(time() + 5, 'woocommerce_delayed_cache_clear', array($post_id));
}
private function clear_product_specific_cache($product_id) {
$cache_keys = array(
"product_{$product_id}_full",
"product_{$product_id}_variations",
"product_{$product_id}_attributes",
"product_{$product_id}_html"
);
foreach ($cache_keys as $key) {
foreach ($this->cache_groups as $group) {
wp_cache_delete($key, $group);
}
}
// 清除对象缓存
if (function_exists('wp_cache_flush_group')) {
foreach ($this->cache_groups as $group) {
wp_cache_flush_group($group);
}
}
}
private function clear_related_products_cache($product_id) {
// 获取相关产品ID
$related_ids = wc_get_related_products($product_id);
foreach ($related_ids as $related_id) {
wp_cache_delete("product_{$related_id}_related", 'product_queries');
}
// 清除全局相关产品缓存
wp_cache_delete('all_related_products', 'product_queries');
}
private function clear_category_cache($product_id) {
$terms = wp_get_post_terms($product_id, 'product_cat');
foreach ($terms as $term) {
$cache_key = "category_{$term->term_id}_products";
wp_cache_delete($cache_key, 'product_queries');
// 清除分类页面HTML缓存
$html_cache_key = "category_{$term->term_id}_html";
wp_cache_delete($html_cache_key, 'product_html');
}
}
public function invalidate_stock_cache($order_id) {
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// 获取订单中的所有产品
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// 清除库存缓存
wp_cache_delete("product_{$product_id}_stock", 'product_data');
wp_cache_delete("product_{$product_id}_availability", 'product_data');
// 清除变体库存缓存
if ($item->get_variation_id()) {
wp_cache_delete("variation_{$item->get_variation_id()}_stock", 'product_data');
}
}
}
/**
* 部分缓存更新(只更新变化的部分)
*/
public function partial_cache_update($product_id, $updated_fields) {
$product_data = wp_cache_get("product_{$product_id}_full", 'product_data');
if ($product_data) {
// 只更新变化的字段
foreach ($updated_fields as $field => $value) {
$product_data[$field] = $value;
}
// 更新缓存
wp_cache_set("product_{$product_id}_full", $product_data, 'product_data', HOUR_IN_SECONDS);
// 生成部分HTML更新
$this->generate_partial_html_update($product_id, $updated_fields);
}
}
private function generate_partial_html_update($product_id, $updated_fields) {
// 只重新生成变化的部分HTML
$partial_html = '';
if (isset($updated_fields['price'])) {
ob_start();
woocommerce_template_single_price();
$partial_html .= '<div id="product-price">' . ob_get_clean() . '</div>';
}
if (isset($updated_fields['stock_status'])) {
ob_start();
woocommerce_template_single_stock();
$partial_html .= '<div id="product-stock">' . ob_get_clean() . '</div>';
}
// 存储部分HTML更新
if (!empty($partial_html)) {
wp_cache_set(
"product_{$product_id}_partial_html",
$partial_html,
'product_html',
300 // 5分钟过期
);
}
}
}
