php - Ocultar métodos de envío para una clase de envío específica en WooCommerce
wordpress cart (2)
Básicamente, estoy tratando de hacer que el método de tarifa plana Id
flat_rate:7
deshabilitado
cuando hay artículos de carrito que tienen la clase de envío "Roller" (ID
92
).
Este es el código que probé:
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(
92 => array(
''flat_rate:7''
)
);
$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]);
}
}
}
return $available_shipping_methods;
}
El ID de clase de envío
92
es la clase de envío y quiero ocultar
flat_rate:7
para ello.
Mi sitio es este: http://www.minimoto.me/ WordPress: 4.8.4 WooCommerce: 3.1.1
Cualquier ayuda será apreciada.
Al ajustar el código (aplausos) de LoicTheAztec, pude desarmar un método de envío para cada paquete basado en 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 desarmar mi envío ''UPS UPS Ground'' gratuito si el paquete contiene algo más que artículos ''Estándar'' (shipping_class_id 371 en mi caso).
El escenario de la publicación original (deshabilite el método x si se envía la clase 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;
}
Actualización 2019: en su lugar, debe probar esta forma más corta, compacta y efectiva:
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 secundario 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 planas".
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 la identificación de la clase de envío.
1) En la base de datos en la tabla
wp_terms
:
Busque un nombre de término o una babosa de término y obtendrá el ID de 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 html de su navegador, inspeccione un campo de tarifa de clase de envío como:
En el atributo imput name tienes
woocommerce_flat_rate_class_cost_64
.
Entonces 64 es la ID para la clase de envío.
Obtenga la ID de tarifa del método de envío:
Para obtener los ID de tarifa de métodos de envío relacionados, algo así como
flat_rate:12
, inspeccione con el inspector de código de su navegador cadaname
atributo de botón de radio relacionado como: