es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agregar una tarifa de orden basada en la fecha de entrega seleccionada en la página de pago de WooCommerce?

Estoy usando el selector de fecha y hora xdsoft en la salida WooCommerce y necesito agregar un cargo adicional si un usuario selecciona el mismo día o mañana en el selector de fecha y hora. No estoy seguro de cómo hacerlo y agradecería si alguien puede ayudarme con esto.

A continuación se muestra el código que estoy utilizando actualmente y funciona bien para la situación.

La función date_time_picker() crea un campo de formulario personalizado en la página de salida de WooCommerce donde el usuario puede seleccionar la fecha y hora de entrega.

La función validate_new_checkout_fields() valida si el campo de fecha y hora de entrega se dejó en blanco, lo que genera una notificación de error.

La función enable_datepicker() agrega los archivos de JavaScript necesarios para el selector de fecha y hora en la página de salida de WooCommerce.

La función load_calendar_dates() establece la configuración del selector de fecha y hora y agrega el script que realiza la validación del día actual y el siguiente.


function date_time_picker( $checkout ) {
    woocommerce_form_field( 'delivery_date', array(
        'type'          => 'text',
        'class'         => array('form-row-wide'),
        'id'            => 'datepicker',
        'required'      => true,
        'label'         => __('Select Delivery Date'),
        'placeholder'       => __('Click to select date'),
    )); 
}
add_action( 'woocommerce_after_order_notes', 'date_time_picker' );   

function validate_new_checkout_fields() {   
   if ( isset( $_POST['delivery_date'] ) && empty( $_POST['delivery_date'] ) ) wc_add_notice( __( 'Please select the Delivery Date' ), 'error' );
}
add_action( 'woocommerce_checkout_process', 'validate_new_checkout_fields' );

function enable_datepicker() { 
    ?>
    
       
    
   
   
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agregar una tarifa extra si un usuario selecciona el mismo día o mañana en la selección de fecha y hora, puede seguir los siguientes pasos:

    1. Primero, agregue una nueva función para calcular la tarifa extra basándose en la fecha seleccionada. Esta función debe devolver la cantidad de la tarifa.
      function calculate_date_fee($date) {
       // Aquí puede agregar su propia lógica para calcular la tarifa basándose en la fecha seleccionada.
       // Por ejemplo, puede agregar una cantidad fija o un porcentaje del monto total del pedido.
       // En este ejemplo, agregaremos una cantidad fija de $ 10 para la entrega el mismo día o mañana.
       $selected_date = strtotime($date);
       $today = strtotime(date('Y-m-d'));
       $tomorrow = strtotime(date('Y-m-d', strtotime("+1 day")));
      
       if ($selected_date == $today || $selected_date == $tomorrow) {
         return 10;
       } else {
         return 0;
       }
      }
      
    2. Modifique la función validate_new_checkout_fields para comprobar si la fecha seleccionada es válida y agregar la tarifa extra si es necesario.
      function validate_new_checkout_fields() {
       if (isset($_POST['delivery_date']) && empty($_POST['delivery_date'])) {
         wc_add_notice(__('Por favor seleccione la fecha de entrega'), 'error');
       } else {
         $date = $_POST['delivery_date'];
         $fee = calculate_date_fee($date);
      
         if ($fee > 0) {
           WC()->cart->add_fee('Entrega el Mismo Día/Mañana', $fee);
         }
       }
      }
      
    3. Llame a la función validate_new_checkout_fields antes de procesar el pedido mediante la modificación del gancho de acción.
      add_action('woocommerce_checkout_process', 'validate_new_checkout_fields', 10, 0);
      

    Nota: Este código asume que la tarifa extra debe agregarse al carrito como una tarifa, no como un método de envío. Si desea agregarlo como un método de envío, deberá modificar el código en consecuencia.

Comments are closed.