Woocommerce es un plugin genial que nos ahorra muchísima faena a la hora de configurar una tienda online, pero sabemos que también tiene aún muchas carencias. Una de ellas es la de gestionar el precio de envío por peso en nuestras zonas de envío. Para solucionar esto existen multitud de plugins que nos pueden ayudar a aplicar configuraciones complejas, pero los que realmente valen la pega son todos de pago.
En este post te voy a explicar como aplicar una solución muy sencilla que requiere muy poco código y que te resultará muy útil si lo que has de configurar son pocas zonas de envío con dos o tres rangos de peso. Se puede aplicar también a configuraciones complicadas con múltiples zonas y un montón de rangos de peso, pero para una solución tan compleja te recomiendo que utilices un plugin que te permita hacer cambios fácilmente y te permita tener una visión global de tus precios de envío.
Para este ejemplo voy a utilizar la solución que he aplicado a una página que he empezado a administrar hace poco. De momento solamente está en inglés, así que los pantallazos los vas a ver en la lengua de Shakespeare, pero las explicaciones están íntegramente en castellano.
Esta es una adaptación del código que he encontrado en Business Bloomer para modificar los métodos de envío en función del peso. Puedes encontrar el post original en inglés aquí: https://businessbloomer.com/woocommerce-shipping-weight-without-plugin/
Vamos a ver como gestionar el precio de envío por peso en nuestra tienda online.
1- Configurar la unidad de peso
En primer lugar debes definir la unidad de peso que quieres aplicar a tus productos. En función de los idiomas definidos aparecerán algunas para escoger.
En nuestro caso vamos a utilizar kilogramos (kg). Si necesitas hilar más fino puedes seleccionar gramos (g) en el desplegable.
Ves a Woocommerce -> Ajustes -> Producto y selecciona el valor Kg en el desplegable de “Unidad de peso”.

2- Añadir el peso en todos los productos
Este paso es básico. Si no añades el peso a los productos no va a servir de nada. Asegúrate de que todos los productos simples y todas las variaciones de los productos variables tienen un peso asignado.
3- Crear los métodos de envío
Para cada zona de envío has de crear sus métodos de envío. Cada método será un intervalo de peso al que asignaremos un precio.
En este ejemplo solamente voy a crear 3 zonas de envío y cuatro métodos de envío para cada uno de ellos. Los intervalos de peso serán de 0Kg a 10Kg y de 10Kg hasta 20 Kg y los plazos de entrega serán 24 horas o 48/72 horas.
Para pesos superiores a 20Kg solamente se habilitará la recogida en tienda. El motivo de esto es el límite de peso en los envíos que impone la empresa de transporte.
Zona de envío: Nacional
- 24 horas hasta 10Kg – 7,47€
- 24 horas más de 10Kg – 12€
- 48/72 horas hasta 10Kg – 10,79€
- 48/72 horas más de 10Kg – 6,22€
- Recogida en tienda
Después de crear las zonas de envío (en el ejemplo solamente voy a mostrar los envíos nacionales, es decir, para la zona de envío “España”) debemos crear todos los métodos de envío en cada una de ellas:

4- Averiguar los ids de cada método de envío
Si ahora compramos un producto y vamos a la cesta de la compra, veremos que aparecen los cuatro métodos de envío. Para averiguar el id de cada uno, debemos hacer clic con el botón derecho sobre el primero y seleccionar “Inspeccionar”. Así podremos ver el código html de la página.

Dentro de las etiquetas <li> encontramos un “input”. En su etiqueta “value” se indica el id del método de envío. Ahora debemos revisar todos los métodos y apuntar su id.
5- Añadir el código para definir el precio de envío por peso
Y ahora hay que añadir el siguiente código a nuestro fichero functions.php. Como siempre, es recomendable hacer estas modificaciones sobre un tema hijo para no perder los cambios cuando se actualice el tema que estamos utilizando.
add_filter( 'woocommerce_package_rates', 'precio_de_envio_por_peso', 9999, 2 );
function precio_de_envio_por_peso( $rates, $package ) {
if ( WC()->cart->cart_contents_weight <= 10 ) {
if ( isset( $rates['flat_rate:1'] ) ) unset( $rates['flat_rate:6'], $rates['flat_rate:7'] );
} elseif ( WC()->cart->cart_contents_weight > 10 && WC()->cart->cart_contents_weight <= 20 ) {
if ( isset( $rates['flat_rate:1'] ) ) unset( $rates['flat_rate:1'], $rates['flat_rate:4'] );
} else {
if ( isset( $rates['flat_rate:1'] ) ) unset( $rates['flat_rate:1'], $rates['flat_rate:4'], $rates['flat_rate:6'], $rates['flat_rate:7'] );
}
return $rates;
}
¿Qué hace este código?
Básicamente añadimos un filtro a la función woocommerce_package_rates, así, cuando se acabe de ejecutar la función que prepara los métodos de envío, nuestro código las modificará.
En la primera condición evaluamos el peso de los productos en la cesta “if ( WC()->cart->cart_contents_weight <= 10 )“ si quieres añadir más rangos de peso solamente tienes que ir añadiendo más condiciones para acotar el peso. Atención a los signos “mayor/menor” y “mayor o igual/menor o igual” para no dejarte ningún peso fuera de las condiciones ni duplicar ninguno.
En la segunda condición buscamos un método de envío cualquiera dentro de la zona de envío “if ( isset( $rates[‘flat_rate:1’] ) )“. Así sabemos en qué zona nos encontramos (los id de métodos de envío son únicos para cada zona).
A continuación, deshabilitamos los métodos de envío que no nos interesan. En caso de que el peso sea inferior a 10 Kg, deshabilitaremos “24 horas más de 10Kg ” (id flat_rate:6) y “48/72 horas más de 10Kg ” (id flat_rate:7) -> “unset( $rates[‘flat_rate:6’], $rates[‘flat_rate:7’] );“
Y aquí está la prueba. He creado un producto de peso 5Kg. Si compramos hasta dos unidades, veremos el precio para 10Kg, si compramos hasta 4 solamente vemos el precio de más de 10Kg. En caso de comprar más de 4 unidades, el peso será de 20Kg y solamente veremos “Recogida en tienda”



Imagen de portada por Immo Wegmann en Unsplash
Hay alguna manera de hacer algo así sin meterme en código? yo quiero hacer una tienda online de bebidas y snacks y no se como hacer los envíos, porque todo depende del peso y no se hacerlo!!