Ocultar otros métodos de envío cuando esté disponible envío gratuito

De forma predeterminada, WooCommerce mostrará todos los métodos de envío que coinciden con el cliente y el contenido del carrito. Esto significa que el envío gratuito también se mostrará junto con la tarifa plana y otros métodos de envío . La funcionalidad para ocultar todos los demás métodos y solo mostrar envío gratuito requiere un código PHP personalizado o un complemento / extensión / plugin.

Antes de agregar fragmentos, borra la caché de WooCommerce.

Accede a WooCommerce -> Estado del sistema -> Herramientas -> Datos temporales de woocommerce -> Borrar datos temporales

Añade este código al archivo functions.php del tema hijo, hay que recordar que si se agrega directamente en el tema padre una vez se actualice el tema se eliminara dicho código, o mediante un complemento que permite agregar funciones personalizadas  como el complemento de code snippets.

Code Snippets

Podremos ubicar el archivo functions.php accediendo  CPanel – > Administrador de archivos -> Public_html -> Dominio -> Wp-content -> Themes > Tu_plantilla  Archivo functions.php

Añade el siguiente fragmento de código PHP al final del archivo, para realizar las determinadas acciones:

Mostrar únicamente envío gratuito:

Oculta todo, pero free_shipping si está disponible y es compatible con las zonas de envío.

/**
 * Mostrar únicamente envío gratuito.
 */
function my_hide_shipping_when_free_is_available( $rates ) {
	$free = array();
	foreach ( $rates as $rate_id => $rate ) {
		if ( 'free_shipping' === $rate->method_id ) {
			$free[ $rate_id ] = $rate;
			break;
		}
	}
	return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

Mostrar recogida local y envio gratuito:

Ocultar todo menos free_shipping y local_pickup si está disponible y es compatible con las zonas de envío.

/**
* mostrar recogida local y envio gratuito
*/

function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}

if ( ! empty( $new_rates ) ) {
//Save local pickup if it's present.
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}

return $rates;
}

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

Mostrar solo envío gratuito en todos los estados excepto el que seleccionemos:

Mostrar solo envío gratuito en todos los estados excepto en la lista de exclusión. Ocultar el envío gratuito si el cliente se encuentra en uno de los estados enumerados.

/**
* Mostrar solo envío gratuito en todos los estados excepto en los que seleccionemos
*/

function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}

if ( ! empty( $new_rates ) ) {
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}

return $rates;
}

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

Mostrar solo envío gratuito en todos los estados excepto los seleccionados:

Mostrar solo envío gratuito en todos los estados excepto en la lista de exclusión con lo que se oculta el envío gratuito si el cliente se encuentra en uno de los estados enumerados

/**
* ocultar únicamente para los estados seleccionados 
*
* Change $excluded_states = array( 'AK','HI','GU','PR' ); to include all the states that DO NOT have free shipping
*/
add_filter( 'woocommerce_package_rates', 'hide_all_shipping_when_free_is_available' , 10, 2 );

/**
* Ocultar TODAS las opciones de envío cuando el envío gratuito está disponible
*
* @param array $available_methods
*/
function hide_all_shipping_when_free_is_available( $rates, $package ) {

$excluded_states = array( 'AK','HI','GU','PR' );
if( isset( $rates['free_shipping'] ) AND !in_array( WC()->customer->shipping_state, $excluded_states ) ) :
// Get Free Shipping array into a new array
$freeshipping = array();
$freeshipping = $rates['free_shipping'];

// Empty the $available_methods array
unset( $rates );

// agregar envio gratis en $avaialble_methods
$rates = array();
$rates[] = $freeshipping;

endif;

if( isset( $rates['free_shipping'] ) AND in_array( WC()->customer->shipping_state, $excluded_states ) ) {

// remover opcion de envio gratuito
unset( $rates['free_shipping'] );

}

return $rates;
}

 

Updated on 4 febrero, 2022

Related Articles