You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yith WooCommerce预订状态更新后前端Ajax日历未同步问题求助

解决YITH WooCommerce Booking前端日历未同步预订状态更新的问题

问题背景

在WordPress/WooCommerce环境中对接外部程序,通过代码修改YITH WooCommerce Booking预订状态为bk-cancelled后,后端状态已生效,但前端产品页的Ajax日历未清除对应已预订日期;此前创建新预订时也出现过前端日历未刷新、展示旧可用状态的问题。当前使用的代码片段如下:

$booking = get_post(5404);

$booking->post_status = 'bk-cancelled';
    
wp_update_post($booking);

$GLOBALS['wpdb']->update( $GLOBALS['wpdb']->posts, $booking, array( 'ID' => 5404 ) );
clean_post_cache( 5404 );
do_action( 'yith_wcbk_booking_updated', $booking );
do_action( 'yith_wcbk_update_booking', 5404, $booking );

$booking = yith_get_booking( $booking );
$booking->save();

核心问题分析

YITH WooCommerce Booking插件会对前端日历的可用日期做专属缓存,仅清理单个预订的文章缓存、触发通用更新钩子不足以刷新这个专属缓存,导致前端仍读取旧的日期状态数据。

解决思路及代码调整

1. 清理YITH Booking的专属缓存

YITH插件内部使用自定义缓存存储预订日期的占用状态,需要调用其内置方法清理对应产品的缓存:

// 获取预订关联的产品ID
$product_id = get_post_meta(5404, '_yith_wcbk_booking_product_id', true);

// 清理该产品的预订日历缓存
if ($product_id) {
    yith_wcbk_delete_availability_cache($product_id);
}

2. 优化预订状态更新的正确姿势

不要直接操作wp_posts表或手动修改post_status,改用YITH提供的官方API更新预订状态,确保插件内部的状态同步逻辑被触发:

// 使用YITH官方方法获取预订对象
$booking = yith_get_booking(5404);
if ($booking) {
    // 设置为取消状态(YITH内部会自动映射为bk-cancelled)
    $booking->set_status('cancelled');
    // 保存并触发内部同步逻辑
    $booking->save();
    
    // 清理关联产品的日历缓存
    yith_wcbk_delete_availability_cache($booking->get_product_id());
}

3. 强制清理WooCommerce及全局缓存

如果站点使用了Redis、WP Rocket等缓存插件,还需要额外清理全局缓存或产品相关缓存:

// 清理WooCommerce产品缓存
wc_delete_product_transients($product_id);

// 清理全局对象缓存(若启用)
wp_cache_flush();

4. 验证前端Ajax请求的缓存策略

前端日历的Ajax请求可能带有浏览器缓存,可在Ajax请求的URL中添加时间戳参数,或在响应头中设置Cache-Control: no-cache,确保每次请求都拉取最新数据。

内容的提问来源于stack exchange,提问作者icon32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:30