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

如何在AJAX调用中通过ID获取WooCommerce变体价格,wc_get_product返回空怎么办

问题解决方案

核心原因

  • 你看到的返回空对象大概率不是wc_get_product真的返回空,是WC_Product系列对象的属性默认是受保护的,直接用wp_send_json序列化时不会读取受保护属性,就会输出空对象
  • 第二个常见原因是漏注册WordPress AJAX接口对应的钩子,导致函数未正确执行

修复步骤

1. 注册AJAX钩子

在你的主题functions.php或者自定义插件代码中加入以下两行,确保AJAX请求能正确触发你的处理函数:

// 登录用户可用接口
add_action('wp_ajax_woocommerce_ajax_quantity_change', 'woocommerce_ajax_quantity_change');
// 未登录用户可用接口,不需要访客访问可以删掉
add_action('wp_ajax_nopriv_woocommerce_ajax_quantity_change', 'woocommerce_ajax_quantity_change');

2. 修正PHP处理函数

不要直接返回整个产品对象,用WC_Product提供的getter方法取出你需要的字段再返回,比如你需要的价格类字段:

function woocommerce_ajax_quantity_change() {
    $variationid = empty($_POST['variationid']) ? 0 : absint($_POST['variationid']);
    $variation = wc_get_product($variationid);
    // 验证是否拿到正确的变体对象
    if(!$variation || !is_a($variation, 'WC_Product_Variation')) {
        wp_send_json_error('无效的变体ID');
    }
    // 取出需要的字段返回
    $res = [
        'price' => $variation->get_price(),
        'regular_price' => $variation->get_regular_price(),
        'sale_price' => $variation->get_sale_price(),
        'variation_name' => $variation->get_name()
    ];
    wp_send_json_success($res);
    // wp_send_json已经自带终止执行逻辑,不需要额外加wp_die()
}

3. 可选:调整JS代码适配返回格式

success: function(response) {
    if(response.success) {
        // 直接取对应字段即可
        console.log('变体当前价格:', response.data.price);
    } else {
        console.log('请求错误:', response.data);
    }
}

排查验证方法

如果还是有问题,你可以在PHP代码中加入日志输出确认对象是否正确获取:

error_log(print_r($variation, true));

去网站的PHP错误日志中查看输出,就能确认wc_get_product是否真的返回了空对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:36:03