Hola,
Quería saber cómo puedo cobrar portes solo a una categoría concreta de productos y el resto que sean gratis.
Probé con el plugin APG envío gratuito, de forma que le puse un precio fijo a todos los productos, creé después una tipo Envío gratis (con APG) e indiqué que excluyera la categoría "Libros", así me funciona, pero cuando en la web meto en el carrito otro producto que no sea un libro, me aparecen las dos opciones: la que tiene el coste del envío marcada y el envío gratis para poder seleccionar, yo quería que no me saliese la opción del coste, que saliese que los portes son gratis.
Al seleccionar un libro me lo hace bien, aparece el precio del envío y listo.
Buscando encontré que se podría hacer con clases de envío, pero me pasa lo mismo que lo explicado antes, me aparecen las dos opciones a escoger (la de pago y la gratuita) y quería evitar esto.
¿Se puede hacer algo por evitar la selección entre las dos opciones?
Dejé la web como estaba, sin la opción gratuita.
Gracias
Contenido solo visible a usuarios registrados
Hola Carlos,
Manteniendo la categoría, verifica usar este código:
add_filter('woocommerce_package_rates', 'ocultar_envio_de_pago_si_hay_gratis_sin_libros', 100, 2);
function ocultar_envio_de_pago_si_hay_gratis_sin_libros($rates, $package) {
$libros_en_carrito = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product_id = $cart_item['product_id'];
$product_cats = wc_get_product_terms($product_id, 'product_cat', array('fields' => 'slugs'));
if (in_array('libros', $product_cats)) {
$libros_en_carrito = true;
break;
}
}
// Si no hay libros y existe un método de envío gratuito, ocultar los demás
if (!$libros_en_carrito) {
$free = array();
foreach ($rates as $rate_id => $rate) {
if ('free_shipping' === $rate->method_id) {
$free[$rate_id] = $rate;
break;
}
}
return !empty($free) ? $free : $rates;
}
return $rates;
}
Creo que es lo que estas buscando, de igual forma tienes otros plugins para condicionales por ejemplo:
https://es.wordpress.org/plugins/flexible-shipping/
https://es.wordpress.org/plugins/advanced-free-flat-shipping-woocommerce/
Puedes darle un vistazo y nos comentas.
Un saludo 🖐️
Hola,
Voy probar con el código que me pasaste, pero quería saber ¿lo tengo que poner en Code snippets? y otra cosa, este código es en el caso de que sean libros, si fuera otra categoría de producto ¿qué debo sustituir en el código para que funcione igual?
Gracias
Hola Carlos,
En este caso es solo para libros, lo necesitas para alguna otra en concreto? nmos puedes indicar para hacer el ajuste? por otra parte, es correcto, puedes agregarlo con el plugin code snippet en un nuevo código.
Un saludo 🖐️
Hola,
Ahora mismo, solo nos lo planteamos para los libros, pero es posible que lo necesite para camisetas, y dejar solo gratuito los vinos. Si es posible, ¿me lo podrías ajustar?
Muchas gracias por la ayuda.
Hola Carlos,
Lo mejor es verlo cuando ya lo necesites, de igual forma te comparto un poco el ajuste:
add_filter('woocommerce_package_rates', 'mostrar_envio_gratis_solo_para_vinos', 100, 2);
function mostrar_envio_gratis_solo_para_vinos($rates, $package) {
$solo_vinos_en_carrito = true;
foreach (WC()->cart->get_cart() as $cart_item) {
$product_id = $cart_item['product_id'];
$categorias = wc_get_product_terms($product_id, 'product_cat', array('fields' => 'slugs'));
if (!in_array('vinos', $categorias)) {
$solo_vinos_en_carrito = false;
break;
}
}
if ($solo_vinos_en_carrito) {
$envios_gratis = array();
foreach ($rates as $rate_id => $rate) {
if ('free_shipping' === $rate->method_id) {
$envios_gratis[$rate_id] = $rate;
break;
}
}
return !empty($envios_gratis) ? $envios_gratis : $rates;
}
foreach ($rates as $rate_id => $rate) {
if ('free_shipping' === $rate->method_id) {
unset($rates[$rate_id]);
}
}
return $rates;
}
Un saludo 🖐️