Поле динамического выбора, основанное на выбранной дате выбора даты в Woocommerce

Этот пост является продолжением другого вопроса:
Параметры поля динамического выбора на основе выбранного дня в кассе Woocommerce

Итак, с помощью этого ответа мне удалось построить динамическое поле выбора на странице оформления заказа, в котором были изменены параметры, основанные на выбранной дате из DatePicker. Это решение отлично работает на авторском тестовом сервере…

тем не мение на моем сайте код дает некоторые проблемы, если дата пикета в мае или октябре. На самом деле кажется, что это не работает вообще.

Таковы были и есть основные требования:

Если пн-пт выбран, самовывоз (‘delivery_time’) каждые 30 минут с 10:00 до 18:00

Если выбрано Sat-Sun, самовывоз (‘delivery_time’) каждые 30 минут с 10:00 до 15:00

Доступны только первые воскресенья в месяце. Другие воскресенья, вариантов нет. (новое требование добавлено в апреле и работает)

Может ли это иметь какое-либо отношение к моей установке? Я пытался отключить все плагины и деактивированный локализатор для Datepicker.

Ниже приведен код для динамического выбора:

/**
*
* 2018-04-16
* Picking date and time
* Dynamic select based on selected day
*
*/

add_action( 'wp_enqueue_scripts', 'enabling_date_picker' );
function enabling_date_picker() {

// Only on front-end and checkout page
if( is_admin() || ! is_checkout() ) return;

// Load the datepicker jQuery-ui plugin script
wp_enqueue_script( 'jquery-ui-datepicker' );
wp_enqueue_style('jquery-ui', "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/smoothness/jquery-ui.css", '', '', false);
}

// Datepicker field and select time field
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_field' );
function datepicker_custom_field($checkout) {

echo '<h3>' . __('Hvornår vil du hente din ordre?') . '</h3>';
echo '<div id="date-time-wrapper">';

woocommerce_form_field('delivery_date', array(
'type' => 'text',
'class'=> array('delivery-date-class form-row-first'),
'label' => __('Vælg dato for afhentning'),
'required' => true,
//'placeholder' => __('Pick a date')
), $checkout->get_value('delivery_date') );

$options = array('' => __('Afhentning kl.') );

woocommerce_form_field( 'delivery_time', array(
'type'          => 'select',
'class'         => array('delivery-time-class form-row-last'),
'label'         => __('Vælg tidspunkt for afhentning'),
'required'      => true,
'options'       => $options,
),  $checkout->get_value( 'delivery_time' ) );

// Restricted options array
$options1 = array(
'10:00'   => __( '10:00' ),
'10:30'   => __( '10:30' ),
'11:00'   => __( '11:00' ),
'11:30'   => __( '11:30' ),
'12:00'   => __( '12:00' ),
'12:30'   => __( '12:30' ),
'13:00'   => __( '13:00' ),
'13:30'   => __( '13:30' ),
'14:00'   => __( '14:00' ),
'14:30'   => __( '14:30' ),
'15:00'   => __( '15:00' ),
);

// The other part of options array
$options2 = array(
'15:30'   => __( '15:30' ),
'16:00'   => __( '16:00' ),
'16:30'   => __( '16:30' ),
'17:00'   => __( '17:00' ),
'17:30'   => __( '17:30' ),
'18:00'   => __( '18:00' ),

);

// The third part of options array
$options3 = array(
'Sundays_Closed' => __( 'Åbent første søndag i måneden'),
);

// Merging options arrays
$options1 = array_merge($options, $options1); // Partial
$options  = array_merge($options1,$options2); // Full

echo '<br clear="all"></div>';

?>
<script language="javascript">
jQuery( function($){
var a = <?php echo json_encode($options); ?>,
b = <?php echo json_encode($options1); ?>,
e = <?php echo json_encode($options3); ?>,
c = new Date(),
s = 'select#delivery_time';

// Utility function to fill dynamically the select field options
function dynamicSelectOptions( opt ){
var o = '';
$.each( opt, function( key, value ){
o += '<option value="'+key+'">'+value+'</option>';
});
$(s).html(o);
}

// Once DOM is loaded

//Only open first Sunday in month
if( c.getDay() == 0 && c.getDate() > 7 ){
dynamicSelectOptions( e );
}

else if( c.getDay() == 6 || c.getDay() == 0){
dynamicSelectOptions( b );
}

else
dynamicSelectOptions( a );

// Select time to selectWoo
$(s).selectWoo();

// Datepicker
$('#delivery_date').datepicker({
dateFormat: 'd MM, y',
minDate:1,
maxDate:new Date(2018, 12),
onSelect: function(){
// Live event: On selected date event
var d = new Date($(this).val());

//Only first Sunday in month open
if( d.getDay() == 0 && d.getDate() > 7 ){
dynamicSelectOptions( e );
}

else if( d.getDay() == 6 || d.getDay() == 0){
dynamicSelectOptions( b );
}

else
dynamicSelectOptions( a );
}
}).parent().after('<div id="order-desc"></div>');
});
</script>
<?php
}

1

Решение

