meta_query для диапазона дат с использованием массива значений

1 февр. 2014 г., 10:37:48
Просмотры: 14.5K
Голосов: 2

Как сделать запрос, чтобы возвращалась запись, если пользовательское поле содержит дату в указанном диапазоне? Приведенный ниже запрос примерно то, что мне нужно, но он не работает...

// массив income_dates выглядит так
// a:3:{i:0;s:10:"2014-02-01";i:1;s:10:"2014-03-01";i:2;s:10:"2014-03-29";}

$today = date("Y-m-d");
$date1 = date("Y-m-d", strtotime($today . "-1 Month"));
$date2 = date("Y-m-d", strtotime($today . "+1 Month"));

$args = array(
    'post_type' => 'income',
    'meta_query' => array( 
        array(
            'key' => 'income_dates',
            'value' => $date1,
            'type'  => 'date',
            'compare' => '>'
        ),
        array(
            'key' => 'income_dates',
            'value' => $date2,
            'type'  => 'date',
            'compare' => '<'
        ),
    )
); 
2
Комментарии

Если вам нужно сравнение данных, вам необходимо сохранять даты в несколько метаполей. Пожалуйста, обратитесь к Кодексу для использования функции add_post_meta.

1fixdotio 1fixdotio
1 февр. 2014 г. 10:49:17

Хорошо, я уже это делаю. Пользовательское поле income_dates хранит даты повторяющихся доходов, и я подумал, что лучше использовать массив, иначе база данных может очень быстро заполниться.

user537137 user537137
1 февр. 2014 г. 11:03:25
Все ответы на вопрос 2
0

Мне нужно было получить записи типа "event" с произвольным полем "date", значение которого больше текущей даты. Этот пример кода отлично сработал для меня, надеюсь, он поможет кому-то в похожей ситуации.

            $today = date("Y-m-d");
            $today1 = date("Ymd", strtotime("$today"));
            $custom_meta = array(
                array(
                    'key' => 'data_de_inicio',
                    'value'=>$today1,
                    'compare'=>'>',
                    'type'=>'date',
                ),
            );
            $query = new WP_Query(array(
                'post_type'=>'event',
                'showposts'=>'3',
                'orderby'=>'meta_value',
                'meta_key'=>'data_de_inicio',
                'order'=>'asc',
                'meta_query'=>$custom_meta,
                )
            );
5 июн. 2015 г. 16:53:50
4

Я рекомендую не хранить мета-значения в виде array, потому что (как мне кажется) это не совсем то, что вам нужно. Думаю, вам действительно стоит хранить каждое мета-значение отдельно с собственной парой ключ/значение, а не один ключ с сериализованными значениями. Если сделать именно так, вы сможете использовать сравнение BETWEEN:

$today = date("Y-m-d");
//Сравнение 'BETWEEN' с 'type' date работает только с датами в формате YYYYMMDD.
//Смотрите http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters 
$date1 = date("YYYYMMDD", strtotime($today . "-1 Month"));
$date2 = date("YYYYMMDD", strtotime($today . "+1 Month"));

$args = array(
    'post_type' => 'income',
    'meta_query' => array( 
     array(
         'key' => 'income_dates',
         'value' =>  array($date1,$date2),
         'type'  => 'date',
         'compare' => 'BETWEEN'
         ),
     )
); 
1 февр. 2014 г. 13:13:14
Комментарии

Спасибо за ответ, и да, это сработало бы, но я предпочел оставить даты в одной записи, поэтому просто получил все записи и использую условный оператор для получения нужных результатов

user537137 user537137
2 февр. 2014 г. 09:12:36

@user537137 не могли бы вы привести пример вашего кода?

Andrew Welch Andrew Welch
8 февр. 2017 г. 12:03:57

@AndrewWelch это было 3 года назад. Спасибо за интерес, но я даже не помню, для чего это было нужно

user537137 user537137
9 февр. 2017 г. 12:28:17

Теперь я разобрался, но документация по метазапросам, связанным с датами, мягко говоря, несколько разрозненна.

Andrew Welch Andrew Welch
9 февр. 2017 г. 13:49:59