Как сделать wp_query с использованием "BETWEEN" для двух meta_values?

30 окт. 2013 г., 20:21:36
Просмотры: 21.1K
Голосов: 6

Я только начинаю работать с WordPress, уже сделал несколько запросов, но этот... ух! Он доставляет мне много хлопот!

Вот что я хочу сделать в запросе:

" ... WHERE "НУЖНОЕ_МНЕ_ЗНАЧЕНИЕ" BETWEEN event_start_date AND event_end_date ..."

Где "event_start_date" и "event_end_date" являются ключами мета-полей (я хочу использовать их значения, а не свои!)

Вот что у меня получилось пока..

$tEA = array(
    'post_type' => 'event',
    'meta_key' => $metaKey,
    'orderby' => 'meta_value',
    'order' => $order,
    'posts_per_page' => $postPerPage,
    'meta_query' => array(
        array(
            'key' => $metaKey,
            'value' => $today,
            'compare' => "=",
            'type' => 'DATE'
        ),
        array(
            'key' => '_event_end_time'
        )
    )
);
0
Все ответы на вопрос 3
4

Это должно сработать для вас:

$tEA = array(
    'post_type' => 'event',
    // вам не нужен meta_key, так как используется meta_query
    //'meta_key' => $metaKey,
    'orderby' => 'meta_value',
    'order' => $order,
    'posts_per_page' => $postPerPage,
    'meta_query' => array(
        array(
            'key' => $metaKey,
            // значение должно быть массивом (нижняя, верхняя граница) с BETWEEN
            'value' => array('START_DATE', 'END_DATE'),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        ),
    )
);

Обратите внимание, что START_DATE и END_DATE должны быть в формате даты MySQL YYYY-MM-DD

30 окт. 2013 г. 21:27:19
Комментарии

+1, но я почти уверен, что UNIX-метки времени вполне подходят.

kaiser kaiser
31 окт. 2013 г. 02:32:55

@kaiser Спасибо, но так как тип данных приводится к DATE, я не уверен, что WP правильно отформатирует его при построении meta_query, поэтому в данном случае безопаснее напрямую использовать формат даты MySQL.

Ahmad M Ahmad M
31 окт. 2013 г. 12:54:40

Ахмад, спасибо за ответ, но в моей задаче 'START_DATE' и 'END_DATE' должны быть meta_value этих полей. У меня есть событие, у которого есть "_event_start_date" и "_event_end_date", и они являются meta_keys.

Я хочу сделать "BETWEEN" с этими двумя meta_values. Я не хочу вручную вставлять значения, потому что эти значения являются meta_values.

Хе-хе..

Hor Hor
31 окт. 2013 г. 18:35:33

Если я сделаю, как вы говорите, посмотрите, что выводит запрос: "BETWEEN '_event_start_date' AND '_event_end_date')"

Hor Hor
31 окт. 2013 г. 18:39:02
3

Не тестировал, но что насчет этого?

$tEA = array(
    'post_type' => 'event', // Тип записи - событие
    'meta_key' => $metaKey, // Мета-ключ для сортировки
    'orderby' => 'meta_value', // Сортировка по значению метаполя
    'order' => $order, // Порядок сортировки
    'posts_per_page' => $postPerPage, // Количество постов на страницу
    'meta_query' => array( // Мета-запрос
        array(
            'key' => 'event_start_date', // Ключ - дата начала события
            'value' => 'VALUE_THAT_I_WANT', // Значение, которое нам нужно
            'compare' => '>=' // Оператор сравнения - больше или равно
        ),
        array(
            'key' => 'event_end_date', // Ключ - дата окончания события
            'value' => 'VALUE_THAT_I_WANT', // Значение, которое нам нужно
            'compare' => '<=' // Оператор сравнения - меньше или равно
        ),
        array(
            'key' => '_event_end_time' // Ключ - время окончания события
        )
    )
);

Не уверен, нужно ли вам другое сравнение, если нужно - просто добавьте его :P

30 окт. 2013 г. 20:31:54
Комментарии

теоретически должно работать.. но не работает =( Я пытаюсь это исправить. Если кто-то знает как это сделать, пожалуйста, не стесняйтесь написать!

Hor Hor
30 окт. 2013 г. 21:06:01

ты пробовал только с массивом event_start_date? Почему не работает? (нет результатов?)

Toni Michel Caubet Toni Michel Caubet
30 окт. 2013 г. 21:18:08

Да, нет результатов. Об этом я и говорю, теоретически должно работать.. но не работает! хехе!

Hor Hor
31 окт. 2013 г. 18:36:42
1
-1

Начиная с версии WP 3.7 вы можете передавать аргумент 'date_query'.

Пример, который возвращает записи с 1 января по 28 февраля:

$args = array(
    'date_query' => array(
        array(
            'after'     => 'January 1st, 2013',
            'before'    => array(
                'year'  => 2013,
                'month' => 2,
                'day'   => 28,
            ),
            'inclusive' => true,
        ),
    ),
    'posts_per_page' => -1,
);
$query = new WP_Query( $args );

Код взят с https://codex.wordpress.org/Class_Reference/WP_Query

27 сент. 2017 г. 14:38:36
Комментарии

Вопрос касается использования дат в метаданных, а не поля даты в таблице записей.

Milo Milo
27 сент. 2017 г. 18:23:41