Дата и время в WordPress.
В WordPress существует множество настроек, связанных с датой и временем. Эти настройки позволяют владельцам сайтов легко изменять часовой пояс, формат даты и времени, а также первый день недели. Разрабатывая сайты на WordPress, всегда стоит помнить о географии данного сайта и настраивать дату и время соответственно. Статья «Дата и время в WordPress» поможет вам разобраться.
Формат даты и времени
В WordPress есть настройки для формата даты и времени, в большинстве случаев мы можем получить их при помощи:
$date_format = get_option( 'date_format' ); // Формат даты
$time_format = get_option( 'time_format' ); // Формат времени
$date_time_format = sprintf( '%s %s', get_option( 'date_format' ), get_option( 'time_format' ) ); // Формат даты и времени
Часовые пояса
Часовые пояса и переходы на летнее время могут оказаться наиболее сложной частью при работе с датами. WordPress хранит часовые пояса в количестве часов, которое необходимо сместить от UTC+0. Например, в Индии часовой пояс UTC+05:30, а в базе данных это значение равно 5,5, в то время как в Калифорнии часовой пояс UTC-08:00, а в базе данных это значение равно -8.
Таким образом, опция gmt_offset
может быть положительной или отрицательной, целым или дробным числом. Несмотря на то, что все звучит очень пугающе, на самом деле это очень удобно использовать в коде.
Например, давайте найдем текущую дату и время, несмотря на настройки сайта:
$offset = (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
Перевод Даты и Времени
Некоторые форматы дат содержат названия месяцев или дней, которые должны быть переводимы. Например, формат F должен возвращать January для английского сайта и Январь для русского.
Используйте функции wp_date
или date_i18n
WordPress для работы с датами и тогда они будут переводимы и доступны на разных языках.
Разница между этими функциями: date_i18n — это устаревшая функция с обратной совместимостью для старого кода. Честно говоря, я не вижу никаких практических причин использовать функцию date_i18n в настоящее время, и вы можете использовать wp_date везде. Однако, вы должны тщательно тестировать ваши изменения (если редактируете старый сайт) при замене date_i18n на wp_date, потому что это может вызвать проблемные моменты.
Первый день недели
Если логика вашего кода использует параметр «первый день недели» знайте, что WordPress имеет параметр start_of_week
. Например, количество отправленных сообщений за прошлую неделю. Когда началась прошлая неделя? В воскресенье? В понедельник? Кто знает?
Обычно этот параметр возвращает число от 0 до 6, где 0 — это воскресенье, а 6 — суббота.
$start_of_week = (int) get_option( 'start_of_week', 0 );
Как хранить дату и время в базе данных
Определенно не следует хранить дату и время в формате WordPress. В базе данных у вас есть только один правильный вариант для хранения даты и времени в формате SQL — YYYY-MM-DD HH:MI:SS
, например, 2023-02-27 12:41:23.
Во-первых, это читаемо для человека, и те, кто просматривает ваши данные в SQL, могут понять, когда они были отправлены, без лишних действий. Во-вторых, SQL работает довольно хорошо со своим форматом дат, и вы можете вносить любые изменения в даты непосредственно в SQL-запросах.
SQL запрос для дата и временя в WordPress
Когда вам нужно получить период дат, в большинстве случаев можно использовать функции или объекты WordPress, такие как WP_Query
, get_posts
и т.д. Однако, когда вы работаете с пользовательскими таблицами, вам придется написать свои собственные SQL-запросы. И порой, эти запросы зависят от дат.
Например, мне нужно получить записи, сделанные 28 января. Для UTC+0 запрос будет выглядеть так:
SELECT * FROM records WHERE date >= 28.01.2023 00:00:00 AND date < 29.01.2023 00:00:00
Запрос очень простой, но что, если владелец сайта живет в Калифорнии (UTC-08:00)? День в Калифорнии начинается 27.01.2023 в 16:00:00 и заканчивается 28.01.2023 в 16:00:00. Вам нужно рассчитать смещение на PHP.
$offset = (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
$timestamp_start = date_format( date_create( '2023-01-28' ), 'U' );
$timestamp_end = date_format( date_create( '2023-01-29' ), 'U' );
$wpdb->query(
$wpdb->prepare(
'SELECT * FROM records WHERE date >= %s AND date < %s',
date_format( $timestamp_start + $offset, 'Y-m-d H:i:s' ),
date_format( $timestamp_end + $offset, 'Y-m-d H:i:s' )
)
);
Или вы можете сделать это на стороне SQL. К счастью, SQL имеет много инструментов, которые помогут вам работать с датами:
$wpdb->query(
$wpdb->prepare(
'SELECT * FROM records WHERE date >= DATE_ADD(%1$s, INTERVAL %3$d MINUTE) AND date < DATE_ADD(%2$s, INTERVAL %3$d MINUTE)',
date_format( date_create( '2023-01-28' ), 'Y-m-d H:i:s' ),
date_format( date_create( '2023-01-29' ), 'Y-m-d H:i:s' ),
get_option( 'gmt_offset' ) * HOUR_IN_SECONDS
)
);
Не используйте функцию NOW()
в SQL. Серверы SQL имеют свой собственный часовой пояс и смещения. Чтобы получить текущее время, вместо этого вы можете использовать функцию UTC_TIMESTAMP
.
Своя функция. Дата и время в WordPress
Мы можем создать свою собственную функцию, которая позволит не запоминать названия всех параметров и всегда использовать ее в своем коде:
function prefix_datetime_format( $timestamp, $format = '', $is_utc = false ) {
if ( $format === '' ) {
$format = sprintf( '%s %s', get_option( 'date_format' ), get_option( 'time_format' ) );
}
$timezone = $is_utc ? 'UTC' : '';
return wp_date( $format, $timestamp, timezone );
}
Заключение. Дата и время в WordPress.
Правильная работа с датой и временем в WordPress — это важная задача для разработчиков, которые хотят создать надежный и функциональный веб-сайт. Ошибки в работе с датой и временем могут привести к серьезным проблемам и ошибкам в функциональности сайта. Хорошо изучить концепции, такие как часовые пояса, форматы дат, хранение даты и времени в базе данных, SQL-запросы и т.д., позволит создать надежный и работоспособный сайт, который будет правильно отображать дату и время в любом часовом поясе. Кроме того, использование встроенных функций WordPress, таких как wp_date, позволяет существенно упростить работу с датой и временем и сократить вероятность ошибок.