使用woocommerce_before_delete_order_item钩子后订单页删除条目不自动更新
问题原因
页面不自动更新的核心原因是钩子函数执行过程中提前关闭了数据库连接,打断了WooCommerce删除订单项的AJAX请求正常流程,前端没有收到正确的成功响应,所以不会触发UI层面的条目移除操作。同时你的代码里还有不必要的循环、SQL注入风险两个潜在问题。
修复方案
修改后的代码如下:
add_action('woocommerce_before_delete_order_item', 'remove_item_from_qm_shared_db'); function remove_item_from_qm_shared_db($item_id){ global $qm_db_link; // 直接获取目标订单项,无需遍历所有商品 $item = wc_get_order_item($item_id); if (!$item) return; $order_id = $item->get_order_id(); $qm_order_id = get_post_meta($order_id, '_qm_order_id', true); if (empty($qm_order_id)) return; $product = $item->get_product(); if (!$product) return; $check_qm_product = trim($product->get_meta('qm_inventory_type')); if (!empty($check_qm_product)) { $sku = $product->get_sku(); $sku_size_arr = explode("-", $sku); if (count($sku_size_arr) < 2) return; // 使用预处理语句避免SQL注入 $stmt = $qm_db_link->prepare("DELETE FROM orderproducts WHERE OrderId = ? AND Sku = ? AND `Size` = ?"); $stmt->bind_param("iss", $qm_order_id, $sku_size_arr[0], $sku_size_arr[1]); $stmt->execute(); $stmt->close(); } // 数据库连接关闭移到最后,避免提前终止影响WooCommerce原生逻辑 if (isset($qm_db_link)) { $qm_db_link->close(); } }
本次修改核心调整点:
- 移除了全订单商品遍历逻辑,直接通过订单项ID获取目标商品,降低性能开销
- 新增了多处空值校验,避免异常情况下的PHP报错打断AJAX响应
- 替换原有的直接拼接SQL逻辑为预处理语句,彻底避免SQL注入风险
- 将数据库连接关闭操作移到函数末尾,确保WooCommerce原生删除逻辑的数据库操作可以正常执行完成
- 移除了冗余的break逻辑,优化代码执行流程
验证方法
修改后重新测试删除功能,可打开浏览器开发者工具的「网络」面板,筛选XHR请求,点击删除按钮后查看对应请求的响应内容,若没有PHP报错输出,前端就会自动识别删除成功,移除页面上对应的订单项,无需手动刷新。
内容的提问来源于stack exchange,提问作者Mainul Hasan
相关产品推荐
相关产品推荐

