WP_Date_Query: Фильтрация запросов по дате в WordPress

## 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

  1. public __construct( $date_query, $default_column = 'post_date' ) — Конструктор класса.
  2. public build_mysql_datetime( $datetime, $default_to_max = false ) — Формирует дату в формате MySQL.
  3. public build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) — Создает запрос на основе времени.
  4. public build_value( $compare, $value ) — Генерирует значение для SQL-запроса.
  5. public get_compare( $query ) — Возвращает оператор сравнения.
  6. public get_sql() — Получает SQL выражение.
  7. protected get_sql_clauses() — Генерирует SQL-подзапросы.
  8. protected get_sql_for_clause( $query, $parent_query ) — Генерирует SQL для конкретного подзапроса.
  9. protected get_sql_for_query( $query, $depth = 0 ) — Генерирует SQL для массива запросов.
  10. protected get_sql_for_subquery( $query ) — Генерирует SQL для подзапроса.
  11. protected is_first_order_clause( $query ) — Проверяет, является ли запрос первым уровнем.
  12. public sanitize_query( $queries, $parent_query = null ) — Очищает запросы.
  13. public sanitize_relation( $relation ) — Очищает оператор связи между запросами.
  14. public validate_column( $column ) — Проверяет допустимость колонок.
  15. 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.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *