Woocommerce, oculta el método de envío según la clase de envío

4 minutos de lectura

Woocommerce oculta el metodo de envio segun la clase de
SeanEnns

Estoy tratando de ocultar todos los métodos de envío menos uno en función de la clase de envío, esencialmente forzando el método nocturno de FedEx cuando se selecciona un producto que pertenece a una clase específica.

Estoy comenzando con este código y modificándolo como se indica a continuación:

add_filter( 'woocommerce_available_shipping_methods', 'hide_shipping_based_on_class' ,    10, 1 );

function check_cart_for_share() {

// load the contents of the cart into an array.
global $woocommerce;
$cart = $woocommerce->cart->cart_contents;

$found = false;

// loop through the array looking for the tag you set. Switch to true if the tag is     found.
foreach ($cart as $array_item) {
$term_list = wp_get_post_terms( $array_item['product_id'], 'product_shipping_class', array( "fields" => "names" ) );

if (in_array("Frozen",$term_list)) {

      $found = true;
      break;
    }
}

return $found;

}

function hide_shipping_based_on_class( $available_methods ) {

// use the function above to check the cart for the tag.
if ( check_cart_for_share() ) {

// remove the rate you want
unset( $available_methods['canada_post,purolator,fedex:FEDEX_GROUND,fedex:GOUND_HOME_DELIVERY'] ); 
}

// return the available methods without the one you unset.
return $available_methods;

}

Sin embargo, no parece estar ocultando ningún método de envío. No estoy seguro de lo que me estoy perdiendo…

Es una instalación multisitio, la estoy probando en el lado canadiense en http://stjeans.harbourcitydevelopment.com

Estoy ejecutando el módulo de envío Table Rate, así como los módulos de FedEx, Purolator y Canada Post.

Tuve el mismo problema y me ayudó modificar tu código. Un problema es que “woocommerce_disponible_envío_métodos” el filtro está en desuso de WooCommerce 2.1. Por lo tanto, debe usar el nuevo: “woocommerce_package_tarifas“. Hay Tutorial WooCommerce para una tarea similar, también.

Por lo tanto, cambié el gancho de filtro, y cuando la condición es verdadera, itero todos los métodos/tarifas de envío, encuentro el que quiero mostrar al cliente, creo una nueva matriz a partir de ella y devuelvo esta matriz (con solo un artículo).

Creo que su problema fue (además del enlace en desuso) principalmente en unset incorrecto ($ métodos_disponibles)[…]) línea. No podría funcionar así.

Así que aquí está mi código:

add_filter( 'woocommerce_package_rates', 'hide_shipping_based_on_class' ,    10, 2 );
function hide_shipping_based_on_class( $available_methods ) {
    if ( check_cart_for_share() ) {
        foreach($available_methods as $key=>$method) {
            if( strpos($key,'YOUR_METHOD_KEY') !== FALSE ) {
                $new_rates = array();
                $new_rates[$key] = $method;
                return $new_rates;
            }
        }
    }
    return $available_methods;
}

¡Advertencia! Descubrí que woocommerce_package_rates gancho no se dispara cada vez, pero solo cuando cambia los artículos o la cantidad de artículos en su carrito. O eso me parece. Tal vez esas tarifas disponibles se almacenan en caché de alguna manera para el contenido del carrito.

  • Puede hacer que woocommerce_package_rates se active siempre activando el modo de depuración de envío. Vaya a WooCommerce > Envío > Opciones de envío > Habilitar modo de depuración.

    –Ryan Hertz

    24 de marzo de 2018 a las 17:51

  • +1 por la advertencia sobre el gancho que no se dispara cada vez a menos que actualice los artículos en su carrito. No tenía idea de por qué el gancho parecía no funcionar en absoluto.

    – jwinn

    04/04/2018 a las 21:35

  • Gracias a ambos por estos comentarios. Esta cosa que no disparaba me estaba volviendo loco.

    – Eolis

    9 de abril de 2018 a las 16:43

  • Bueno, bueno, bueno, si @Ryan no es un salvavidas… 3 años después, un pobre tipo también se estaba volviendo loco. y u not fire????

    – brasofilo

    29 mayo 2021 a las 20:25

1641815062 701 Obtener pais de latitud longitud
Nishad arriba

El siguiente fragmento de código le permite ocultar los métodos de envío según la clase de envío. La descripción detallada está disponible aquí

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

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package)
{
$hide_when_shipping_class_exist = array(
    42 => array(
        'free_shipping'
    )
);

$hide_when_shipping_class_not_exist = array(
    42 => array(
        'wf_shipping_ups:03',
        'wf_shipping_ups:02',
         'wf_shipping_ups:01'
    ),
    43 => array(
        'free_shipping'
    )
);


$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;
}

¿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