Was ist der richtige Weg, um Daten in einem WP zu vergleichen? query_posts meta_query
4 Antworten
- Stimmen
-
- 2011-03-07
Am Ende habeich Folgendesgetan. Ich richteein Ereignis-Momth-Feldein und vergleiche von dort aus. Dankefü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 ?>
I wound up going with the following. I setup a event-momth field and comparing from there. thanks for the help
<?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 ?>
-
- 2011-03-17
Ich habegenau an dergleichen Sachegearbeitet und dieser Beitrag war sehr hilfreich. Ich habebenutzerdefinierte Felder verwendet und hierist der Code,mit demicheine Liste aller Ereignisseerstellt habe,die größer als das aktuelle Datum sind. Beachten Sie die zusätzlichentaxonomiebasierten 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', ) ) ) ); ?>
I wound up working on the exact same thing and this post was very helpful. I used Custom Fields and here is the code that I used to create a list of all events greater than the current date. Note the extra taxonomy based filters.
<?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', ) ) ) ); ?>
-
warumnicht `'type'=> 'DATE'`?why not `'type' => 'DATE'` ?
- 5
- 2015-02-23
- Francisco Corrales Morales
-
Ich kann die Zweifel von @FranciscoCorralesMoralesbestätigen: Siemüssen den Typ 'DATE' angeben,insbesondere weil Datumsmetafeldernicht als Zahl,sondernin Form von "Y-m-d"gespeichert werden (bitte Bindestrichebeachten).Ich habe Jonathans Antwortbearbeitet.I can confirm the doubts of @FranciscoCorralesMorales: you have to specify 'DATE' type, especially because date meta fields aren't saved as number but in the form of "Y-m-d" (please note hyphens). I've edited Jonathan's answer.
- 0
- 2017-02-17
- Marco Panichi
-
Für die Internationalisierungmöchten Siemöglicherweise die WordPress-Funktion "date_i18n ()" anstelle desphp-nativen "date ()" verwenden.For internationalization, you might want to use the WordPress function `date_i18n()`, instead of the php native `date()`.
- 0
- 2017-09-01
- Jake
-
- 2011-03-04
Es hängt weitgehend davon ab,wie Ihr Datum überhauptim Metawertgespeichert wird. Im Allgemeinenisteseine gute Idee,Datumsangabenin MySQL als MySQL-Datums-/Zeitstempel zu speichern.
MySQL-Zeitstempel haben das Format
Y-m-d h:i:s
.Esistjedochimmereine gute Idee,die Datums-Mangling-Funktionen von WP zu verwenden. Um das aktuelle Datumim MySQL-Format abzurufen,verwenden Sie
current_time('mysql')
.Umein MySQL-Datumfür die Anzeige zuformatieren,verwenden Sie
mysql2date($format, $mysql_date)
. In diesem Fallistes ambesten,dasin den Einstellungen konfigurierte Datum anzuzeigen. Verwenden Sie daher$format = get_option('date_format');
.Umein vom Benutzer ausgewähltes Datum zu speichern,müssen Sieesin ein MySQL-Datum umcodieren. Dereinfachste - abernicht sicherste - Wegist das
date('Y-m-d h:i:s', $unix_timestamp);
.$unix_timestamp
kann häufig überstrtotime($user_input)
abgeleitet werden.strtotime()
führtjedoch keineeigenen Überprüfungen der Integrität durch. Schreiben Sie daher ambesten Ihreeigene Konvertierungsfunktion.Zum Abrufen des Monatsbereichs verwendeichfolgende Funktion,um die Monatsgrenzenfürjeden 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 abrufenmöchten,verfügt WPbereits übereine Funktion dafür:
get_weekstartend($time);
,die die Grenzen auch als Array liefert.Sie können diese dannin Ihrem Argument
meta_query
verwenden,indem Sie zwei separate Vergleiche durchführen.It largely depends on how your date is stored in the meta value in the first place. In general, it is a good idea to store dates in MySQL as MySQL dates/timestamps.
MySQL timestamps have the format
Y-m-d h:i:s
.However, it is always a good idea to use WP's own date mangling functions. As such, to get the current date in MySQL format, use
current_time('mysql')
.To format a MySQL date for display, use
mysql2date($format, $mysql_date)
. In this case it is best to display the date as configured in the settings, so use$format = get_option('date_format');
.To store a user-selected date, you'll have to transcode it into a MySQL date. To do so, the easiest - but not safest - way is
date('Y-m-d h:i:s', $unix_timestamp);
.$unix_timestamp
can often be derived viastrtotime($user_input)
.However,
strtotime()
doesn't do sanity checks on it's own, so it's best to write your own converstion function.As for getting the month range, here's a function i'm using to get the month boundaries for any MySQL timestamp:
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 ); }
If you want to get the week boundaries, WP already comes with a function for that:
get_weekstartend($time);
, which also delivers the boundaries as an array.You can then use these in your
meta_query
argument by doing two separate comparisons.-
Meinen Sienicht "MySQL-Zeitstempel haben das Format" Y-m-d G:i: s ""?`G:i: s`ist 24 Stunden,` h:i: s`ist 12 Stunden.Don't you mean "MySQL timestamps have the format `Y-m-d G:i:s`"? `G:i:s` is 24-hour, `h:i:s` is 12-hour.
- 0
- 2018-08-11
- admcfajn
-
- 2013-07-30
Hallo,ichpostemeine Lösung.Woich das Datumim Format
Y-m-d H:i
gespeichert habe (wie 2013-07-31 16:45).- Sortiertnach Ereignisstartdatum.
Ereignis,dasnach Heuteendet,wirdnur von
meta_query
abgefragt.date_default_timezone_set('Asia/Calcutta');
Ich habe die Standardzeitzonefü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();
Hi below I am posting my solution. Where I have stored date in
Y-m-d H:i
format (like 2013-07-31 16:45).- Sorted according to Event start date.
Event which ending after Today will be queried only by
meta_query
.date_default_timezone_set('Asia/Calcutta');
I set default time zone for
date()
function.$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();
Ich habeeinen query_posts-Aufrufin einer WP-Vorlage. Mithilfe des Plugins "Weitere Felder" kannich dem Site-Administrator die Möglichkeitgeben,ein Ereignis (benutzerdefinierten Beitragstyp) zuerstellen und anschließendein formatiertes Datumeinzugeben: JJJJ/MM/TT.
Die Hauptfrageist: Welchen Wert sollich an die Wertoptionim Arraymeta_query übergeben? Ich versuche derzeit,"Datum (" J/m/d h:i A ")" (abzüglich der Anführungszeichen) zu übergeben,danachmeinem Verständnis das aktuelle Datum heutegedruckt wird. Die Uhrzeitistmiregal,daherist diesmöglicherweiseirrelevant. Ich versuche,die Vergleichsoption zu verwenden,umbevorstehende Ereignisse und vergangene Ereignisse an verschiedenen Stellen auf dieser Site anzuzeigen. Aneiner anderen Stellemussich der Wertoptiontatsächlichein Array übergeben,das denersten und letzten Tag des aktuellen Monats druckt und die Ausgabe auf Ereignissein diesem Monatbeschränkt.