Tengo un complemento que envía un código de cupón de recomendación de defensores a los correos electrónicos que ingresan. Cuando la audiencia reciba este correo electrónico, me gustaría crear un flujo en el que puedan hacer clic en 'COMPRAR AHORA' en el correo electrónico y el cupón se agregará automáticamente.

A partir de ahora, para el enlace debajo del botón 'COMPRAR AHORA', ingresé lo siguiente:

websitename.biz/cart__trashed?code=DISCOUNTCODE

Para manejar $code he puesto esto en mi archivo functions.php:

add_action('woocommerce_before_cart', 'discount');
function discount( ) {
    global $woocommerce;
    $code= $_GET["code"];
   if(!empty($code)){       
    if($woocommerce->cart->add_discount($code)){ 
    echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';
        }
    }
}

El problema que estoy enfrentando aquí es:

  • Si no hay nada en el carrito cuando la audiencia visita el sitio web, el cupón no se aplicará.
  • Si se agregó algo y se quedó allí (debido a una cookie), el código de cupón se aplica perfectamente.

Creo que es porque el carrito está vacío, el código no funciona.

Solo quiero que el código se aplique cuando la audiencia hace clic en el enlace.

¿Cómo puedo hacer que esto funcione?

8
Mjall2 18 oct. 2017 a las 18:46

3 respuestas

La mejor respuesta

La forma correcta de hacerlo debería ser:

  • Establezca el código de cupón de la URL en la sesión del carrito como datos personalizados.
  • Aplique el descuento de este código de cupón cuando el cliente agregue el primer artículo al carrito.
  • Elimine el descuento de este cupón si el cliente vacía el carrito

Puede configurar cualquier código de cupón existente desde cualquier URL (como la página de la tienda, otras páginas de archivos, páginas de productos, las páginas de mi cuenta o cualquier página existente) agregando a esta url existente:
?code=DISCOUNTCODE en al final
(donde DISCOUNTCODE es el nombre del código de su cupón) .

Aquí está el código:

// Set coupon code as custom data in cart session
add_action('wp_loaded', 'add_coupon_code_to_cart_session');
function add_coupon_code_to_cart_session() {
    // Exit if no code in URL or if the coupon code is already set cart session
    if( empty( $_GET["code"] ) || WC()->session->get( 'custom_discount' ) ) return;

    if( ! WC()->session->get( 'custom_discount' ) ) {
        $coupon_code = esc_attr($_GET["code"]);
        WC()->session->set( 'custom_discount', $coupon_code );
        // If there is an existing non empty cart active session we apply the coupon
        if( ! WC()->cart->is_empty() ){
            WC()->cart->add_discount( $coupon_code );
        }
    }
}

// Add coupon code when a product is added to cart once
add_action('woocommerce_add_to_cart', 'add_coupon_code_to_cart', 10, 6 );
function add_coupon_code_to_cart( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ){
    $coupon_code = WC()->session->get( 'custom_discount' );
    $applied_coupons = WC()->session->get('applied_coupons');

    if( empty($coupon_code) || in_array( $coupon_code, $applied_coupons ) ) return;

    WC()->cart->add_discount( $coupon_code );
}

// Remove coupon code when user empty his cart
add_action('woocommerce_cart_item_removed', 'check_coupon_code_cart_items_removed', 10, 6 );
function check_coupon_code_cart_items_removed( $cart_item_key, $cart ){
    $coupon_code = WC()->session->get( 'custom_discount' );

    if( $cart->has_discount( $coupon_code ) && $cart->is_empty() );
        $cart->remove_coupon( $coupon_code );
}

El código va en el archivo function.php de su tema hijo activo (o tema activo) o en cualquier archivo de complemento.

Esto está probado y funciona

12
LoicTheAztec 26 nov. 2017 a las 20:59
add_action('woocommerce_before_cart', 'discount');
function discount( ) {
    global $woocommerce;
    $code= $_GET["code"];
   if(!empty($code)){       
    if(WC()->session->set( 'applied_coupons', $code )){ 
    echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';
        }
    }
}
0
Tarang koradiya 21 nov. 2017 a las 05:50

Use el siguiente código para que el cupón sea válido en cualquier situación

add_filter('woocommerce_coupon_is_valid','coupon_always_valid',10,1);
function coupon_always_valid($valid){
     $valid = true;
     return $valid ; 
}
1
Rajkumar Gour 22 nov. 2017 a las 13:29