Добавьте поле выбора с временными интервалами, основанными на времени открытия, закрытия и перерывов в WooCommerce checkout

#php #wordpress #woocommerce #time #checkout

#php #wordpress #woocommerce #время #Оформить покупку

Вопрос:

Я создаю сайт доставки пиццы с помощью WooCommerce. Фактически, когда клиент выписывается, он может выбрать, когда он хочет, чтобы ему доставляли еду.

Поле выбора должно содержать 15-минутные интервалы, начиная с текущего времени и очищая все прошлые часы. Первый вариант, который я хочу, должен быть «Как можно скорее», а затем следующий вариант — через час (округляется до ближайших 15 минут), а затем по 15 минут каждый раз.

Наши часы доставки указаны ниже:

  • Понедельник: закрыт
  • Вторник — пятница 11:30 — 14:00 amp; 17:00 — 22:00
  • Сб и ВС: 13:00 — 22:00

Я успешно выполняю действие / перехват WooCommerce, но я не могу отключить все временные интервалы до текущего времени.

 add_action('woocommerce_before_order_notes', 'wps_add_select_checkout_field');
function wps_add_select_checkout_field( $checkout ) {
    woocommerce_form_field( 'lieferzeit', array(
        'type'          => 'select',
        'class'         => array( 'wps-drop' ),
        'label'         => __( '<div class="gew"><span class="gew-lz">Gewünschte Lieferzeit</span></div>'),
         'options'       => array(
            'asap'      => __( 'So schnell wie möglich', 'wps' ),
            '12:00'                     => __( '12:00', 'wps' ),
            '12:30'                     => __( '12:30', 'wps' ),
            '13:00'                     => __( '13:00', 'wps' ),
            '13:30'                     => __( '13:30', 'wps' ),
            '14:00'                     => __( '14:00', 'wps' ),
            '17:30'                     => __( '17:30', 'wps' ),
            '18:00'                     => __( '18:00', 'wps' ),
            '18:30'                     => __( '18:30', 'wps' ),
            '19:00'                     => __( '19:00', 'wps' ),
            '19:30'                     => __( '19:30', 'wps' ),
            '20:00'                     => __( '20:00', 'wps' ),
            '20:30'                     => __( '20:30', 'wps' ),
            '21:00'                     => __( '21:00', 'wps' ),
            '21:30'                     => __( '21:30', 'wps' ),
            '22:00'                     => __( '22:00', 'wps' ),
                           
        )
    ),

    $checkout->get_value( 'lieferzeit' ));
}

add_action('woocommerce_checkout_update_order_meta', 'wps_select_checkout_field_update_order_meta');
function wps_select_checkout_field_update_order_meta( $order_id ) {

   if ($_POST['lieferzeit']) update_post_meta( $order_id, 'lieferzeit', esc_attr($_POST['lieferzeit']));

}


add_action( 'woocommerce_admin_order_data_after_billing_address', 'wps_select_checkout_field_display_admin_order_meta', 10, 1 );
function wps_select_checkout_field_display_admin_order_meta($order){

    echo '<p><strong>'.__('Delivery option').':</strong> ' . get_post_meta( $order->id, 'lieferzeit', true ) . '</p>';

}

add_filter('woocommerce_email_order_meta_keys', 'wps_select_order_meta_keys');
function wps_select_order_meta_keys( $keys ) {

    $keys['lieferzeit:'] = 'lieferzeit';
    return $keys;
    
}
  

Ответ №1:

Для вашего вопроса о поле выбора вы можете использовать следующее

С помощью $store_times массива вы можете установить часы открытия и закрытия, а также часы перерыва.

Если магазин закрыт весь день, оставьте все настройки для этого дня пустыми (см. Понедельник)

 function action_woocommerce_before_order_notes( $checkout ) {       
    // Open, break and close time   
    $store_times = array(
        array( // Sunday (NO break)
            'open'    => '13:00',
            'break_s' => '',
            'break_e' => '',
            'close'   => '22:00',
        ), 
        array( // Monday (closed, so everything is empty)
            'open'    => '',
            'break_s' => '',
            'break_e' => '',
            'close'   => '',
        ), 
        array( // Tuesday
            'open'    => '11:30',
            'break_s' => '14:00',
            'break_e' => '17:00',
            'close'   => '22:00',
        ), 
        array( // Wednesday
            'open'    => '11:30',
            'break_s' => '14:00',
            'break_e' => '17:00',
            'close'   => '22:00',
        ), 
        array( // Thursday
            'open'    => '11:30',
            'break_s' => '14:00',
            'break_e' => '17:00',
            'close'   => '23:30',
        ), 
        array( // Friday
            'open'    => '11:30',
            'break_s' => '14:00',
            'break_e' => '17:00',
            'close'   => '22:00',
        ),
        array( // Saturday
            'open'    => '13:00',
            'break_s' => '',
            'break_e' => '',
            'close'   => '22:00',
        ), 
    );
    
    // Current time
    $current_time = current_time( 'timestamp' );
    
    // Current day, 0 for Sunday, 6 for Saturday
    $current_day = date( 'w', $current_time );

    // Get values for the current day
    $open_time = strtotime( $store_times[ $current_day][ 'open' ] );
    $break_start = strtotime( $store_times[ $current_day][ 'break_s' ] );
    $break_end = strtotime( $store_times[ $current_day][ 'break_e' ] ); 
    $close_time = strtotime( $store_times[ $current_day][ 'close' ] );
    
    // Open time is empty or before/passed open/close time, so the store is closed
    if ( empty ( $open_time ) || ( $current_time > $close_time || $current_time <= $open_time ) ) {
        // Default value
        $options['closed'] = __( 'Closed', 'woocommerce');
    } else {
        // Default value
        $options[''] = __( 'As soon as possible', 'woocommerce');
        
        // As soon as possible
        $asa_possible = strtotime( ' 1 hour', $current_time );
    
        // Round to next 15 minutes (15 * 60 seconds)
        $asa_possible = ceil( $asa_possible / ( 15 * 60 ) ) * ( 15 * 60);
        
        // Add a new option every 15 minutes
        while( $asa_possible <= $close_time amp;amp; $asa_possible >= $open_time ) {
            // Generate value
            $value = date( 'H:i', $asa_possible );
            
            // NOT between break start amp; break end
            if ( $value <= date( 'H:i', $break_start ) || $value >= date( 'H:i', $break_end ) ) {
                // Push to array
                $options[$value] = $value;
            }
            
            // Add 15 minutes to the variable in this while loop
            $asa_possible = strtotime( ' 15 minutes', $asa_possible );
        }
    }


    // Add field
    woocommerce_form_field( 'delivery_time', array(
        'type'          => 'select',
        'class'         => array( 'wps-drop' ),
        'label'         => __('Desired delivery time', 'woocommerce' ),
        'options'       => $options,
    ), $checkout->get_value( 'delivery_time' ) );
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );