## WP_Date_Query: Класс для фильтрации запросов по дате в WordPress
Класс WP_Date_Query предназначен для генерации SQL выражений, которые позволяют фильтровать результаты основных запросов по дате. Это полезно для получения постов или комментариев, опубликованных в определённый период времени.
### Основные характеристики WP_Date_Query
Класс WP_Date_Query работает в рамках основного класса запросов WordPress, такого как WP_Query. Он генерирует подзапросы WHERE, которые добавляются к основному SQL-запросу. Если в фильтре используется недопустимое значение даты (например, месяц 13), будет выдано сообщение об ошибке.
**Пример производительности:**
- 1 запрос — 0.00050 сек (быстро)
- 50,000 запросов — 15.4 сек (медленно)
### Использование
Для начала вы можете создать экземпляр WP_Date_Query, передав парамет��ы для фильтрации.
```php
$date_query = new WP_Date_Query();
Теперь вы можете использовать методы этого класса для составления SQL-запросов.
Методы класса WP_Date_Query
public __construct( $date_query, $default_column = 'post_date' )— Конструктор класса.public build_mysql_datetime( $datetime, $default_to_max = false )— Формирует дату в формате MySQL.public build_time_query( $column, $compare, $hour = null, $minute = null, $second = null )— Создает запрос на основе времени.public build_value( $compare, $value )— Генерирует значение для SQL-запроса.public get_compare( $query )— Возвращает оператор сравнения.public get_sql()— Получает SQL выражение.protected get_sql_clauses()— Генерирует SQL-подзапросы.protected get_sql_for_clause( $query, $parent_query )— Генерирует SQL для конкретного подзапроса.protected get_sql_for_query( $query, $depth = 0 )— Генерирует SQL для массива запросов.protected get_sql_for_subquery( $query )— Генерирует SQL для подзапроса.protected is_first_order_clause( $query )— Проверяет, является ли запрос первым уровнем.public sanitize_query( $queries, $parent_query = null )— Очищает запросы.public sanitize_relation( $relation )— Очищает оператор связи между запросами.public validate_column( $column )— Проверяет допустимость колонок.public validate_date_values( $date_query = array() )— Проверяет значения дат на корректность.
Примеры использования
Пример 1: Запрос точных дат
Получаем SQL-выражение для периода с июля поSeptember 2013 года:
$query_args = [
'relation' => 'AND',
[ 'year' => 2013, 'month' => 7, 'compare' => '>=' ],
[ 'year' => 2013, 'month' => 9, 'compare' => '<=' ],
];
$query = new WP_Date_Query( $query_args, 'post_date' );
echo $query->get_sql();
/* Вывод:
AND (
( YEAR( wp_posts.post_date ) >= 2013 AND MONTH( wp_posts.post_date ) >= 7 )
AND
( YEAR( wp_posts.post_date ) <= 2013 AND MONTH( wp_posts.post_date ) <= 9 )
)
*/
Пример 2: Запрос относительных дат
Получаем посты за последние 2 недели относительно текущей даты:
$query_args = array(
array('after' => '2 weeks ago'),
);
$query = new WP_Date_Query( $query_args, 'post_date' );
echo $query->get_sql();
// Вывод:
// AND ( wp_posts.post_date > '2015-05-18 00:51:09' )
Пример 3: Посты, опубликованные до 1 июля 2015 года по будням
Запрос для получения всех постов, опубликованных до 1 июля 2015 года, только по будним дням:
$query_args = array(
'relation' => 'AND',
array(
'dayofweek_iso' => [ 1, 5 ],
'compare' => 'BETWEEN',
),
array(
'before' => 'July 1st, 2015'
),
);
$query = new WP_Date_Query( $query_args, 'post_modified' );
echo $query->get_sql();
/* Вывод:
AND (
WEEKDAY( wp_posts.post_modified ) + 1 BETWEEN 1 AND 5
AND
wp_posts.post_modified < '2015-07-01 00:00:00'
)
*/
Использование параметра "date_query" в WP_Query
Класс WP_Query теперь имеет расширенные возможности благодаря параметру date_query. Например, чтобы получить посты, опубликованные с 1 по 10 сентября 2013 года:
$posts = get_posts([
'date_query' => [
'before' => array('year' => 2013, 'month' => 9, 'day' => 10),
'after' => array('year' => 2013, 'month' => 9, 'day' => 1),
'inclusive' => true,
],
]);
Заключение
Класс WP_Date_Query предлагает мощные инструменты для фильтрации данных по дате. Вы можете использовать его для создания сложных запросов по датам и времени, что особенно полезно для разработчиков, работающих с динамическим контентом WordPress.