WooCommerce: solo envíe a direcciones predefinidas de "recogida local"

Woo 2.6 introdujo las zonas de envío, y con eso podemos jugar con PHP simple (y JQuery) para cumplir con muchas reglas de envío "avanzadas", como la recolección local.
Esta vez, probé un fragmento para agregar un menú desplegable a la sección de facturación donde los usuarios eligen el destino de recogida. Como resultado, la dirección de envío se completa automáticamente, al igual que el método de envío. ¿Qué piensas?
1. Recolección local avanzada: configuración de zonas/métodos 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 Local de Retiro (ej. tienda #1, tienda #2, etc).
En el siguiente ejemplo, agregué 2 "zonas/tiendas" en Australia, estado = "Territorio de la Capital Australiana" y 2 códigos postales específicos.
Cada zona tiene su único método de envío (Recogida Local) con costo = $0:

2. Recogida local avanzada: fragmento de PHP/JQuery
Ahora que las zonas están configuradas correctamente, aquí viene la parte difícil. El siguiente es un fragmento probado que, sin embargo, requiere muchas mejoras, por lo que si detecta algo o desea contribuir, deje un comentario a continuación.
/** * @snippet Advanced Local Pickup - WooCommerce * @how-to Get CustomizeWoo.com FREE * @source https://businessbloomer.com/?p=21534 * @author Rodolfo Melogli * @compatible WC 3.4.2 */ ////////////////////////////////////////////////////////// // 1. New select field @ 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' , 'woocommerce' ), 'class' => array ( 'form-row-wide' ), 'clear' => true ); return $fields ; } ////////////////////////////////////////////////////////// // 2. Field to show only when country == Australia add_action( 'woocommerce_after_checkout_form' , 'bbloomer_conditionally_hide_show_pickup' , 5); function bbloomer_conditionally_hide_show_pickup() { ?> <script type= "text/javascript" > jQuery( 'select#billing_country' ).live( 'change' , function (){ var country = jQuery( 'select#billing_country' ).val(); var check_country = new Array(<?php echo '"AU"' ; ?>); if (country && jQuery.inArray( country, check_country ) >= 0) { jQuery( '#pick_up_locations_field' ).fadeIn(); } else { jQuery( '#pick_up_locations_field' ).fadeOut(); jQuery( '#pick_up_locations_field input' ).val( '' ); } }); </script> <?php } ////////////////////////////////////////////////////////// // 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() { ?> <script type= "text/javascript" > jQuery( 'select#pick_up_locations' ).live( 'change' , function (){ var location = jQuery( 'select#pick_up_locations' ).val(); if (location == 'option_2' ) { jQuery( 'select#shipping_country' ).val( 'AU' ).change(); jQuery( 'select#shipping_state' ).val( 'ACT' ).change(); jQuery( '#shipping_city_field input' ).val( 'Sidney' ); jQuery( '#shipping_address_1_field input' ).val( 'Melbourne Road' ); jQuery( '#shipping_postcode_field input' ).val( '34500' ); jQuery( ".shipping_address input[id^='shipping_']" ).prop( "disabled" , true); jQuery( ".shipping_address select[id^='shipping_']" ).prop( "disabled" , true); } else if (location == 'option_3' ) { jQuery( 'select#shipping_country' ).val( 'AU' ).change(); jQuery( 'select#shipping_state' ).val( 'ACT' ).change(); jQuery( '#shipping_city_field input' ).val( 'Sidney' ); jQuery( '#shipping_address_1_field input' ).val( 'Perth Road' ); jQuery( '#shipping_postcode_field input' ).val( '79200' ); jQuery( ".shipping_address input[id^='shipping_']" ).prop( "disabled" , true); jQuery( ".shipping_address select[id^='shipping_']" ).prop( "disabled" , true); } else { jQuery( ".shipping_address input[id^='shipping_']" ).prop( "disabled" , false); jQuery( ".shipping_address select[id^='shipping_']" ).prop( "disabled" , false); } }); </script> <?php } |
Como resultado, una vez que seleccione la dirección de recogida local correcta en la sección de facturación, debería obtener automáticamente el método de envío correcto en el proceso de pago:

¿Probaste esto? ¿Tienes algo útil que agregar? ¡Hágamelo saber!
Deja una respuesta