meta_query для диапазона дат с использованием массива значений
Как сделать запрос, чтобы возвращалась запись, если пользовательское поле содержит дату в указанном диапазоне? Приведенный ниже запрос примерно то, что мне нужно, но он не работает...
// массив 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' => '<'
),
)
);
Мне нужно было получить записи типа "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,
)
);

Я рекомендую не хранить мета-значения в виде 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'
),
)
);

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

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