it-swarm.com.de

was ist der richtige Weg, um Daten in a zu vergleichen? WP query_posts meta_query

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 derzeit, "Datum (" J/M/T h: i A ")" (ohne 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
                 ?>
31
tjsherrill

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

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 größer als des aktuellen Datums erstellt habe. 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',
                )
            )
        )
    );
?>
41
Jonathan Wold

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 current_time('mysql'), um das aktuelle Datum im MySQL-Format abzurufen.

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. Verwenden Sie daher $format = get_option('date_format');.

Um ein vom Benutzer ausgewähltes Datum zu speichern, müssen Sie es in ein MySQL-Datum umcodieren. Der einfachste - aber nicht sicherste - Weg ist date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestamp kann häufig über strtotime($user_input) abgeleitet werden.

strtotime() führt jedoch keine eigenen Überprüfungen der Integrität durch. Schreiben Sie daher am besten Ihre eigene Konvertierungsfunktion.

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 abrufen möchten, enthält WP bereits eine Funktion dafür: get_weekstartend($time);, die die Grenzen auch als Array liefert.

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

7
wyrfel

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

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

    date_default_timezone_set('Asia/Calcutta');

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

$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();
1
Makarand Mane