Datetimepicker

Datetimepicker — скрипт для создания продвинутого поля ввода даты и времени. Здесь буду рассматривать решение от Kartik Visweswaran.

Для работы необходимо подключить сам скрипт и стили: jquery.datetimepicker.full.min, jquery.datetimepicker.min

Инициализация скрипта

Для запуска скрипта необходимо выбрать язык и указать для какого поля его включить (изначально поле лучше делать текстовым):

jQuery.datetimepicker.setLocale('ru');

jQuery('#delivery_date').datetimepicker({
	dayOfWeekStart:1, // неделя начинается с ПН
	//timepicker:false,
	closeOnDateSelect:0, // нужно выбрать и дату и время
	format:'d.m.Y H:i',
	minDate:'+1970/01/02',
	minTime:'09:00',
	maxTime:'21:00',
	step:30
});

Поле Дата доставки для WC

Переходим к частностям. Нужно например завести поле Дата Доставки (в полях Доставки), заодно заведем поле Количество персон (в полях Оплаты). Заводим, выводим, сохраняем поля и выводим значения:

// Добавляем произвольные поля
add_filter( 'woocommerce_checkout_fields' , 'number_persone_checkout_fields' );
function number_persone_checkout_fields( $fields ) {
	
     $fields['billing']['number_persone'] = array(
		'label'     => __('Количество человек', 'woocommerce'),
		'placeholder'   => _x('Количество человек', 'placeholder', 'woocommerce'),
		'required'  => true,
		'class'     => array('form-row-wide'),
		'clear'     => true
     );
	
	 $fields['shipping']['delivery_date'] = array(
		'label'     => __('Дата и время доставки', 'woocommerce'),
		'placeholder'   => _x('Дата и время доставки', 'placeholder', 'woocommerce'),
		'required'  => true,
		'class'     => array('form-row-wide'),
		'clear'     => true
     );

     return $fields;
}

// Выводим поля
add_action( 'woocommerce_admin_order_data_after_billing_address', 'delivery_date_display_admin_order_meta', 10, 1 );
function delivery_date_display_admin_order_meta($order){
	echo '<p><strong>'.__('Количество человек').':</strong> ' . get_post_meta( $order->get_id(), 'number_persone', true ) . '</p>';
    echo '<p><strong>'.__('Дата и время доставки').':</strong> ' . get_post_meta( $order->get_id(), 'delivery_date', true ) . '</p>';
}

// Сохранить значения полей
add_action( 'woocommerce_checkout_update_order_meta', 'number_persone_update_order_meta' );
function number_persone_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['number_persone'] ) ) {
        update_post_meta( $order_id, 'number_persone', sanitize_text_field( $_POST['number_persone'] ) );
    }
	if ( ! empty( $_POST['delivery_date'] ) ) {
        update_post_meta( $order_id, 'delivery_date', sanitize_text_field( $_POST['delivery_date'] ) );
    }
}


// Выводим поля в Благодарность о заказе
add_action( 'woocommerce_order_details_after_customer_details', 'delivery_date_echo_in_order' );
function delivery_date_echo_in_order( $order ) {
	echo 'Дата и время доставки: '.get_post_meta( $order->get_id(), 'delivery_date', true ).'<br>';
	echo 'Количество человек: '.get_post_meta( $order->get_id(), 'number_persone', true ).'<br>';
}


// Выводим поля в шаблоне письма
add_filter('woocommerce_email_order_meta_keys', 'number_persone_order_meta_keys');
function number_persone_order_meta_keys( $keys ) {
	 $keys['Дата и время доставки'] = 'delivery_date';
	 $keys['Количество человек'] = 'number_persone';	
     return $keys;
}

Для поля Дата и время доставки инициируем скрипт с условием, что если клиент заказывает до 16:00, то он может сделать заказ со следующего дня, если после, то самое раннее на послезавтра:

jQuery.datetimepicker.setLocale('ru');

var dtToday = new Date();
var hour = dtToday.getHours();

if(hour < 16) { //если меньше 16 часов, то можно заказать на завтра
	
	jQuery('#delivery_date').datetimepicker({
		dayOfWeekStart:1, // неделя начинается с ПН
		//timepicker:false,
		closeOnDateSelect:0, // нужно выбрать и дату и время
		format:'d.m.Y H:i',
		minDate:'+1970/01/02',
		minTime:'09:00',
		maxTime:'21:00',
		step:30
	});	
	
} else { //если больше 16 часов, то можно заказать только на послезавтра
	
	jQuery('#delivery_date').datetimepicker({
		dayOfWeekStart:1, // неделя начинается с ПН
		//timepicker:false,
		closeOnDateSelect:0, // нужно выбрать и дату и время
		format:'d.m.Y H:i',
		minDate:'+1970/01/03',
		minTime:'09:00',
		maxTime:'21:00',
		step:30
	});	
	
}

Для ускорения загрузки сайта подключаем скрипты только для страницы оформления:

if ( is_checkout() ) { wp_enqueue_script( 'datetimepicker', get_template_directory_uri() . '/js/jquery.datetimepicker.full.min.js' , array( ), '1.0' , true ); }

if ( is_checkout() ) { wp_enqueue_style( 'datetimepicker', get_template_directory_uri() . '/css/jquery.datetimepicker.min.css' , array( ), '1.0' , 'screen' ); }

Таким же образом лучше присоединять и вышеупомянутый скрипт:

function datetimepicker_load_script() {
	if ( is_checkout() ) { 	
		print '<script>
		jQuery.datetimepicker.setLocale("ru");

		var dtToday = new Date();
		var hour = dtToday.getHours();

		if(hour < 16) { //если меньше 16 часов, то можно заказать на завтра

			jQuery("#delivery_date").datetimepicker({
				dayOfWeekStart:1, // неделя начинается с ПН
				//timepicker:false,
				closeOnDateSelect:0, // нужно выбрать и дату и время
				format:"d.m.Y H:i",
				minDate:"+1970/01/02",
				minTime:"09:00",
				maxTime:"21:00",
				step:30
			});	

		} else { //если больше 16 часов, то можно заказать тоьлко на послезавтра

			jQuery("#delivery_date").datetimepicker({
				dayOfWeekStart:1, // неделя начинается с ПН
				//timepicker:false,
				closeOnDateSelect:0, // нужно выбрать и дату и время
				format:"d.m.Y H:i",
				minDate:"+1970/01/03",
				minTime:"09:00",
				maxTime:"21:00",
				step:30
			});	

		}
		</script>';
	}
}
add_action('body-before', 'datetimepicker_load_script'); 

Поделится информацией с друзьями

  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Datetimepicker
Ускорение сайта: новые требования
Рекомендации для васУскорение сайта: новые требованияOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.