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

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个核心问题:

  1. wp_die() 写在跳转逻辑之前,导致后续代码完全无法执行
  2. 动态绑定woocommerce_before_calculate_totals钩子时机错误,AJAX请求中绑定该钩子无法正确触发价格修改
  3. 未向前端返回包含跳转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:29:54