Ocultar otros gastos de envío cuando se muestra el envío gratuito en Woocommerce excepto cuando exista Coste de la clase de envío
Para ocultar otros gastos de envío cuando se muestra el envío gratuito en Woocommerce excepto cuando exista Coste de la clase de envío mediante una función PHP, puedes utilizar el siguiente código:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
add_filter( 'woocommerce_package_rates', 'mostrar_solo_envio_gratuito', 10, 2 ); function mostrar_solo_envio_gratuito( $rates, $package ) { // Obtener el costo del envío gratuito $envio_gratuito = false; foreach ( $rates as $rate_id => $rate ) { if ( 'free_shipping' === $rate->method_id ) { $envio_gratuito = true; break; } } // Si no hay envío gratuito, retornar las tarifas normales if ( ! $envio_gratuito ) { return $rates; } // Encontrar la clase de envío actual $clase_envio_actual = ''; foreach ( $package['contents'] as $item ) { $clase_envio_actual = $item['data']->get_shipping_class(); if ( ! empty( $clase_envio_actual ) ) { break; } } // Si no hay clase de envío, retornar las tarifas normales if ( empty( $clase_envio_actual ) ) { return $rates; } // Verificar si la clase de envío actual tiene un costo $costo_clase_envio_actual = false; foreach ( $rates as $rate_id => $rate ) { if ( $clase_envio_actual === $rate->get_meta( 'shipping_class' ) && $rate->cost > 0 ) { $costo_clase_envio_actual = true; break; } } // Si hay un costo para la clase de envío actual, mostrar todas las tarifas if ( $costo_clase_envio_actual ) { return $rates; } // Si no hay costo para la clase de envío actual, ocultar todas las tarifas excepto el envío gratuito foreach ( $rates as $rate_id => $rate ) { if ( 'free_shipping' !== $rate->method_id ) { unset( $rates[ $rate_id ] ); } } return $rates; } |
Este código