meta_query pe un interval de date folosind un array de valori

1 feb. 2014, 10:37:48
Vizualizări: 14.5K
Voturi: 2

Cum pot face o interogare care să returneze postarea dacă array-ul din câmpul personalizat conține o dată care se află în intervalul specificat? Interogarea de mai jos este în esență ceea ce doresc, dar nu funcționează...

// array-ul income_dates arată astfel
// 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
Comentarii

Dacă ai nevoie de compararea datelor, trebuie să salvezi datele în mai multe metadate. Te rugăm să consulți Codex pentru utilizarea funcției add_post_meta.

1fixdotio 1fixdotio
1 feb. 2014 10:49:17

Bine, deja fac asta. Câmpul personalizat income_dates stochează datele veniturilor recurente și am crezut că ar fi mai bine într-un array, altfel baza de date s-ar putea umple destul de repede.

user537137 user537137
1 feb. 2014 11:03:25
Toate răspunsurile la întrebare 2
0

Am avut nevoie să obțin postările de tip eveniment cu câmpul personalizat "dată" mai târziu decât ziua de astăzi, acest exemplu de cod a funcționat perfect pentru mine, sper să ajute pe cineva într-o situație similară.

            $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 iun. 2015 16:53:50
4

Sugerez să nu stocați valorile meta ca array deoarece (cred) nu este ceea ce aveți nevoie. Cred că de fapt aveți nevoie să stocați fiecare valoare meta individual cu propriul său pereche cheie/valoare și nu o singură cheie cu valori serializate. Când faceți astfel, puteți folosi comparația BETWEEN:

$today = date("Y-m-d");
//Comparația 'BETWEEN' cu 'type' date funcționează doar cu date în format YYYYMMDD.
//Vezi 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 feb. 2014 13:13:14
Comentarii

Mulțumesc pentru răspuns și da, asta ar funcționa, dar aș prefera să păstrez datele într-o singură intrare, așa că am extras toate postările și folosesc o instrucțiune if pentru a obține rezultatele dorite

user537137 user537137
2 feb. 2014 09:12:36

@user537137 poți să dai un exemplu din codul tău?

Andrew Welch Andrew Welch
8 feb. 2017 12:03:57

@AndrewWelch asta a fost acum 3 ani. Mulțumesc pentru interes, dar nici nu mai îmi amintesc pentru ce era asta

user537137 user537137
9 feb. 2017 12:28:17

Am reușit să înțeleg acum, dar documentația pentru interogările meta care implică date este puțin fragmentată, pentru a spune cel puțin.

Andrew Welch Andrew Welch
9 feb. 2017 13:49:59