Cargo adicional opcional en el checkout de Woocommerce
Estoy construyendo una tienda basada en WooCommerce. Necesito agregar un checkbox adicional en la página de checkout llamado Seguro de Envío. Cuando el campo esté marcado, necesito agregar $3 adicionales al Total del Pedido. Pude agregar un cargo fijo de esta manera:
function woo_add_cart_fee() {
global $woocommerce;
$woocommerce->cart->add_fee( __('Seguro de Envío', 'woocommerce'), 3 );
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee' );
El problema es que esto agregará $3 fijos al total del pedido, por lo que no es opcional. ¿Alguna idea sobre cómo proceder con este problema?

Vale, así es como lo hice.
Crea un producto llamado Seguro de Envío que cueste $3, asegúrate de que sea un producto oculto (Visibilidad en Catálogo en el lado derecho)
Usa el siguiente código en el archivo functions.php de tu tema:
add_action('woocommerce_cart_totals_after_shipping', 'wc_shipping_insurance_note_after_cart');
function wc_shipping_insurance_note_after_cart() {
global $woocommerce;
$product_id = 669;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
// si no se encuentra el producto, añádelo
if ( ! $found ):
?>
<tr class="shipping">
<th><?php _e( 'Seguro de Envío', 'woocommerce' ); ?></th>
<td><a href="<?php echo do_shortcode('[add_to_cart_url id="669"]'); ?>"><?php _e( 'Añadir seguro de envío (+$3)' ); ?> </a></td>
</tr>
<?php else: ?>
<tr class="shipping">
<th><?php _e( 'Seguro de Envío', 'woocommerce' ); ?></th>
<td>$3</td>
</tr>
<?php endif;
}
Cambia la variable $product_id por el ID de tu producto que creaste y cuando estés en el checkout, simplemente añadirá este producto oculto a tu carrito

Esto no responderá completamente tu pregunta, pero la documentación oficial de WooCommerce tiene un ejemplo similar a lo que esperas lograr. En particular, estás buscando una combinación de Lecciones 1 y 2.
Documentación de WooCommerce: Personalización de campos de pago usando acciones y filtros
Espero que te ayude mientras alguien pueda dar una respuesta más específica.
