WooCommerce - Cómo Agregar un Campo Personalizado a los Artículos del Carrito y Totales
Estoy utilizando el plugin WooCommerce y tengo la siguiente consulta:
Dentro de la página de producto individual, tengo un producto donde, según ciertas selecciones del comprador, se calcula un valor de costo de envío, que luego necesito pasar/incluir como parte de los artículos del carrito como una nueva columna, "Costo de Envío" al ver el carrito.
Lo que sucede es que el comprador podría decidir comprar, por ejemplo, tres productos diferentes donde cada uno de estos tres productos podría tener diferentes cálculos de costos de envío, después de presionar el botón "Agregar al carrito" tres veces.
Por ejemplo:
Las selecciones del Producto A calculan un Costo de Envío de $2.00
Las selecciones del Producto B calculan un Costo de Envío de $4.00
Las selecciones del Producto C calculan un Costo de Envío de $6.00
Entonces, según lo anterior, cuando el comprador haya terminado de comprar y presione "Ver Carrito", quiero que vea:
Artículo Precio Costo de Envío Cantidad Total
---------------------------------------------------------------------------------------
Producto A $10 $2 1 $10
Producto B $5 $4 1 $5
Producto C $15 $6 1 $15
Es la columna de campo personalizado "Costo de Envío" la que me gustaría agregar al carrito, que es lo que no estoy seguro de cómo hacer.
Además de lo anterior, también quiero agregar a los "Totales del Carrito" abajo, otro campo personalizado de "Costo de Envío" que totalizaría $12, que luego se agregaría al Total del Producto general, es decir:
Totales del Carrito
Subtotal del Carrito $30
Costo de Envío $12
Total del Pedido $42
Parte del código que he utilizado para el costo de envío del Total del Carrito es:
function woo_add_cart_fee() {
global $woocommerce;
$woocommerce->cart->add_fee( __('Costo de Envío', 'woocommerce'), 100 );
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');
Entonces, necesito saber cómo agregar el "Costo de Envío" tanto a los Detalles del Producto del Carrito como a los Totales del Carrito.
Cualquier ayuda con el código sería muy apreciada.
Gracias.

Primero, guarda el campo personalizado cuando edites tu producto. Digamos que estás usando el campo personalizado custom_shipping_cost. Asegúrate de que se guarde como un número, 20 por ejemplo, NO $20.00
Luego, necesitas mostrar este campo en la página del carrito. Lamentablemente, no hay un filtro para añadir una nueva columna en la tabla del carrito, así que necesitas editar el archivo de plantilla, o si no es necesario que sea una columna, puedes hacer esto en su lugar, este código añadirá el valor extra a la última columna:
add_filter('woocommerce_cart_item_subtotal','additional_shipping_cost',10,3);
function additional_shipping_cost($subtotal, $values, $cart_item_key) {
//Obtener el valor del campo personalizado
$custom_shipping_cost = get_post_meta($post->ID, 'custom_shipping_cost', true);
//Solo para pruebas, puedes eliminar esta línea
$custom_shipping_cost = 10;
//Verificar si tenemos un costo de envío personalizado, si es así, mostrarlo debajo del precio del artículo
if ($custom_shipping_cost) {
return $subtotal.'<br>+'.woocommerce_price($custom_shipping_cost).' Costo de Envío';
} else {
return $subtotal;
}
}
Así que con esto, la primera parte de la pregunta está hecha. Si quieres mostrarlo como en tu ejemplo anterior, necesitas duplicar el archivo plugins/woocommerce/templates/cart/cart.php a themes/tutema/woocommerce/cart/cart.php. Luego edita el archivo, añade tu propia columna, puedes usar el código de arriba para mostrar el precio.
Después de esto, necesitamos actualizar los totales del carrito con los costos adicionales. Tu código con add_fee será útil:
function woo_add_cart_fee() {
global $woocommerce;
$extra_shipping_cost = 0;
//Recorrer el carrito para encontrar los costos extra
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
//Obtener la información del producto
$_product = $values['data'];
//Obtener el valor del campo personalizado
$custom_shipping_cost = get_post_meta($_product->id, 'custom_shipping_cost', true);
//Solo para pruebas, puedes eliminar esta línea
$custom_shipping_cost = 10;
//Sumando los costos extra
$extra_shipping_cost = $extra_shipping_cost + $custom_shipping_cost;
}
//Verifiquemos si realmente tenemos un cargo, luego añadirlo
if ($extra_shipping_cost) {
$woocommerce->cart->add_fee( __('Costo de Envío', 'woocommerce'), $extra_shipping_cost );
}
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');
Eso es todo, debería funcionar después de esto. Asegúrate de eliminar las líneas "Solo para pruebas..." de ambos códigos, no creé el campo personalizado en mi sitio para las pruebas.
