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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:49:57