添加一个 select 字段,其时间间隔基于 WooCommerce 结帐中的开始、结束和休息时间
Add a select field with time intervals based on opening, closing and breaks times in WooCommerce checkout
我正在使用 WooCommerce 构建披萨外卖网站。事实上,当顾客结账时,他可以select什么时候送餐。
select 框应包含从当前时间到清除所有过去时间的 15 分钟间隔。我想要的第一个选项是“尽快”,然后下一个选项是一个小时后(四舍五入到最接近的 15 分钟),然后每次都是 15 分钟。
我们的送货时间如下:
- 星期一:关闭
- 周二 - 周五 11:30 - 14:00 & 17:00 - 22:00
- 周六和周日:13:00 - 22:00
我成功地 WooCommerce action/hook,但我无法禁用当前时间之前的所有时间段。
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;
}
关于 select 字段的问题,您可以使用以下内容
通过 $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 );
我正在使用 WooCommerce 构建披萨外卖网站。事实上,当顾客结账时,他可以select什么时候送餐。
select 框应包含从当前时间到清除所有过去时间的 15 分钟间隔。我想要的第一个选项是“尽快”,然后下一个选项是一个小时后(四舍五入到最接近的 15 分钟),然后每次都是 15 分钟。
我们的送货时间如下:
- 星期一:关闭
- 周二 - 周五 11:30 - 14:00 & 17:00 - 22:00
- 周六和周日:13:00 - 22:00
我成功地 WooCommerce action/hook,但我无法禁用当前时间之前的所有时间段。
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;
}
关于 select 字段的问题,您可以使用以下内容
通过 $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 );