Клас WP_Query – це один з інструментів WordPress, який допомагає вивести пости за необхідними параметрами: категорії, сортування, діапазон дат тощо. Список параметрів досить пристойний. Детальніше з ними в документації можна ознайомитися тут: https://developer.wordpress.org/reference/classes/wp_query/ . Деякі параметри досить великі й іноді куди простіше розібратися в них, коли є готові приклади. І у мене якраз такий є.
Пости сайту прив’язані до подій, які мають дату проведення. В адмінці на сторінці редагування поста я вивів meta поле з вибором дати. Воно такий slug і має: date
На архівній сторінці у нас є форма з фільтром, у якому є два input із зазначенням діапазону дат, що нас цікавить:
Код повністю
А це означає, що значення дат ми будемо брати з GET параметрів нашого запиту. Повний код із зазначенням параметрів для WP_Query матиме такий вигляд:
$args = [
'posts_per_page' => 12,
];
$date = [
'date_from' => !empty($_GET['date_from']) ? $_GET['date_from'] : false,
'date_to' => !empty($_GET['date_to']) ? $_GET['date_to'] : false,
];
//set the date format
foreach ($date as $name => $value):
if (!$value) continue;
$date_val = date_create($value);
$date[$name] = date_format($date_val, 'Ymd');
endforeach;
//set meta query
if ($date['date_from'] || $date['date_to']):
if ($date['date_from'] && !$date['date_to']) {
$args['meta_query'][] = [
'key' => 'date',
'value' => $date['date_from'],
'compare' => '>=',
'type' => 'DATE'
];
}
if (!$date['date_from'] && $date['date_to']) {
$args['meta_query'][] = [
'key' => 'date',
'value' => $date['date_to'],
'compare' => '<=',
'type' => 'DATE'
];
}
if ($date['date_to'] && $date['date_from'] ) {
$args['meta_query'][] = [
'key' => 'date',
'value' => [
$date['date_from'],
$date['date_to']
],
'compare' => 'BETWEEN',
'type' => 'DATE'
];
}
endif;
$query = new WP_Query($args);
Діапазон дат у WP_Query будемо задавати в параметрі meta_query
.
Створюємо масив із параметрами:
$args = [
'posts_per_page' => 12,
];
Створюємо масив у який ми помістимо значення діапазону дат. Залежно від наявності значень, ми будемо задавати різні параметри meta_query
:
$date = [
'date_from' => !empty($_GET['date_from']) ? $_GET['date_from'] : false,
'date_to' => !empty($_GET['date_to']) ? $_GET['date_to'] : false,
];
Далі ми встановлюємо потрібний нам формат дат. Робити це ми будемо за допомогою циклу:
foreach ($date as $name => $value):
if (!$value) continue;
$date_val = date_create($value);
$date[$name] = date_format($date_val, 'Ymd');
endforeach;
Діапазон дат – параметри в meta_query
Далі перейдемо безпосередньо до meta_query параметру. Він може мати один або кілька масивів із такими ключами:
- key – (string) назва довільного поля за яким буде фільтрація;
- type – (string) тип поля. Можливі варіанти ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’. За замовчуванням ‘CHAR’.;
- value – (string|array) Значення нашого довільного поля. Це може бути масив, тільки якщо ключ compare має значення ‘IN’, ‘NOT IN’, ‘BETWEEN’ або ‘NOT BETWEEN’.
- compare – (string) Оператор для перевірки. Можливі значення: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘EXISTS’ и ‘NOT EXISTS’. Значення за замовчуванням – ‘=’.
Якщо у нас буде відома дата початку, але невідома дата закінчення:
if ($date['date_from'] && !$date['date_to']) {
$args['meta_query'][] = [
'key' => 'date',
'value' => $date['date_from'],
'compare' => '>=',
'type' => 'DATE'
];
}
Якщо у нас буде відома дата закінчення, але невідома дата початку:
if (!$date['date_from'] && $date['date_to']) {
$args['meta_query'][] = [
'key' => 'date',
'value' => $date['date_to'],
'compare' => '<=',
'type' => 'DATE'
];
}
Коли відомі обидві дати. Звертаю увагу, що в value
ми будемо додавати масив зі значеннями, які будуть між собою порівнюватися:
if ($date['date_to'] && $date['date_from'] ) {
$args['meta_query'][] = [
'key' => 'date',
'value' => [
$date['date_from'],
$date['date_to']
],
'compare' => 'BETWEEN',
'type' => 'DATE'
];
}
Ну і нарешті поміщаємо змінну $args в клас WP_Quey і за допомогою циклу виводимо наші пости. Як використовувати цикл можна подивитися тут.
$query = new WP_Query($args);