Автор: Stasyuk Eugene 49 Мітки: , , 03.04.2024

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

Повернутися на головну

Інші статті

Спливаюче вікно на сайті (попап, модальне вікно) pop-up window

Спливаюче вікно на сайті (попап, модальне вікно)

Спливаюче вікно на сайті (попап, модальне вікно)

Коли я тільки освоював ази розробки, спливаюче вікно я робив вручну. Так, так – замість того, щоб знайти якесь готове рішення, я займався цією невдячною справою 🤪. Мені здавалося, що особливо нічого складного в цьому немає. Але, тільки через якийсь час роботи над цим питанням, я почав усвідомлювати, що зробити це не так вже й […]

Position sticky не працює position: sticky

Position sticky не працює

Position sticky не працює

Position sticky не працює – на мій подив це доволі частий запит, з яким я сам свого часу зіткнувся. Sticky – це досить просте й універсальне рішення для розміщення липких блоків на сторінці. Як мінімум, воно не вимагає від тебе пристойної кількості javascript коду, який і працював місцями кострубато. Зараз же цю процедуру можна зробити […]