Вопрос или проблема
Я использую плагин wp-hotelier. Страница /booking
отображает даты/время $checkin
и $checkout
в удобочитаемом формате (например, 30 января 2025 (12:00 – 21:00) / 31 января 2025 (08:00 – 13:00))… и это выводится через <?php echo esc_html( $checkin ); ?>
и <?php echo esc_html( $checkout ); ?>
соответственно в шаблоне booking/reservation-details.php
.
Я пытаюсь вывести тот же формат дат/времени через шорткод, который отображает шаблон room-content.php
, но использование того же PHP-кода изменяет формат на 2025-01-30
и 2025-01-31
.
Я нашел функцию, которая, как я полагаю, контролирует вывод этих дат на странице /booking
, внутри class HTL_Booking
, и похоже, что функция передает дату и формат в шаблон booking/reservation-details.php
:
public function booking_details() {
$checkin = date_i18n( get_option( 'date_format' ), strtotime( $this->checkin ) ) . ' (' . HTL_Info::get_hotel_checkin() . ')';
$checkout = date_i18n( get_option( 'date_format' ), strtotime( $this->checkout ) ) . ' (' . HTL_Info::get_hotel_checkout() . ')';
$pets_message = HTL_Info::get_hotel_pets_message();
$cards = HTL_Info::get_hotel_accepted_credit_cards();
htl_get_template( 'booking/reservation-details.php', array(
'booking' => $this,
'checkin' => $checkin,
'checkout' => $checkout,
'pets_message' => $pets_message,
'cards' => $cards,
) );
}
Я пытался изменить эту функцию, чтобы также передавать данные в шаблон room-content.php
, но потерпел неудачу из-за ограниченных знаний PHP. Я пытался изменить первый аргумент в функции htl_get_template
на массив с дополнительным шаблоном: htl_get_template( array('booking/reservation-details.php', 'room-list/room-content.php'), ...
, но формат даты не изменился.
Я хотел бы получить помощь, чтобы правильно отформатировать дату в шаблоне room-content.php
. Я, вероятно, также захочу использовать это в других шаблонах. Я заинтересован в обучении, поэтому буду благодарен за любые дополнительные объяснения и руководство! Спасибо
Извиняюсь за вопрос не по теме. Я нашел ответ на StackOverflow, это PHP вопрос, не специфический для WordPress. Следующий код изменяет формат как требуется. Из https://stackoverflow.com/questions/2487921/convert-a-date-format-in-php
<?php $new_checkin = date('jS F Y', strtotime($checkin)); ?>
<?php echo esc_html( $new_checkin ); ?>
Ответ или решение
Вопрос о повторном использовании формата даты в различных шаблонах в рамках работы с плагином WordPress wp-hotelier имеет не только технический, но и концептуальный аспект. В данном случае, задача заключается в том, чтобы единообразно выводить даты в нескольких шаблонах сайта, что подразумевает необходимость понимания того, как управлять форматированием данных на стороне сервера в рамках WordPress. Рассмотрим ситуацию более детально.
Теория
Веб-разработка на платформе WordPress осуществляется через использование PHP, что дает большие возможности для кастомизации, а именно выполнения пользовательских нужд за счет использования таких концептов, как шаблоны и короткие коды (shortcodes). В данном случае, вы столкнулись с проблемой различных форматов вывода дат на двух страницах, что связано с тем, как именно функция date_i18n
и другие функции обработки данных реализованы в ваших PHP-файлах.
Функция date_i18n
используется для форматирования даты в WordPress с учетом настроек локализации, что обычно определено в админпанели WordPress под "Настройки → Общие". Она позволяет выводить дату в зависимости от формата, который задает пользователь, что обеспечивает гибкость в отображении информации.
Пример
В вашем случае, функция в классе HTL_Booking
формирует строку даты с использованием date_i18n
, а затем добавляет к ней время заселения и выезда. Этот метод работает в шаблоне booking/reservation-details.php
для корректного вывода данных. Вы пытаетесь применить этот же подход к шаблону room-content.php
, однако сталкиваетесь с проблемой, что простой вывод переменной $checkin
или $checkout
не дает нужного результата.
Проблема состоит в том, что данные передаются в шаблон уже в отформатированном виде, а другой шаблон может выводить их в формате по умолчанию, заданном в самой базе данных или в другом месте кода. Этот процесс можно проиллюстрировать следующим кодом:
public function booking_details() {
// Форматирование даты под нужный нам вид
$checkin = date_i18n( get_option( 'date_format' ), strtotime( $this->checkin ) ) . ' (' . HTL_Info::get_hotel_checkin() . ')';
$checkout = date_i18n( get_option( 'date_format' ), strtotime( $this->checkout ) ) . ' (' . HTL_Info::get_hotel_checkout() . ')';
// Передача отформатированных строк в нужный шаблон
htl_get_template('booking/reservation-details.php', array(
'checkin' => $checkin,
'checkout' => $checkout
));
}
Применение
Чтобы повторно использовать это форматирование в других шаблонах, таких как room-content.php
, необходима дополнительная функция, которая выполняла бы аналогичное преобразование данных даты и времени. Это может быть сделано путем создания нового метода в вашем классе, который будет возвращать правильно отформатированные строки:
public function format_checkin_checkout_dates() {
return array(
'checkin' => date_i18n( get_option( 'date_format' ), strtotime( $this->checkin ) ) . ' (' . HTL_Info::get_hotel_checkin() . ')',
'checkout' => date_i18n( get_option( 'date_format' ), strtotime( $this->checkout ) ) . ' (' . HTL_Info::get_hotel_checkout() . ')'
);
}
Вызывая данный метод в любом другом месте кода, вы сможете получать те же самые форматированные строки и передавать их в любой шаблон:
$date_details = $your_class_instance->format_checkin_checkout_dates();
echo esc_html($date_details['checkin']);
echo esc_html($date_details['checkout']);
Ваша задача будет заключаться в интеграции данной методологии в систему, что позволит добиться консистентности в выведении информации и упростит дальнейшую работу с элементами UI. Теперь, независимо от того, в каком шаблоне вы хотите воспроизвести формат даты, будет достаточно вызвать ваш метод, что обеспечит копирование формата использования данных и позволит избежать избыточности кода. Это не только упрощает поддержание кода, но и повышает его читаемость и надежность.
Таким образом, переход от статического повторного использования к динамическому управлению форматированием на уровне методов класса — это мощный и практичный способ, который позволит решить вашу задачу и сделает систему более гибкой к изменениям требований в будущем. Надеюсь, данное разъяснение окажется полезным для вашей работы с WordPress и поможет успешно реализовать задуманное.