WooCommerce自定义Ajax加购并修改商品价格问题求助
问题描述
点击id为#pagoboton的按钮时,需实现以下功能:
- 将指定ID的商品加入购物车
- 修改该商品价格为自定义值
- 跳转到支付页面
现有前端Ajax请求与后端PHP代码测试未成功,相关代码如下:
前端Ajax代码
jQuery(document).ready(function($) { $('#pagoboton').click(function() { var product_id = 14589; // 替换为目标商品ID var product_price = 200; // 替换为自定义价格 var ajaxurl = '<?php echo home_url('wp-admin/admin-ajax.php'); ?>'; $.post( ajaxurl, { action: 'cotizar_producto', product_id: product_id, product_price: product_price }, function(response){ if (response.success) { window.location.href = response.redirect_url; } }); }); });
后端functions.php原代码
add_action('wp_ajax_cotizar_producto', 'cotizar_producto'); add_action('wp_ajax_nopriv_cotizar_producto', 'cotizar_producto'); function cotizar_producto() { // 获取表单数据 $product_id = $_REQUEST['product_id']; $product_price = floatval($_REQUEST['product_price']); // 转换为十进制数 WC()->cart->add_to_cart($product_id, 1, $variation_id = 0, array(), array('total' => $product_price)); add_action('woocommerce_before_calculate_totals', function ($cart) use ($product_id, $product_price) { //if (is_admin() && !defined('DOING_AJAX')) return; foreach ($cart->get_cart() as $cart_item_key => $cart_item) { // 验证是否为目标商品 if ($cart_item['product_id'] == $product_id) { // 定义新价格 $nuevo_precio = $product_price; // 设置商品新价格 $cart_item['data']->set_price($nuevo_precio); // 更新购物车 $cart->cart_contents[$cart_item_key] = $cart_item; } } }); wp_die(); // 这里需要添加跳转到支付页面的代码 }
问题分析与修正方案
原代码存在3个核心问题:
wp_die()写在跳转逻辑之前,导致后续代码完全无法执行- 动态绑定
woocommerce_before_calculate_totals钩子时机错误,AJAX请求中绑定该钩子无法正确触发价格修改 - 未向前端返回包含跳转URL的响应数据
修正后的后端代码
add_action('wp_ajax_cotizar_producto', 'cotizar_producto'); add_action('wp_ajax_nopriv_cotizar_producto', 'cotizar_producto'); function cotizar_producto() { // 参数合法性验证(可选但推荐) if (!isset($_REQUEST['product_id']) || !isset($_REQUEST['product_price'])) { wp_send_json_error(array('message' => '缺少必要参数')); } $product_id = intval($_REQUEST['product_id']); $product_price = floatval($_REQUEST['product_price']); // 可选:清空购物车,确保只有当前商品 // WC()->cart->empty_cart(); // 添加商品到购物车,获取购物车项唯一标识 $cart_item_key = WC()->cart->add_to_cart($product_id, 1); if (!$cart_item_key) { wp_send_json_error(array('message' => '商品添加失败')); } // 获取刚添加的购物车项并修改价格 $cart_item = WC()->cart->get_cart_item($cart_item_key); if ($cart_item) { // 直接设置商品价格 $cart_item['data']->set_price($product_price); // 更新购物车项 WC()->cart->cart_contents[$cart_item_key] = $cart_item; // 重新计算购物车总价 WC()->cart->calculate_totals(); } // 获取标准结账页面URL $redirect_url = wc_get_checkout_url(); // 返回成功响应与跳转地址 wp_send_json_success(array('redirect_url' => $redirect_url)); }
关键修改说明
- 移除动态绑定的价格修改钩子,改为添加商品后直接修改购物车项价格,逻辑更直接
- 使用
wp_send_json_success()自动处理响应与wp_die(),同时向前端传递跳转URL - 增加参数验证与错误处理,提升代码健壮性
- 调用
calculate_totals()确保购物车总价同步更新 - 使用
wc_get_checkout_url()获取官方结账页地址,避免硬编码链接
内容的提问来源于stack exchange,提问作者Diego Martinez R
相关产品推荐
相关产品推荐