Я сделал несколько небольших изменений в вашем коде:

  • Я переместил скрипт jQuery в конец нижнего колонтитула (так как это лучший способ для jQuery).
  • Я включил все ваши опции выбора (все разные массивы) в отдельную служебную функцию.

Но я не уверен, что это будет работать на вашей конфигурации сервера … Я надеюсь, что это решит проблему (которой у меня нет на обоих тестовых серверах).

Ваш код пересмотрен код:

add_action( 'wp_enqueue_scripts', 'enabling_date_picker' );
function enabling_date_picker() {

// Only on front-end and checkout page
if( is_admin() || ! is_checkout() ) return;

// Load the datepicker jQuery-ui plugin script
wp_enqueue_script( 'jquery-ui-datepicker' );
wp_enqueue_style('jquery-ui', "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/smoothness/jquery-ui.css", '', '', false);
}

// Utility function (with all option arrays)
function select_options( $type = '' ){
$options = array('' => __('Afhentning kl.') ); // Default start
$options1 = array( // Restricted options array
'10:00' => __( '10:00' ), '10:30' => __( '10:30' ), '11:00' => __( '11:00' ),
'11:30' => __( '11:30' ), '12:00' => __( '12:00' ), '12:30' => __( '12:30' ),
'13:00' => __( '13:00' ), '13:30' => __( '13:30' ), '14:00' => __( '14:00' ),
'14:30' => __( '14:30' ), '15:00' => __( '15:00' ),
);
$options2 = array( // complementary options array
'15:30' => __( '15:30' ), '16:00' => __( '16:00' ), '16:30' => __( '16:30' ),
'17:00' => __( '17:00' ), '17:30' => __( '17:30' ),'18:00' => __( '18:00' ),
);

if( $type == 'partial' ){
return array_merge($options, $options1); // Partial;
} elseif ( $type == 'full' ){
return array_merge($options,$options1,$options2); // Full
} elseif ( $type == 'close' ){
return array( 'Sundays_Closed' => __( 'Åbent første søndag i måneden') ); // Sundays closed
} else {
return $options; // Default (start)
}
}

// Checkout Datepicker field and select time field
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_field' );
function datepicker_custom_field($checkout) {

echo '<h3>' . __('Hvornår vil du hente din ordre?') . '</h3>';
echo '<div id="date-time-wrapper">';

woocommerce_form_field('delivery_date', array(
'type' => 'text',
'class'=> array('delivery-date-class form-row-first'),
'label' => __('Vælg dato for afhentning'),
'required' => true,
//'placeholder' => __('Pick a date')
), $checkout->get_value('delivery_date') );

$options = select_options();

woocommerce_form_field( 'delivery_time', array(
'type'          => 'select',
'class'         => array('delivery-time-class form-row-last'),
'label'         => __('Vælg tidspunkt for afhentning'),
'required'      => true,
'options'       => $options,
),  $checkout->get_value( 'delivery_time' ) );

echo '<br clear="all"></div>';
}

add_action( 'wp_footer', 'date_picker_js_script' );
function date_picker_js_script() {
// Only on checkout page
if( ! is_checkout() ) return;
?>
<script language="javascript">
jQuery( function($){
var a = <?php echo json_encode(select_options('full')); ?>,
b = <?php echo json_encode(select_options('partial')); ?>,
e = <?php echo json_encode(select_options('close')); ?>,
c = new Date(),
s = 'select#delivery_time';

// Utility function to fill dynamically the select field options
function dynamicSelectOptions( opt ){
var o = '';
$.each( opt, function( key, value ){
o += '<option value="'+key+'">'+value+'</option>';
});
$(s).html(o);
}

// ===> Just for testing - To be removed
console.log('Day: '+c.getDay()+' | Date: '+c.getDate());

// 1. Once DOM is loaded
if( c.getDay() == 0 && c.getDate() > 7 ){ // Only open first Sunday in month
dynamicSelectOptions( e );
}  else if( c.getDay() == 6 || c.getDay() == 0){ // Weekends
dynamicSelectOptions( b );
} else { // all others days
dynamicSelectOptions( a );
}

// Select time to selectWoo
$(s).selectWoo();

// Datepicker
$('#delivery_date').datepicker({
dateFormat: 'd MM, y',
minDate:1,
maxDate:new Date(2018, 12),
onSelect: function(){
// On live calendar event: On selected date event
var d = new Date($(this).val());

// ===> Just for testing - To be removed
console.log('Day: '+d.getDay()+' | Date: '+d.getDate());

if( d.getDay() == 0 && d.getDate() > 7 ) { // Only first Sunday in month open
dynamicSelectOptions( e );
} else if( d.getDay() == 6 || d.getDay() == 0) { // Weekends
dynamicSelectOptions( b );
} else { // all others days
dynamicSelectOptions( a );
}
}
}).parent().after('<div id="order-desc"></div>');
});
</script>
<?php
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы).

Я проверил ваш код на 2 разных тестовых серверах с WooCommerce 3.2.x и 3.3.x, и он работает (проверял это на разных браузерах и платформах).

Эта проблема может быть связана с вашей темой, некоторыми плагинами или другими настройками, сделанными вами.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector