#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 );