Saltar al contenido

Ocultar métodos de envío para una clase de envío específica en WooCommerce

Solución:

Actualización 2019: En su lugar, debería probar esta forma más corta, compacta y eficaz:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping method to hide
    $method_key_id = 'flat_rate:7';

    // Checking in cart items
    foreach( $package['contents'] as $item ){
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            unset($rates[$method_key_id]); // Remove the targeted method
            break; // Stop the loop
        }
    }
    return $rates;
}

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

Probado y funciona.

A veces, es posible que deba actualizar los métodos de envío que van a las áreas de envío, luego deshabilitar / guardar y volver a habilitar / guardar sus métodos de envío de “tarifas fijas”.

Relacionado: Ocultar métodos de envío para clases de envío específicas en WooCommerce

Para encontrar los ID de los métodos de envío y los ID de las clases de envío, consulte a continuación …


Actualización para muchos métodos de envío diferentes (relacionados con sus comentarios):

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array('flat_rate:7', 'local_pickup:3');

    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }
    return $rates;
}

Probado y funciona …


Encontrar el ID de la clase de envío.

1) En la base de datos bajo wp_terms mesa:

Busque un nombre de término o un término slug y obtendrá el ID del término (el ID de la clase de envío).

2) En la configuración de envío de Woocommerce editando una “tarifa plana”, con la herramienta de inspección de html de su navegador, inspeccione un campo de tarifa de clase de envío como:

ingrese la descripción de la imagen aquí

En el atributo de nombre de entrada tienes woocommerce_flat_rate_class_cost_64. Por tanto, 64 es el ID de la clase de envío.


Obtenga el ID de tarifa del método de envío:

Para conseguir lo relacionado ID de tarifas de métodos de envío, algo como flat_rate:12, inspeccione con el inspector de código de su navegador cada atributo de botón de opción relacionado name igual que:

ingrese la descripción de la imagen aquí

Al modificar el código de LoicTheAztec (salud), pude desarmar un método de envío para cada paquete en función de la clase de envío de su contenido, en lugar del carrito en su conjunto. Quizás también ayude a alguien más:

// UNSET A SHIPPING METHOD FOR PACKAGE BASED ON THE SHIPPING CLASS(es) OF ITS CONTENTS
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    foreach( $package['contents'] as $package_item ){ // Look at the shipping class of each item in package

        $product_id = $package_item['product_id']; // Grab product_id
        $_product   = wc_get_product( $product_id ); // Get product info using that id

        if( $_product->get_shipping_class_id() != 371 ){ // If we DON'T find this shipping class ID
            unset($rates['wbs:9:dae98e94_free_ups_ground']); // Then remove this shipping method
            break; // Stop the loop, since we've already removed the shipping method from this package
        }
    }
    return $rates;
}

Este código me permite desactivar mi envío de ‘UPS Ground gratis’ si el paquete contiene cualquier cosa que no sean artículos ‘Estándar’ (shipping_class_id 371 en mi caso).

El escenario de la publicación original (método de desactivación X si clase de envío y) funcionaría así:

// UNSET A SHIPPING METHOD FOR PACKAGE BASED ON THE SHIPPING CLASS(es) OF ITS CONTENTS
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    foreach( $package['contents'] as $package_item ){ // Look at the shipping class of each item in package

        $product_id = $package_item['product_id']; // Grab product_id
        $_product   = wc_get_product( $product_id ); // Get product info using that id

        if( $_product->get_shipping_class_id() == 92 ){ // If we DO find this shipping class ID
            unset($rates['flat_rate:7']); // Then remove this shipping method
            break; // Stop the loop, since we've already removed the shipping method from this package
        }
    }
    return $rates;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *