Habilitar envío gratis en WooCommerce por productos específicos
Me gustaría saber si es posible habilitar el envío gratuito con WooCommerce solo si ciertos productos (o productos de ciertas categorías/clases de envío) están incluidos en el carrito.
La opción de Envío Gratuito solo se activa según el valor del carrito o mediante un código de cupón, así que investigué el envío de Tarifa Plana y descubrí que prioriza la clase de envío más cara sobre las más baratas. Esto significa que la clase de envío gratuito que creé nunca anula el cargo predeterminado.
Entiendo la lógica detrás de esto, pero es lo opuesto a lo que necesito, ya que la idea es incentivar las compras de productos con mayor margen de ganancia eliminando los cargos de envío cuando se incluyen en un pedido.
No sé si lo que estoy tratando de lograr simplemente no es posible dentro de WooCommerce. Un cupón que solo se aplica a ciertos productos/categorías parece ser lo más cercano que puedo conseguir, pero preferiría no obligar a los usuarios a ingresar un código en el checkout.
¿Alguien sabe si hay formas más simples de ofrecer envío gratuito a los usuarios que compran ciertos productos?

¿Alguien sabe si hay formas más sencillas de ofrecer envío gratis a los usuarios que compran ciertos productos?
En realidad, al crear un producto puedes marcarlo como Producto virtual directamente en el editor de productos y eso excluirá por completo el envío para ese artículo.

Esto funciona para productos simples, pero no para otros tipos de productos, como los variables, por ejemplo. Buen intento de todos modos. Esto probablemente funcionará para algunas personas.

¿Por qué no funciona esto para productos variables? Puedes marcar cada variación como virtual
.

Aquí hay un fragmento recopilado de algunos Gists de una discusión de problemas en GitHub vinculada por @Ewout en otra respuesta. He añadido un var_dump()
, para que puedas descomentar y comprobar qué es exactamente lo que deseas eliminar.
$available_methods
es un array
de:
$available_methods as $method_id => $method
Compara contra $method_id
si necesitas verificaciones más específicas.
// Ocultar la opción de envío estándar cuando el envío gratuito está disponible
add_filter( 'woocommerce_available_shipping_methods', 'wpse90835_hide_standard_shipping_when_free_is_available' );
/**
* Oculta la opción de Envío Estándar cuando el envío gratuito está disponible
*
* @param array $available_methods
*/
function wpse90835_hide_standard_shipping_when_free_is_available( $available_methods )
{
// ¡Para desarrolladores!: Haz un volcado de esto para ver qué puedes eliminar
# var_dump( $available_methods );
// eliminar la opción de envío estándar
if (
isset( $available_methods['free_shipping'] )
AND isset( $available_methods['flat_rate'] )
)
unset( $available_methods['flat_rate'] );
return $available_methods;
}

He creado un plugin de WooCommerce que permite a los usuarios configurar ajustes avanzados para el envío gratuito. En el plugin es posible seleccionar ciertos productos para el envío gratuito.
Puedes encontrar el plugin gratis en wordpress.org llamado WooCommerce Advanced Free Shipping
Espero que esto ayude.

Quizás esto no responda completamente a tu pregunta, pero el plugin de envío por tabla de tarifas te da la opción de establecer una prioridad para una tarifa en particular. Además, esta discusión ofrece muchas pistas sobre dónde podrías buscar soluciones

Gracias. Según la documentación de Table Rate Shipping, parece que hará lo que necesito. Si mi empleador acepta la licencia, actualizaré si resulta útil.

Basado en el código de kaiser (arriba), he creado el siguiente código:
/**
* Oculta la opción de envío gratuito cuando el envío estándar está disponible
*
* @param array $available_methods
*/
function mwe_hide_free_shipping_when_standard_shipping_is_available($available_methods) {
// elimina la opción de envío estándar
if (isset($available_methods['free_shipping']) AND isset( $available_methods['flat_rate'])) {
unset($available_methods['free_shipping']);
}
return $available_methods;
}
add_filter('woocommerce_available_shipping_methods', 'mwe_hide_free_shipping_when_standard_shipping_is_available');
En términos de configuración de WooCommerce, tengo habilitados tanto el Envío Gratuito como la Tarifa Plana en las Opciones de Envío de Woo. Luego simplemente configuro una Clase de Envío, especifico su costo (por ejemplo, £7.95) en la página de opciones de Tarifa Plana, y luego agrego esa clase de envío a los productos a los que quiero cobrar £7.95 por gastos de envío.

La opción "virtual" eliminará todos los costos de envío, pero también elimina la opción de enviar a una dirección diferente a la de facturación del cliente. Esto no es un problema si el cliente compra otros productos no virtuales también, pero sí lo es si es lo único que compra.
