WooCommerce样品订购功能时好时坏问题排查求助
WooCommerce样品订购插件时好时坏,部分样品无法加入购物车的排查与修复
核心问题排查与修复
1. 数据库查询的安全与容错缺陷
你的visualizer-modal.php中直接拼接SQL语句,且未处理样品SKU不存在的场景:
- 若样品SKU未同步到
wp_wc_product_meta_lookup表(比如新产品未触发WooCommerce数据同步),get_results()[0]->product_id会直接报错,导致sample_id为空。 - 空的
sample_id传到后台后,无法通过$_POST['product_id'] > 0的校验,自然无法加入购物车。
修复代码(替换visualizer-modal.php中的查询部分):
// 安全预处理查询,避免SQL注入,同时处理无结果的情况 $sample_product = $GLOBALS['wpdb']->get_row( $GLOBALS['wpdb']->prepare( "SELECT `product_id` FROM `wp_wc_product_meta_lookup` WHERE `sku` = %s", $sample_sku ) ); $sample_id = $sample_product ? trim($sample_product->product_id) : ''; // 可选:找不到样品时隐藏订购按钮,避免无效请求 if (empty($sample_id)) { echo '<style>#order-sample { display: none; }</style>'; }
2. 日志输出错误,无法定位问题
functions.php中日志打印的是$_POST['sku'],但AJAX请求传递的参数是product_sku,导致日志始终显示无效信息,无法确认实际传递的SKU是否正确。
修复代码:
// 修正参数名,同时新增产品ID日志便于排查 write_log(create_message('sample sku: ' . $_POST['product_sku'])); write_log(create_message('sample product id: ' . $_POST['product_id']));
3. 缺少失败原因的详细日志
wc()->cart->add_to_cart返回false的原因多样(产品不可购、库存为0、已下架、可变产品未传变体ID等),当前代码仅返回模糊错误,无法定位具体问题。
优化functions.php中的order_sample函数:
function order_sample() { $cart_item_key = null; $error_msg = "Error: not added!"; if ((isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'nonce_custom_atc')) && (isset($_POST['product_id']) && $_POST['product_id'] > 0) && (isset($_POST['quantity']) && $_POST['quantity'] > 0) && (isset($_POST['cost']) && $_POST['cost'] > 0)) { $sample_product_id = intval($_POST['product_id']); $sample_product = wc_get_product($sample_product_id); // 先检查产品基础状态 if (!$sample_product) { $error_msg = "Failed: Sample product not found (ID: {$sample_product_id})"; } elseif (!$sample_product->is_purchasable()) { $error_msg = "Failed: Sample product is not purchasable (ID: {$sample_product_id})"; } elseif (!$sample_product->is_in_stock()) { $error_msg = "Failed: Sample product is out of stock (ID: {$sample_product_id})"; } elseif (!$sample_product->is_visible()) { $error_msg = "Failed: Sample product is not visible (ID: {$sample_product_id})"; } else { // 尝试加入购物车 $cart_item_key = wc()->cart->add_to_cart( $sample_product_id, intval($_POST['quantity']), 0, array(), array( 'cost'=>floatval($_POST['cost']), 'thumbnail_url'=>esc_attr($_POST['thumbnail_url']), 'sku'=>sanitize_text_field($_POST['product_sku']), ) ); if (!$cart_item_key) { // 捕获WooCommerce内置错误提示 $notices = wc_get_notices('error'); if (!empty($notices)) { $error_msg = "Failed: " . implode(' ', $notices[0]); } else { $error_msg = "Failed: Unknown error adding sample to cart (ID: {$sample_product_id})"; } } } } // 记录详细请求数据与错误信息 write_log(create_message($error_msg)); write_log(create_message('Received request data: ' . print_r($_POST, true))); wp_die(isset($cart_item_key) && $cart_item_key ? "Added to cart!" : $error_msg); }
4. 模板未定义变量的隐患
visualizer-modal.php中wp_get_attachment_image_url($cart_thumbnail, 'full')的$cart_thumbnail未定义,会导致缩略图URL为空,虽不影响加购物车,但可能引发其他异常。
修复代码:
<div class="hidden" id="thumbnail-url"> <?php echo wp_get_attachment_image_url($product->get_image_id(), 'full') ?> </div>
额外检查点
- 确认所有样品产品状态:必须为发布状态,库存数量>0,勾选“允许购买”;若为可变产品,需确保传递正确的变体ID(当前代码仅支持简单产品)。
- 在浏览器控制台查看AJAX请求参数,确认
product_id为有效数字,而非空值或字符串。 - 同步WooCommerce产品查找表:在WooCommerce工具中执行“重新计算产品查找表”操作,确保所有样品SKU已同步到
wp_wc_product_meta_lookup表。
内容的提问来源于stack exchange,提问作者jstrother
相关产品推荐
相关产品推荐

