Класс WP_Query — это один из инструментов WordPress который помогает вывести посты по необходимым параметрам: категории, сортировка, диапазон дат и т.д. Список параметров довольно приличный. Подробнее с ними в документации можно ознакомиться здесь: https://developer.wordpress.org/reference/classes/wp_query/ . Некоторые параметры довольно обширные и иногда куда проще разобраться в них, когда есть готовые примеры. И у меня как раз такой есть.
Посты сайта привязаны к событиям, которые имеют дату проведения. В админке на странице редактирования поста я вывел произвольное поле с выбором даты. Произвольное поле так и называется 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);