Care este modalitatea corectă de a compara date în WP query_posts meta_query
Am un apel query_posts într-un șablon WordPress. Prin utilizarea plugin-ului More Fields, pot oferi administratorului site-ului posibilitatea de a crea un eveniment (tip de postare personalizat) și apoi de a introduce o dată care este formatată: YYYY/mm/dd.
Întrebarea principală este: ce valoare ar trebui să transmit opțiunii value în array-ul meta_query? În prezent, încerc să transmit "date("Y/m/d h:i A")" (fără ghilimele), deoarece, după cum înțeleg, acesta va afișa data curentă de astăzi. Nu mă interesează ora din dată, așa că acest aspect poate fi irelevant. În cele din urmă, încerc să folosesc opțiunea compare pentru a afișa cu precizie evenimentele viitoare și evenimentele trecute în diferite locuri pe acest site. În alt loc, am nevoie să transmit opțiunii value un array care afișează prima și ultima zi a lunii curente, limitând rezultatele la evenimentele care au loc în această lună.
<?php
query_posts( array(
'post_type' => 'event', // interogare doar pentru evenimente
'meta_key' => 'event_date', // încarcă meta event_date
'orderby' => 'meta_value', // sortează după event_date
'order' => 'asc', // crescător, astfel evenimentele mai vechi sunt primele
'posts_per_page' => '2',
'meta_query' => array( // restricționează postările bazate pe valorile meta
'key' => 'event_date', // care meta să fie interogat
'value' => date("Y/m/d h:i A"), // valoarea pentru comparație
'compare' => '>=', // metoda de comparare
'type' => 'DATE' // tipul de date, nu vrem să comparăm valorile string
) // sfârșitul array-ului meta_query
) // sfârșitul array-ului
); // închide apelul query_posts
?>
Am ajuns să lucrez la exact același lucru și acest articol a fost foarte util. Am folosit Câmpuri Personalizate și iată codul pe care l-am folosit pentru a crea o listă cu toate evenimentele mai mari decât data curentă. Observați filtrele suplimentare bazate pe taxonomie.
<?php // Să obținem datele de care avem nevoie pentru bucla de mai jos
$events = new WP_Query(
array(
'post_type' => 'event', // Spune WordPress-ului ce tip de postare dorim
'orderby' => 'meta_value', // Vrem să organizăm evenimentele după dată
'meta_key' => 'event-start-date', // Preluăm câmpul "dată de început" creat prin pluginul "More Fields" (stocat în format YYYY-MM-DD)
'order' => 'ASC', // ASC este cealaltă opțiune
'posts_per_page' => '-1', // Să le afișăm pe toate.
'meta_query' => array( // WordPress are toate rezultatele, acum, returnează doar evenimentele de după data de astăzi
array(
'key' => 'event-start-date', // Verifică câmpul dată de început
'value' => date("Y-m-d"), // Setează data de astăzi (observați formatul similar)
'compare' => '>=', // Returnează cele mai mari sau egale cu data de astăzi
'type' => 'DATE' // Spune WordPress-ului că lucrăm cu date
)
),
'tax_query' => array( // Returnează doar concerte (tipuri de evenimente) și evenimente unde cântă "songs-of-ascent"
array(
'taxonomy' => 'event-types',
'field' => 'slug',
'terms' => 'concert',
),
array(
'taxonomy' => 'speakers',
'field' => 'slug',
'terms' => 'songs-of-ascent',
)
)
)
);
?>

Pot confirma îndoielile lui @FranciscoCorralesMorales: trebuie să specificați tipul 'DATE', mai ales pentru că câmpurile meta de tip dată nu sunt salvate ca numere ci în formatul "Y-m-d" (rețineți liniuțele). Am editat răspunsul lui Jonathan.

Pentru internaționalizare, poate doriți să folosiți funcția WordPress date_i18n()
, în loc de funcția nativă PHP date()
.

