Was ist der richtige Weg, um Daten in einer Meta-Abfrage von WP query_posts zu vergleichen?


32

Ich habe einen query_posts-Aufruf in einer WP-Vorlage. Mit dem Plugin "Weitere Felder" kann ich dem Site-Administrator die Möglichkeit geben, ein Ereignis (benutzerdefinierten Beitragstyp) zu erstellen und anschließend ein Datum einzugeben, das formatiert ist: JJJJ / mm / tt.

Die Hauptfrage ist: Welchen Wert soll ich an die Option value im Array meta_query übergeben? Ich versuche gerade, "date (" Y / m / dh: i A ")" (abzüglich der Anführungszeichen) zu übergeben, da das aktuelle Datum nach meinem Verständnis heute gedruckt wird. Die Uhrzeit ist mir egal, so dass dies irrelevant sein kann. Letztendlich versuche ich, die Vergleichsoption zu verwenden, um bevorstehende Ereignisse und vergangene Ereignisse an verschiedenen Orten auf dieser Site anzuzeigen. An einer anderen Stelle muss ich der Option value ein Array übergeben, das den ersten und den letzten Tag des aktuellen Monats ausgibt und die Ausgabe auf Ereignisse beschränkt, die in diesem Monat stattfinden.

<?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
                 ?>

Antworten:


44

Ich habe genau das Gleiche gemacht und dieser Beitrag war sehr hilfreich. Ich habe benutzerdefinierte Felder verwendet und hier ist der Code, mit dem ich eine Liste aller Ereignisse erstellt habe, die größer als das aktuelle Datum sind. Beachten Sie die zusätzlichen taxonomiebasierten Filter.

<?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
warum nicht 'type' => 'DATE'?
Francisco Corrales Morales

Ich kann die Zweifel von @FranciscoCorralesMorales bestätigen: Sie müssen den Typ 'DATE' angeben, insbesondere, weil Datums-Metafelder nicht als Zahl, sondern in Form von "Ymd" gespeichert werden (Bindestriche beachten). Ich habe Jonathans Antwort bearbeitet.
Marco Panichi

Für die Internationalisierung möchten Sie möglicherweise die WordPress-Funktion date_i18n()anstelle des nativen PHP verwenden date().
Jake

7

Dies hängt hauptsächlich davon ab, wie Ihr Datum zuerst im Meta-Wert gespeichert wird. Im Allgemeinen ist es eine gute Idee, Daten in MySQL als MySQL-Datums- / Zeitstempel zu speichern.

MySQL-Zeitstempel haben das Format Y-m-d h:i:s.

Es ist jedoch immer eine gute Idee, die WP-eigenen Date Mangling-Funktionen zu verwenden. Verwenden Sie daher, um das aktuelle Datum im MySQL-Format abzurufen current_time('mysql').

Verwenden Sie zum Formatieren eines MySQL-Datums für die Anzeige mysql2date($format, $mysql_date). In diesem Fall ist es am besten, das Datum so anzuzeigen, wie es in den Einstellungen konfiguriert wurde $format = get_option('date_format');.

Um ein vom Benutzer ausgewähltes Datum zu speichern, müssen Sie es in ein MySQL-Datum umcodieren. Dies ist am einfachsten, aber nicht am sichersten date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampkann oft über abgeleitet werdenstrtotime($user_input) .

Allerdings strtotime()macht keine Plausibilitätsprüfungen auf es selbst ist, so ist es am besten Ihre eigene converstion Funktion zu schreiben.

Zum Abrufen des Monatsbereichs verwende ich die folgende Funktion, um die Monatsgrenzen für jeden MySQL-Zeitstempel abzurufen:

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 );
}

Wenn Sie die Wochengrenzen erhalten möchten, enthält WP bereits eine Funktion für get_weekstartend($time);das:, die die Grenzen auch als Array liefert.

Sie können diese dann in Ihrem meta_queryArgument verwenden, indem Sie zwei separate Vergleiche durchführen.


Meinen Sie nicht "MySQL-Zeitstempel haben das Format Y-m-d G:i:s"? G:i:sist 24 Stunden, h:i:sist 12 Stunden.
Admcfajn

3

Ich bin mit folgendem Schluss gekommen. Ich richte ein Event-Momth-Feld ein und vergleiche von dort aus. Danke für die Hilfe

<?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

Hallo, unten poste ich meine Lösung. Wo ich Datum im Y-m-d H:iFormat gespeichert habe (wie 2013-07-31 16:45).

  • Sortiert nach dem Startdatum des Events.
  • Ereignisse, die nach Heute enden, werden nur von abgefragt meta_query.

    date_default_timezone_set('Asia/Calcutta');

Ich habe die Standardzeitzone für die date()Funktion eingestellt.

$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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.