Las zonas de envío de WooCommerce son bastante fáciles de anular / personalizar. Con un fragmento simple de PHP (y jQuery, a veces), podemos lograr muchas reglas de envío avanzadas, como la que estudiaremos hoy.
Esta vez, he probado un fragmento para agregar un menú desplegable a la sección de facturación donde los usuarios van a elegir el destino de recolección. Como resultado, la dirección de envío se pobla automáticamente, y también lo es el método de envío. ¿Qué opinas?
1. Configuración de zonas de envío
Lo primero que debe hacer es configurar las zonas de envío de WooCommerce. En este caso, cada zona corresponderá a una dirección de recolección local (por ejemplo, la tienda #1, la tienda #2, etc.).
En el siguiente ejemplo, he agregado 2 zonas en Australia, con el mismo estado (territorio de capital australiano) pero 2 códigos postales diferentes.
Cada zona tiene su método de envío único (camioneta local) con costo = $ 0:
2. Pickup avanzada local – Php/jQuery Snippet
Ahora que las zonas están configuradas correctamente, aquí viene la parte difícil. El siguiente es un fragmento que requiere muchas mejoras, por lo que si detecta algo o desea contribuir, dejar un comentario abajo.
/** * @snippet Advanced Local Pickup - WooCommerce * @how-to businessbloomer.com/woocommerce-customization * @author Rodolfo Melogli, Business Bloomer * @compatible WooCommerce 6 * @community https://businessbloomer.com/club/ */ ////////////////////////////////////////////////////////// // 1. Select field @ checkout billing section add_filter( 'woocommerce_checkout_fields', 'bbloomer_display_pickup_locations' ); function bbloomer_display_pickup_locations( $fields ) { $fields['billing']['pick_up_locations'] = array( 'type' => 'select', 'options' => array( 'option_1' => 'Select...', 'option_2' => 'Melbourne Road Shop', 'option_3' => 'Perth Road Shop'), 'label' => 'Pick Up Location', 'class' => array( 'form-row-wide' ), 'clear' => true, ); return $fields; } ////////////////////////////////////////////////////////// // 2. Show field only when country == Australia @ checkout add_action( 'woocommerce_after_checkout_form', 'bbloomer_conditionally_hide_show_pickup', 5 ); function bbloomer_conditionally_hide_show_pickup() { wc_enqueue_js( " $('select#billing_country').change(function(){ var country = $(this).val(); if ( country == 'AU' ) { $('#pick_up_locations_field').fadeIn(); } else { $('#pick_up_locations_field').fadeOut(); $('#pick_up_locations_field input').val(''); } }); " ); } ////////////////////////////////////////////////////////// // 3. "Ship to a different address" opened by default add_filter( 'woocommerce_ship_to_different_address_checked', '__return_true' ); ////////////////////////////////////////////////////////// // 4. Change shipping address when local pickup location changes add_action( 'woocommerce_after_checkout_form', 'bbloomer_checkout_update_pickup_address', 10 ); function bbloomer_checkout_update_pickup_address() { wc_enqueue_js( " $('select#pick_up_locations').change(function(){ var location = $(this).val(); if (location == 'option_2') { $('select#shipping_country').val('AU').change(); $('select#shipping_state').val('ACT').change(); $('#shipping_city_field input').val('Sidney'); $('#shipping_address_1_field input').val('Melbourne Road'); $('#shipping_postcode_field input').val('34500'); $('.shipping_address input[id^='shipping_']').prop('disabled', true); $('.shipping_address select[id^='shipping_']').prop('disabled', true); } else if (location == 'option_3') { $('select#shipping_country').val('AU').change(); $('select#shipping_state').val('ACT').change(); $('#shipping_city_field input').val('Sidney'); $('#shipping_address_1_field input').val('Perth Road'); $('#shipping_postcode_field input').val('79200'); $('.shipping_address input[id^='shipping_']').prop('disabled', true); $('.shipping_address select[id^='shipping_']').prop('disabled', true); } else { $('.shipping_address input[id^='shipping_']').prop('disabled', false); $('.shipping_address select[id^='shipping_']').prop('disabled', false); } }); " ); }
Como resultado, una vez que seleccione el formulario correcto de la dirección de recolección local de la sección de facturación, debe obtener automáticamente el método de envío correcto en el pago:
¿Probaste esto? ¿Tienes algo útil para agregar? ¡Hágamelo saber!