Автор: Stasyuk Eugene 66 Метки: , , 03.04.2024

Класс 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);

Вернуться на главную

Другие статьи

Как вытянуть содержимое svg из тега img? Вариант 2 svg

Как вытянуть содержимое svg из тега img? Вариант 2

Как вытянуть содержимое svg из тега img? Вариант 2

Если мы используем php в разработке, то вытянуть содержимое svg из картинки становиться проще простого. Для этого нам достаточно иметь путь к картинке. В данном деле к нам на помощь приходит функция file_get_contents() . Более подробно про нее можно прочитать здесь. Примерно использование данной функции будет выглядеть так: Здесь нужно обратить внимание на два момента: […]

Создание интерактивной карты Google с маркерами адресов

Создание интерактивной карты Google с маркерами адресов

Создание интерактивной карты Google с маркерами адресов

Сегодня разберем как сделать google map со списком адресов. Важная особенность заключается в том, что при клике на какой-либо из адресов, в центре карты должен отобразиться маркер с этим адресом.