La actualización de WooCommerce ajax estropea los valores

3 minutos de lectura

Actualmente estoy haciendo una tienda web con WooCommerce y tengo este carrito hecho al que puedes acceder en cualquier página en cualquier momento, puedes actualizar la cantidad de un producto dentro del carrito. El problema ocurre cada vez que hago esto, algunos valores se estropean. Por ejemplo, cuando trato de obtener WC()->cart->total devuelve 0.

Pero cuando voy a la página de pago, muestra todos los datos correctos del carrito, así que esto me hace pensar que me faltan algunos. action tengo que correr después de ajustar algo en el carro. he estado mirando a través de la set_quantity() funciones y se actualiza automáticamente total con $this->calculate_totals(); (lo intenté manualmente también).

Función Ajax:

public function set_quantity($direction = false, $product_id) {
    $response = array();
    $justOne = false;

    if($_GET['data']['direction'] && $_GET['data']['product_id']) {
        $direction = $_GET['data']['direction'];
        $product_id = $_GET['data']['product_id'];
        $justOne = true;
    }

    foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
        $_product = $values['data'];
        if ($product_id == $_product->id) {

            if($justOne && $direction == 'minus') {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] - 1, true);
                $response['success']['quantity'] = $values['quantity'] - 1;
            } else if($justOne && $direction == 'plus') {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] + 1, true);
                $response['success']['quantity'] = $values['quantity'] + 1;
            } else {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] + $direction, true);
            }

            $response['success']['line_total'] = '€ '.number_format((float)$response['success']['quantity'] * $_product->price, 2, '.', '');
            $response['success']['cart_count'] = WC()->cart->get_cart_contents_count();
            $response['success']['total'] = number_format((float)WC()->cart->total, 2, '.', '');
            die(json_encode($response));
        }
    }
    return false;
}

  • probaste este procedimiento $woocommerce->cart->get_total(); WC()->carrito->get_total(); ?

    – Gopalakrishnan

    6 de septiembre de 2016 a las 5:11


  • ¿Cuándo y cómo llamas a esta función que proporcionaste?

    –Reigel Gallarde

    7 sep 2016 a las 0:38

  • @Gopalakrishnan Creo que también probé ese, no recuerdo, lo probaré cuando tenga tiempo, gracias por su respuesta

    – LVDM

    7 de septiembre de 2016 a las 8:06

  • @Reigel Cuando alguien ajusta la cantidad en mi carrito de compras (podría ser cualquier página).

    – LVDM

    7 de septiembre de 2016 a las 8:06

  • Respuesta tardía de @Gopalakrishnan pero WC()->cart->get_total(); devuelve 0.00 también.

    – LVDM

    16/09/2016 a las 10:53

Utilice esta función ajax modificada. He probado esto. Funcionará.

Función Ajax modificada:

public function set_quantity($direction = false, $product_id) {
    $response = array();
    $justOne = false;

    if($_GET['data']['direction'] && $_GET['data']['product_id']) {
        $direction = $_GET['data']['direction'];
        $product_id = $_GET['data']['product_id'];
        $justOne = true;
    }

    foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
        $_product = $values['data'];
        if ($product_id == $_product->id) {

            if($justOne && $direction == 'minus') {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] - 1, true);
                $response['success']['quantity'] = $values['quantity'] - 1;
            } else if($justOne && $direction == 'plus') {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] + 1, true);
                $response['success']['quantity'] = $values['quantity'] + 1;
            } else {
                WC()->cart->set_quantity($cart_item_key, $values['quantity'] + $direction, true);
            }

            if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
                define( 'WOOCOMMERCE_CART', true );
            }
            WC()->cart->calculate_totals();

            $response['success']['line_total'] = '€ '.number_format((float)$response['success']['quantity'] * $_product->price, 2, '.', '');
            $response['success']['cart_count'] = WC()->cart->get_cart_contents_count();
            $response['success']['total'] = number_format((float)WC()->cart->total, 2, '.', '');
            die(json_encode($response));
        }
    }
    return false;
}

  • ¡Gracias por su respuesta, probaré tan pronto como encuentre el tiempo!

    – LVDM

    7 sep 2016 a las 8:05

  • Finalmente tuve tiempo de probarlo, y no me funciona. WC()->cart->get_total() & WC()->cart->total ambos devuelven ‘0.00’ por alguna extraña razón.

    – LVDM

    16/09/2016 a las 10:52

  • En realidad funciona, cometí un error de mi parte :-), muchas gracias amigo.

    – LVDM

    16/09/2016 a las 10:57

¿Ha sido útil esta solución?