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:
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 relacionadoname
igual que:
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;
}