Care este modalitatea corectă de a compara date în WP query_posts meta_query

4 mar. 2011, 20:41:33
Vizualizări: 86.9K
Voturi: 40

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
                 ?>
0
Toate răspunsurile la întrebare 4
4
55

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',
                )
            )
        )
    );
?>
17 mar. 2011 18:28:29
Comentarii

de ce nu 'type' => 'DATE' ?

Francisco Corrales Morales Francisco Corrales Morales
24 feb. 2015 01:18:45

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.

Marco Panichi Marco Panichi
17 feb. 2017 15:39:06

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

Jake Jake
2 sept. 2017 01:02:41

Cred că ar fi util să specificați formatul în care stocați datele evenimentelor în Câmpul Personalizat, deoarece compararea formatelor de date pare a fi elementul cheie în configurarea unei interogări meta funcționale.

David Gaskin David Gaskin
17 feb. 2023 04:11:35
2

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.

4 mar. 2011 21:38:55
Comentarii

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.

admcfajn admcfajn
11 aug. 2018 04:27:24

G este format de 24 de ore fără zero în față. H este format de 24 de ore cu zero în față. Deci corect este Y-m-d H:i:s

Sisir Sisir
30 nov. 2024 22:53:05
0

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 ?>
8 mar. 2011 01:08:09
0

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();
30 iul. 2013 13:37:43