Ocultar condicionalmente los métodos de envío de WooCommerce según la clase de envío

6 minutos de lectura

avatar de usuario
el criadero

Usando WooCommerce v3.2.4 en Este sitio (aquí) (WP v4.9) y 11 productos con la clase de envío Sobrepeso/Exceso de tamaño a los que se les aplica una tarifa plana:
$20 a Canadá y $25 A los E.U.

Todos los demás productos tienen envío de tarifa plana de $10 (Canadá) y $15 (EE. UU.), a menos que el pedido haya terminado $100entonces el envío gratis se aplica automáticamente.

Mi cliente quiere que se deshabilite el envío gratuito si hay artículos con sobrepeso/tamaño en el carrito. El problema es que el carrito dice que no hay métodos de envío disponibles cuando hay una combinación de artículos normales y de gran tamaño en el carrito, y no se aplican métodos de envío.

Estoy usando Tasa de tabla de envío de XAdapter Woocommerce plugin para aplicar el mayor costo a las Clases de Envío “Sobrepeso”.

ACTUALIZAR

Desactivé este complemento porque me di cuenta de que podía usar la configuración de la zona de envío de WooCommerce para establecer una tarifa plana para clases de envío específicas. Vea la captura de pantalla a continuación:
Configuración de tarifa plana para una de mis zonas de envío

Estoy usando un código para:

  • ocultar el envío gratuito y las tarifas planas cuando existe la clase de envío “Sobrepeso” en el carrito
  • ocultar el método de envío “Sobrepeso” si esa clase no existe (siendo 163 el id de la clase de envío)

Aquí está ese código:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package){
    $hide_when_shipping_class_exist = array(
        163 => array(
            'flat_rate:1',
            'flat_rate:2',
            'free_shipping:3',
            'free_shipping:5'
        )
    );

    $hide_when_shipping_class_not_exist = array(
        163 => array( 'wf_woocommerce_shipping_pro:overweightoversizeoverweight')
    );

    $shipping_class_in_cart = array();
    foreach(WC()->cart->cart_contents as $key => $values) {
       $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
    }

    foreach($hide_when_shipping_class_exist as $class_id => $methods) {
        if(in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }

    foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
        if(!in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }
    return $available_shipping_methods;
}

EDITAR

Aquí hay una lista de ID de las tarifas por zona de envío:

Canadá

  • Tarifa Plana Regular | IDENTIFICACIÓN: flat_rate:1
  • Envío Gratis | IDENTIFICACIÓN: free_shipping:3
  • Recogida local | IDENTIFICACIÓN: local_pickup:4

Estados Unidos

  • Tarifa Plana Regular | IDENTIFICACIÓN: flat_rate:2
  • Envío gratis | IDENTIFICACIÓN: free_shipping:5

  • Hemos creado un complemento para ocultar el método de envío en función de varias condiciones, incluidas la clase de envío y las ubicaciones. elextensions.com/plugin/…

    – YajiV

    28 de febrero de 2019 a las 18:45


avatar de usuario
LoicTheAztec

ACTUALIZACIÓN 2: (Sin necesidad de complementos, solo configuración y código)

La siguiente función siempre mostrará el envío de “Recogida local” para Canadá y:

  1. Oculte los métodos de envío gratis cuando la clase de envío “Gran tamaño” está en los artículos del carrito. Para los Métodos de Envío “Tarifa Plana”, el costo será el establecido para la clase de envío “Exceso de tamaño”.
  2. si la clase de envío “Exceso de tamaño” no está configurada en los artículos del carrito:
    • Si el monto del carrito es menor que el monto objetivo de envío gratis: Oculte “Envío gratis”.
    • Si el monto del carrito supera el monto objetivo de envío gratuito: Oculte los métodos de envío “Tarifa plana”.

Aquí está ese código:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);
function wf_hide_shipping_method_based_on_shipping_class($rates, $package){

    // Defining & Initializing variables
    $free_shipping_rates = array(
        'free_shipping:3',
        'free_shipping:5'
    );

    // Defining & Initializing variables
    $shipping_class_id = 163;
    $free = array();
    $over_found = $has_free = false;

    // Check if "Oversize" shipping class (163) is in cart items
    foreach(WC()->cart->get_cart() as $key => $cart_item){
        if($cart_item['data']->get_shipping_class_id() == $shipping_class_id ){
            $over_found = true;
            break;
        }
    }

    // 1. Hiding free shipping but always show Local pickup for Canada
    if( $over_found ){
        foreach($free_shipping_rates as $rate_id) {
            unset( $rates[$rate_id] );
        }
    }
    // 2. Hiding Flat rate OR Free shipping --> depending on cart amount
    //   (but always show Local pickup for Canada)
    else {
        foreach ( $rates as $rate_id => $rate ) {

            // Hide all "Flat rates" when "Free Shipping" is available
            if ( 'free_shipping' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
                $has_free = true;
            } elseif ( 'local_pickup' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
            }
        }
        return $has_free ? $free : $rates;
    }
    return $rates;
}

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

Probado en WooCommerce 3 y funciona.


Actualizar los cachés de envío (necesario a veces):

1) Primero vacíe su carrito.
2) Este código ya está guardado en su archivo function.php.
3) Vaya a la configuración de una zona de envío y desactive una “tarifa plana” (por ejemplo) y guardar”. Luego vuelve a habilitar esa “tarifa plana” y “ahorra”. Ya has terminado y puedes probarlo.

  • Muchas gracias por tu respuesta. Implementé esa función, pero la probé y si tengo una combinación de artículos de gran tamaño y normales, ahora solo muestra la recogida local. Necesito que muestre solo la tarifa de tamaño grande si existe en el carrito y la recogida local si se encuentra en la zona de envío de Canadá. ¿Alguna idea sobre eso? Acercándose.

    – El criadero

    19 de noviembre de 2017 a las 4:36

  • En realidad, incluso si solo tengo artículos de gran tamaño en el carrito, solo muestra la recogida local.

    – El criadero

    19 de noviembre de 2017 a las 4:50

  • He agregado mi lista de identificaciones al final de mi pregunta. ¡Muchas gracias por ayudarme! Te lo agradezco mucho. Me he estado arrancando los pelos por esto durante días, jaja.

    – El criadero

    19 de noviembre de 2017 a las 5:23


  • @TheHatchery Volví a probar y actualicé el código… Esto está funcionando correctamente para su caso ahora… Pruébelo y hágamelo saber.

    – LoicTheAztec

    19 de noviembre de 2017 a las 12:40

  • He actualizado mi pregunta para reflejar que ya no estoy usando el complemento XAdapter, ¡solo la configuración de envío de WooCommerce y el código anterior! Funciona perfectamente ahora. Muchas gracias @LoicTheAztec 😀

    – El criadero

    20 de noviembre de 2017 a las 0:21

Esto es posible usando Tasa de tabla de envío de Woocommerce, solo necesita agregar las reglas adicionales. Debe agregar 7 reglas de envío. Puede ver las reglas de envío en la siguiente imagen:
La imagen contiene la regla de envío que debe agregar

Para las reglas anteriores, obtendrá los resultados deseados en una página de carrito. Adjunto algunas capturas de pantalla de la página del carrito en diferentes casos para sus referencias: Nota: Clase de envío del sombrero: regular y sudadera con capucha: sobrepeso.

Producto normal y con sobrepeso ordenados juntos

Producto de más de peso con pedidos superiores a $ 100

Envío gratuito para pedidos superiores a $ 100 con artículos regulares

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad