es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

WooCommerce añadir producto con add_to_cart

Normalmente suena como una tarea bastante simple. Quiero agregar un producto (regalo) al carrito cuando se agrega un producto específico al carrito. Tan pronto como se elimine el “producto normal”, el producto gratuito también debería eliminarse.

Mi enfoque actual es agregar el producto gratuito al carrito con datos meta personalizados. Si se hace clic en el botón de eliminar, verificará la meta y solo eliminará esos.

Mi problema es que el producto gratuito solo se agrega al carrito una vez. Si elimino esta “verificación”, la función deja de funcionar. ¿Qué estoy haciendo mal?

/* Agregar regalo gratis para productos */
function gift_add_product_to_cart() {
$product_id = array(20070, 39039); //Id. del producto gratuito que se agregará al carrito
$allowedprdIds = array(38162, 38157); // Id. de productos donde se agregará el producto gratuito
$is_present = false;
$is_allowedPrd = false;
$cart = WC()->cart->get_cart();
//verificar si el producto ya está en el carrito
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values[‘data’];
if (in_array($_product->get_id(), $product_id)){
$is_present = true;
}
if (in_array($_product->get_id(), $allowedprdIds) ){
$is_allowedPrd = true;
}
}

// si el producto gratuito no se encuentra, agréguelo
if (!$is_present && $is_allowedPrd){
  foreach($product_id as $freeProduct => $id){
    /*WC()->cart->add_to_cart(20070);*/
    WC()->cart->add_to_cart($id,1, NULL, NULL, array('freeDosMas' => 'yes'));
  }
}

}
}
add_action( ‘woocommerce_add_to_cart’, ‘gift_add_product_to_cart’, 10, 2 );

/* Elimine el producto gratuito si se elimina el producto */
function remove_gift_from_cart() {
global $woocommerce;
$prod_to_remove = array(20070, 39039); //Id. del producto gratuito
$allowedprdIds = array(38162, 38157);
$is_freeGift = false;

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
if (in_array($cart_item[‘product_id’], $prod_to_remove) && $cart_item[‘freeDosMas’] == ‘yes’){
$is_freeGift = true;
}
if (in_array($cart_item[‘product_id’], $allowedprdIds) ){
$is_allowedPrd = true;
}
}

if($is_freeGift && !$is_allowedPrd){
foreach($prod_to_remove as $removeProduct => $id){
if (in_array($cart_item[‘product_id’], $prod_to_remove)) {
WC()->cart->remove_cart_item( $cart_item_key );
}
}
}

}
add_action( ‘woocommerce_cart_item_removed’, ‘remove_gift_from_cart’, 10, 2 );

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la condición de comprobar si el producto gratuito ya está presente en el carrito. Según la implementación actual, el producto gratuito solo se agregará al carrito si no está presente en el carrito y se agrega el producto principal al carrito. Sin embargo, cuando se elimina el producto principal, el producto gratuito seguirá presente en el carrito porque no se agregó de nuevo.

    Para solucionarlo, puede agregar una comprobación en la función remove_gift_from_cart para eliminar el producto gratuito cuando se elimina el producto principal. Puede hacer esto comprobando si el producto principal no está presente en el carrito y el producto gratuito está presente en el carrito con el valor de metadatos establecido en “sí”. Si esta condición es verdadera, entonces puede eliminar el producto gratuito del carrito.

    Así es como puede modificar la función remove_gift_from_cart:

     “`php
    /* Eliminar producto gratuito si se elimina el producto */
    function remove_gift_from_cart( $cart_item_key, $cart ) {
    global $woocommerce;

    $prod_to_remove = array(20070, 39039); // ID del producto gratuito
    $allowedprdIds = array(38162, 38157);
    $is_freeGift = false;
    $is_allowedPrd = false;

    // verificar si el producto permitido está presente en el carrito
    foreach ( $cart->get_cart() as $cart_item ) {
    if (in_array($cart_item[‘product_id’], $allowedprdIds) ){
    $is_allowedPrd = true;
    break;
    }
    }

    // verificar si el producto gratuito está presente en el carrito
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
    if (in_array($cart_item[‘product_id’], $prod_to_remove) && $cart_item[‘freeDosMas’] == ‘yes’){
    $is_freeGift = true;
    break;
    }
    }

    // Eliminar producto gratuito si el producto permitido no está presente en el carrito
    if($is_freeGift && !$is_allowedPrd){
    foreach($prod_to_remove as $removeProduct => $id){
    if (in_array($cart_item[‘product_id’], $prod_to_remove)) {
    $cart->remove_cart_item( $cart_item_key );
    break;
    }
    }
    }
    }
    add_action( ‘woocommerce_cart_item_removed’, ‘remove_gift_from_cart’, 10, 2 );
    “`

    Con esta modificación, el producto gratuito se eliminará del carrito cuando se elimine el producto principal y se volverá a agregar cuando se vuelva a agregar el producto principal.

Comments are closed.