Для включения пользовательского часового пояса необходимы jQuery и ajax.Вот следующие шаги:
- раннее включение пользовательского сеанса WooCommerce (сеанс WC) ,
- получение часового пояса браузера пользователя (часовой пояс изпользовательский компьютер или устройство) ,
- отправка этого часового пояса в php через ajax,
- захват этого часового пояса в пользовательском сеансе WC,
- и использование егокод на дату и время php работает как
date()
, date_i18n()
, time()
…
Как только часовой пояс пользователя будет сохранен в сеансе WC, весь связанный код будет автоматически отключен (больше не требуется) .
Код:
// Early enable customer WC_Session (if not done)
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
}
// Get the browser user timezone and send it to php (Ajax)
add_action( 'wp_head', 'user_timmezone_js' );
function user_timmezone_js() {
if( ! WC()->session->get('time-zone') ) :
?>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
<script type="text/javascript">
jQuery( function($){
if (typeof woocommerce_params === 'undefined')
return false;
var tz = jstz.determine();
$.ajax({
type: "POST",
url: woocommerce_params.ajax_url,
data: ({
'action': 'time_zone',
'timezone': tz.name()
}),
success: function(response) {
console.log('Success: '+response);
}
});
});
</script>
<?php
endif;
}
// function that gets the Ajax data and save it to user WC Session
add_action( 'wp_ajax_time_zone', 'set_session_timezone' );
add_action( 'wp_ajax_nopriv_time_zone', 'set_session_timezone' );
function set_session_timezone() {
if ( isset($_POST['timezone']) && ! empty($_POST['timezone']) ){
WC()->session->set('time-zone', esc_attr($_POST['timezone']) );
echo WC()->session->get('time-zone');
}
die();
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы).
Затем вы включите следующее, чтобы получить и установить часовой пояс:
if( $timezone = WC()->session->get('time-zone') ) {
date_default_timezone_set($timezone);
}
Обновлено:
СейчасВаш код неверен при использовании woocommerce_get_item_data
, так как это ловушка фильтра и требует для возврата отфильтрованного содержимого (не отображать html) …
Попробуйте вместо этого: (не проверено) :
add_filter( 'woocommerce_get_item_data', 'display_cart_data_wc_bookings', 10, 2 );
function display_cart_data_wc_bookings( $item_data, $cart_item ){
if ( isset($cart_item['booking']) && ! empty($cart_item['booking']) && ! is_admin() ) {
// Get and set the user time zone
if( $timezone = WC()->session->get('time-zone') ) {
date_default_timezone_set($timezone);
}
$booking_data = $cart_item['booking'];
$date_format = apply_filters( 'woocommerce_bookings_date_format', wc_date_format() );
$time_format = apply_filters( 'woocommerce_bookings_time_format', wc_time_format() );
$start_date = apply_filters( 'woocommerce_bookings_get_start_date_with_time', date_i18n( $date_format, $booking_data['_start_date'] ) );
$start_time = apply_filters( 'woocommerce_bookings_get_start_date_with_time', date_i18n( $time_format, $booking_data['_start_date'] ) );
$end_time = apply_filters( 'woocommerce_bookings_get_end_date_with_time', date_i18n( $time_format, $booking_data['_end_date'] ) );
$persons = $booking_data['_persons'];
$booking_id = $booking_data['_booking_id'];
$item_data[] = array(
'key' => __('Date', 'woocommerce'),
'value' => esc_html( $start_date ),
'display' => esc_html( $start_date ),
);
$item_data[] = array(
'key' => __('Time', 'woocommerce'),
'value' => esc_html( $start_time ),
'display' => esc_html( $start_time ),
);
$count = 1;
foreach($persons as $person){
$item_data[] = array(
'key' => __('Person', 'woocommerce') . $count,
'value' => esc_html( $person ),
'display' => esc_html( $person ),
);
$count++;
}
$item_data[] = array(
'key' => __('Booking #', 'woocommerce'),
'value' => esc_html( $booking_id ),
'display' => esc_html( $booking_id ),
);
}
return $item_data;
}
Частично на основе: Как определить часовой пояс пользователя?