
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.

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