Woocommerce购物车通过PHP函数更新时偶发失效问题排查求助
问题原因定位
- 核心问题是会话存储触发逻辑错误:你将
$woocommerce->cart->set_session()放在了购物车项遍历循环内,每处理一个商品就执行一次会话写入,高频重复写入很容易触发WooCommerce会话的竞态冲突,尤其当会话存储在数据库中时,多次写入请求会互相覆盖导致数据丢失,这是你遇到50%概率清空数据的主要原因。 - 全局变量调用不规范:循环内重复声明
global $woocommerce完全冗余,WooCommerce官方推荐统一用WC()全局方法获取实例,部分场景下全局$woocommerce初始化时机异常会拿到空实例,导致自定义数据写入失败。 - 逻辑边界缺失:代码没有对
$_POST['date_week']做合法性校验,也没有提前初始化$newDate变量,当参数传递异常时,后续strtotime会返回false,最终生成的日期为空值。 - 返回值写法异常:
var_dump是直接打印输出的函数,没有返回值,你在die中拼接var_dump($cart_items)的写法会导致AJAX返回格式异常,同时你声明的$cart_items数组从未赋值,本身就是空值。
修复后的代码
<?php // 该函数放在主题functions.php文件中 // 统一更新购物车内所有周购商品的自提日期 add_action('wp_ajax_update_weekly_quantity_products_dates', 'update_cart_product_weekly_quantity_date'); add_action( 'wp_ajax_nopriv_update_weekly_quantity_products_dates', 'update_cart_product_weekly_quantity_date' ); function update_cart_product_weekly_quantity_date () { // 提前初始化日期变量,避免未定义报错 $newDate = ''; if (isset( $_POST['date_week'] )) { // 校验时间戳参数合法性 $timestamp = intval($_POST['date_week']); if ($timestamp <= 0) { die('日期参数不合法,更新失败'); } $newDate = date('d-m-Y', $timestamp); // 直接获取购物车内容数组 $cart_contents = WC()->cart->cart_contents; foreach( $cart_contents as $cart_item_key => $cart_item ) { // 修改对应自定义字段 $cart_contents[$cart_item_key]['custom_data']['pickup_week'] = $newDate; $cart_contents[$cart_item_key]['custom_data']['pickup_day_of_week'] = $newDate; } // 将修改后的内容统一写回购物车 WC()->cart->cart_contents = $cart_contents; // 所有修改完成后仅执行一次会话存储,避免重复写入冲突 WC()->cart->set_session(); } if (empty($newDate)) { die('日期更新失败:未获取到有效日期参数'); } $formattedDate = date('D, M j Y', strtotime($newDate)); die('Dates updated to '. $formattedDate); }
额外排查点
如果修复后仍有偶发清空问题,可以检查前端是否存在重复提交的情况:比如用户点击更新按钮太快触发了多次AJAX请求,第二次请求参数异常会覆盖第一次的正常写入,给按钮加1-2秒的点击防抖即可解决。
内容的提问来源于stack exchange,提问作者Omar Shishani
相关产品推荐
相关产品推荐

