【问题标题】:Add a select field with time intervals based on opening, closing and breaks times in WooCommerce checkout根据 WooCommerce 结帐中的打开、关闭和休息时间添加具有时间间隔的选择字段
【发布时间】:2021-01-30 07:49:12
【问题描述】:

我正在使用 WooCommerce 构建披萨外卖网站。事实上,当顾客结账时,他可以选择何时送餐。

选择框应包含从当前时间到过去所有小时的 15 分钟间隔。我想要的第一个选项是“尽快”,然后下一个选项是一个小时后(四舍五入到最接近的 15 分钟),然后每次 15 分钟。

我们的送货时间如下:

  • 星期一:休息
  • 周二至周五 11:30 - 14:00 和 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;
    
}

【问题讨论】:

    标签: php wordpress woocommerce time checkout


    【解决方案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 && $asa_possible >= $open_time ) {
                // Generate value
                $value = date( 'H:i', $asa_possible );
                
                // NOT between break start & 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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-25
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多