Woocommerce WC()->购物车->set_cart_contents() 不起作用

TDE*_*ypt 5 wordpress checkout cart woocommerce

我有一个带有定价表的自定义定价 WP 页面。在那里我得到了 3 个参数,即 $product_id、$quantity、$total_price。我已经像普通的 WC 产品一样创建了产品,给出了每个产品的初始价格、描述等,并获得了 ID。

然后参数通过 Ajax 发送到 PHP 函数。这个功能:

function my_ajax_functions() {
    check_ajax_referer( 'my_ajax_nonce', 'security' );
    if('checkout' == esc_attr($_POST['required_action'])) {
        $product = esc_attr($_POST['product_id']);
        $qty = esc_attr($_POST['quantity']);
        $price = ltrim(esc_attr($_POST['total_price']), '$');
            WC()->cart->empty_cart();
            WC()->cart->add_to_cart( $product, $qty);
            $cart = WC()->cart->get_cart_contents();
            foreach( $cart as $key => $value ) {
                $value['data']->price = $price/$qty; // Set the per unit price, so, it match when cart sub total is calculated
            }
            WC()->cart->set_cart_contents($cart->cart_contents);
            WC()->cart->maybe_set_cart_cookies();
            WC()->cart->calculate_totals();
    }
    die();
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,虽然添加了产品,添加了数量,但购物车坚持显示,按照初始产品价格计算。

例子:

假设产品 A 的初始价格为 15 美元...在定价页面中,客户订购了 5 件,因此价格为 75 美元。如果他添加第 6 个单位,他将获得 50% 的折扣(仅针对额外单位,整个单位),因此,6 个单位的价格变为 82.5 美元。这是页面通过 Ajax 发送的内容:

  • Product_id = 产品 A 的 ID(正确)
  • 数量 = 6(没问题)
  • 总价格 = 82.5 美元(这是问题所在)

无论我做什么,购物车显示总计 = 6 x 15 = 90 美元

我在这里缺少什么?

谢谢。

小智 1

那这个呢?

function my_ajax_functions() {
    check_ajax_referer( 'my_ajax_nonce', 'security' );
    if('checkout' == esc_attr($_POST['required_action'])) {
        $product = esc_attr($_POST['product_id']);
        $qty = esc_attr($_POST['quantity']);
            $price = ltrim(esc_attr($_POST['total_price']), '$');
            WC()->cart->empty_cart();
            WC()->cart->add_to_cart( $product, $qty);
            $cart = WC()->cart->get_cart();
            foreach( $cart as $key => $value ) {
                $value['data']->set_price($price/$qty); // Set the per unit price, so, it match when cart sub total is calculated
            }
            WC()->cart->maybe_set_cart_cookies();
            WC()->cart->calculate_totals();
    }
    die();
}
Run Code Online (Sandbox Code Playgroud)