qual è il modo corretto di confrontare le date in una meta_query WP query_posts


32

Ho una chiamata query_posts in un modello WP. Tramite l'utilizzo del plug-in More Fields posso dare all'amministratore del sito la possibilità di creare un evento (tipo di post personalizzato) e quindi inserire una data che è formattata: AAAA / mm / gg.

La domanda principale è; quale valore devo passare all'opzione value nell'array meta_query? Attualmente sto provando a passare "date (" Y / m / dh: i A ")" (meno le virgolette), perché, come ho capito, oggi stamperà la data corrente. Non mi interessa l'ora della data, quindi potrebbe essere irrilevante. Ultimamente sto cercando di usare l'opzione di confronto per inchiodare mostrando i prossimi eventi, eventi passati in diversi luoghi su questo sito. In un altro punto in realtà ho bisogno di passare l'opzione valore un array che stampa il primo e l'ultimo giorno del mese corrente, limitando l'output agli eventi che si verificano questo mese.

<?php 
            query_posts( array( 
              'post_type'  => 'event',        // only query events
              'meta_key'    => 'event_date',  // load up the event_date meta
              'orderby'     => 'meta_value',  // sort by the event_date
              'order'       => 'asc',         // ascending, so earlier events first
              'posts_per_page' => '2',
              'meta_query'  => array(         // restrict posts based on meta values
                  'key'     => 'event_date',  // which meta to query
                  'value'   => date("Y/m/d h:i A"),  // value for comparison
                  'compare' => '>=',          // method of comparison
                  'type'    => 'DATE'         // datatype, we don't want to compare the string values
                ) // end meta_query array
              ) // end array
            ); // close query_posts call
                 ?>

Risposte:


44

Ho finito per lavorare sulla stessa identica cosa e questo post è stato molto utile. Ho usato i campi personalizzati e qui è il codice che ho usato per creare un elenco di tutti gli eventi maggiore della data corrente. Nota i filtri extra basati sulla tassonomia.

<?php // Let's get the data we need to loop through below

$events = new WP_Query( 
    array(
        'post_type' => 'event', // Tell WordPress which post type we want
        'orderby' => 'meta_value', // We want to organize the events by date    
        'meta_key' => 'event-start-date', // Grab the "start date" field created via "More Fields" plugin (stored in YYYY-MM-DD format)
        'order' => 'ASC', // ASC is the other option    
        'posts_per_page' => '-1', // Let's show them all.   
        'meta_query' => array( // WordPress has all the results, now, return only the events after today's date
            array(
                'key' => 'event-start-date', // Check the start date field
                'value' => date("Y-m-d"), // Set today's date (note the similar format)
                'compare' => '>=', // Return the ones greater than today's date
                'type' => 'DATE' // Let WordPress know we're working with date
                )
            ),
        'tax_query' => array( // Return only concerts (event-types) and events where "songs-of-ascent" is performing
            array(
                'taxonomy' => 'event-types',
                'field' => 'slug',
                'terms' => 'concert',
                ),
            array(
                'taxonomy' => 'speakers',
                'field' => 'slug',
                'terms' => 'songs-of-ascent',
                )
            )
        )
    );
?>

5
perchè no 'type' => 'DATE'?
Francisco Corrales Morales,

Posso confermare i dubbi di @FranciscoCorralesMorales: devi specificare il tipo 'DATE', soprattutto perché i metadati della data non vengono salvati come numero ma sotto forma di "Ymd" (nota trattini). Ho modificato la risposta di Jonathan.
Marco Panichi,

Per l'internazionalizzazione, potresti voler utilizzare la funzione WordPress date_i18n(), anziché il nativo php date().
Jake,

7

Dipende in gran parte da come la tua data è memorizzata nel meta valore in primo luogo. In generale, è una buona idea memorizzare le date in MySQL come date / timestamp di MySQL.

I timestamp di MySQL hanno il formato Y-m-d h:i:s.

Tuttavia, è sempre una buona idea utilizzare le funzioni di modifica della data di WP. Pertanto, per ottenere la data corrente in formato MySQL, utilizzare current_time('mysql').

Per formattare una data MySQL per la visualizzazione, utilizzare mysql2date($format, $mysql_date). In questo caso è meglio visualizzare la data come configurata nelle impostazioni, quindi usare $format = get_option('date_format');.

Per memorizzare una data selezionata dall'utente, dovrai transcodificarla in una data MySQL. Per fare ciò, il modo più semplice - ma non più sicuro - è date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestamppuò spesso essere derivato tramite strtotime($user_input).

Tuttavia, strtotime()non esegue i controlli di integrità da solo, quindi è meglio scrivere la propria funzione di conversazione.

Per quanto riguarda l'intervallo di mesi, ecco una funzione che sto usando per ottenere i limiti del mese per qualsiasi 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 );
}

Se vuoi ottenere i limiti della settimana, WP ha già una funzione per questo: get_weekstartend($time);che fornisce anche i limiti come un array.

Puoi quindi usarli nel tuo meta_queryargomento facendo due confronti separati.


Non intendi "I timestamp di MySQL hanno il formato Y-m-d G:i:s"? G:i:sè di 24 ore, h:i:sè di 12 ore.
admcfajn,

3

Ho finito per andare con il seguente. Ho impostato un campo evento-momento e il confronto da lì. grazie per l'aiuto

<?php 
        $event_query = new WP_Query(
        array( 
          'post_type'   => 'event',        // only query events
          'meta_key'    => 'event-month',  // load up the event_date meta
          'order_by'        => 'event_date',
          'order'       => 'asc',         // ascending, so earlier events first
          'meta_query'  => array(
             array(         // restrict posts based on meta values
              'key'     => 'event-month',  // which meta to query
              'value'   => date("n"),  // value for comparison
              'compare' => '=',          // method of comparison
              'type'    => 'NUMERIC'         // datatype, we don't want to compare the string values
            ) // meta_query is an array of query ites
           ) // end meta_query array
          ) // end array
        ); // close WP_Query constructor call

 ?>
   <?php while($event_query->have_posts()): $event_query->the_post(); //loop for events ?>

1

Ciao sotto sto pubblicando la mia soluzione. Dove ho memorizzato la data in Y-m-d H:iformato (come 2013-07-31 16:45).

  • Ordinati in base alla data di inizio dell'evento.
  • L'evento che termina dopo oggi verrà interrogato solo da meta_query.

    date_default_timezone_set('Asia/Calcutta');

Ho impostato il fuso orario predefinito per la date()funzione.

$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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.