Depinde în mare măsură de cum este stocată data în valoarea meta inițială. În general, este o idee bună să stocați datele în MySQL ca date/timestamp-uri MySQL.
Timestamp-urile MySQL au formatul Y-m-d h:i:s
.
Cu toate acestea, este întotdeauna o idee bună să folosiți funcțiile de manipulare a datelor din WP. Astfel, pentru a obține data curentă în format MySQL, folosiți current_time('mysql')
.
Pentru a formata o dată MySQL pentru afișare, folosiți mysql2date($format, $mysql_date)
.
În acest caz, cel mai bine este să afișați data așa cum este configurată în setări, deci folosiți $format = get_option('date_format');
.
Pentru a stoca o dată selectată de utilizator, va trebui să o transcodați într-o dată MySQL. Pentru a face acest lucru, cea mai ușoară - dar nu cea mai sigură - metodă este date('Y-m-d h:i:s', $unix_timestamp);
. $unix_timestamp
poate fi adesea obținut prin strtotime($user_input)
.
Cu toate acestea, strtotime()
nu efectuează verificări de validitate singur, așa că cel mai bine este să scrieți propria funcție de conversie.
În ceea ce privește obținerea intervalului lunar, iată o funcție pe care o folosesc pentru a obține limitele lunii pentru orice timestamp MySQL:
function get_monthrange($time) {
$ym = date("Y-m", strtotime($time));
$start = $ym."-01";
$ym = explode("-", $ym);
if ($ym[1] == 12) {
$ym[0]++; $ym[1] = 1;
} else {
$ym[1]++;
}
$d = mktime( 0, 0, 0, $ym[1], 1, $ym[0] );
$d -= 86400;
$end = date("Y-m-d", $d);
return array( $start, $end );
}
Dacă doriți să obțineți limitele săptămânii, WP vine deja cu o funcție pentru asta: get_weekstartend($time);
, care returnează și ea limitele ca un array.
Puteți folosi acestea în argumentul meta_query
făcând două comparații separate.

Nu voiai să spui "MySQL folosește timestamp-uri în formatul Y-m-d G:i:s
"? G:i:s
este format de 24 de ore, h:i:s
este format de 12 ore.

Am ales să folosesc următoarea soluție. Am configurat un câmp event-month și fac comparația de acolo. Mulțumesc pentru ajutor.
<?php
$event_query = new WP_Query(
array(
'post_type' => 'event', // interoghează doar evenimente
'meta_key' => 'event-month', // încarcă meta event_date
'order_by' => 'event_date',
'order' => 'asc', // crescător, deci evenimentele mai vechi primele
'meta_query' => array(
array( // restrânge postările pe baza valorilor meta
'key' => 'event-month', // care meta să fie interogată
'value' => date("n"), // valoare pentru comparație
'compare' => '=', // metoda de comparație
'type' => 'NUMERIC' // tip de date, nu vrem să comparăm valorile ca string
) // meta_query este un array de elemente de interogare
) // sfârșitul array-ului meta_query
) // sfârșitul array-ului
); // închiderea apelului constructorului WP_Query
?>
<?php while($event_query->have_posts()): $event_query->the_post(); //buclă pentru evenimente ?>

Mai jos vă prezint soluția mea. Am stocat data în format Y-m-d H:i
(de exemplu 2013-07-31 16:45).
- Sortate în funcție de data de început a evenimentului.
Evenimentele care se termină după data de astăzi vor fi interogate doar prin
meta_query
.date_default_timezone_set('Asia/Calcutta');
Am setat fusul orar implicit pentru funcția date()
.
$args = array(
'posts_per_page' => 3,
'orderby' => 'meta_value',
'meta_key' => 'event_start_date_time',
'order' => 'ASC',
'post_type' => 'events',
'meta_query' => array(
array(
'key' => 'event_end_date_time',
'value' => date("Y-m-d H:i"),
'compare' => '>=',
'type' => 'DATE'
)
)
);
query_posts( $args );
if( have_posts() ) : while ( have_posts() ) : the_post();
