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:

Recogida local avanzada: zonas de envío de WooCommerce

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:

Recogida local avanzada – WooCommerce Checkout

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir