Фильтрация meta_query в WP_Query по числовым значениям не работает

7 мая 2013 г., 21:08:06
Просмотры: 16K
Голосов: 4

Это была очень сложная формулировка.

У меня есть пользовательский тип записи "event" с полем выбора даты/времени "event_date", созданным с помощью плагина Advanced Custom Fields. Это поле сохраняет UNIX-временную метку в базу данных. Я пытаюсь использовать WP_Query для получения всех событий, которые происходят сегодня или в будущем. Вот код, который у меня есть сейчас:

$args = Array(
    'post_type'         => 'event',           // Тип записи - события
    'posts_per_page'    => -1,                // Получить все записи
    'meta_key'          => 'event_date',      // Ключ метаполя с датой
    'orderby'           => 'meta_value_num',  // Сортировка по числовому значению
    'order'             => 'ASC',             // По возрастанию
    'meta_query'        => array(             // Мета-запрос
                'key'       => 'event_date',   // Ключ метаполя
                'compare'   => '>=',           // Сравнение: больше или равно
                'value'     => intval(strtotime(date('Y-m-d'))), // Текущая дата в timestamp
                'type'      => 'numeric'      // Тип данных - числовой
    ),
);

$query = new WP_Query( $args );  // Создание нового запроса

Однако запрос возвращает все события, как прошедшие, так и будущие.

Я понимаю, что временные метки хранятся в базе данных как строки, поэтому сравнение 'compare' => '>=' обычно не работало бы, но согласно тому, что я нашел в Google и в Codex, параметр 'type' => 'numeric' должен преобразовать строку в число и позволить сравнить ее с моим значением сегодняшней даты в полночь. К сожалению, это не работает, и я не понимаю почему.

0
Все ответы на вопрос 2
2
10

Попробуйте использовать массив массивов в вашем meta_query.

$args = array(
    'post_type'         => 'event', // Тип записи - события
    'posts_per_page'    => -1, // Количество записей (-1 - вывести все)
    'meta_key'          => 'event_date', // Мета-ключ для сортировки
    'orderby'           => 'meta_value_num', // Сортировка по числовому значению
    'order'             => 'ASC', // Сортировка по возрастанию
    'meta_query'        => array( // Массив мета-запросов
         array(
                'key'       => 'event_date', // Ключ мета-поля
                'compare'   => '>=', // Оператор сравнения (больше или равно)
                'value'     => intval(strtotime(date('Y-m-d'))), // Текущая дата в timestamp
                'type'      => 'numeric' // Тип значения - числовой
         )
    ),
);

$query = new WP_Query( $args ); // Создаем новый запрос
7 мая 2013 г. 21:10:57
Комментарии

Большое спасибо, это также работает для меня с Unix Time. (Вы сэкономили мне кучу времени)

Ajay Patel Ajay Patel
22 нояб. 2014 г. 13:47:56

+1 за 'meta_value_num' вместо 'meta_value' для сравнения временных меток, которые хранятся как строки.

Drakes Drakes
6 июл. 2017 г. 20:53:49
0

Вау, ты спас мой день этим ответом! Я пытался фильтровать записи по пользовательскому числовому полю type_price и делал это так:

'meta_query' => array(
    array(
        'key' => 'type_price',
        'value' => array( 0, 500000 ),
        'compare' => 'BETWEEN',
        'type' => 'NUMERIC',
 )),

Но оказалось, что для сортировки по возрастанию нужно делать так:

array(
   'posts_per_page' => -1, 
   'meta_key' => 'type_price', 
   'orderby'  => 'meta_value_num', 
   'order' => 'ASC', 
       'meta_query' => array(
           array(
                'key' => 'type_price',
                'value' => array( 0, 500000 ),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC',
            )
        )),

Огромное спасибо :)

7 апр. 2016 г. 10:44:46