如何在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
相关产品推荐
相关产品推荐

