1

How can I do a query to return the post if the custom field array contains a date that is within the specified range? The query below is basically what I am after but it does not work...

// the income_dates array looks like this
// 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' => '<'
        ),
    )
); 
  • If you need data comparison, you have to save the dates into multiple metas. Please refer to the Codex for the usage of add_post_meta. – 1fixdotio Feb 1 '14 at 8:49
  • 1
    Okay, I am already doing that. The income_dates custom field is holding the dates of recurring incomes and I thoight it would be better in an array otherwise the database might fill up pretty quickly. – user537137 Feb 1 '14 at 9:03
2

I needed to get post with type event and the custom field "date" later than today, this sample of code worked perfectly for me, I hope it helps to someone in a similar situation.

            $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,
                )
            );
0

I suggest don't store the meta values as array because (I think) is not what you need. I think you really need to store each meta value individually with its own pair of key/value and not a single key with a serialized values. When done in this way, you can use the BETWEEN comparison:

$today = date("Y-m-d");
//'BETWEEN' comparison with 'type' date only works with dates in format YYYYMMDD.
//See 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'
         ),
     )
); 
  • Thanks for the reply and yeah that would work but I would prefer to keep the dates in a single entry so I've just fetched all posts and using an if statement to get the results I'm after – user537137 Feb 2 '14 at 7:12
  • @user537137 can you give an example of your code? – Andrew Welch Feb 8 '17 at 10:03
  • @AndrewWelch this was 3 years ago. Thanks for the interest but I don't even remember what this was for – user537137 Feb 9 '17 at 10:28
  • I figured it out now, but the documentation for meta queries involving dates is a bit fragmented to say the least. – Andrew Welch Feb 9 '17 at 11:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.