quelle est la bonne façon de comparer les dates dans une meta_query WP query_posts
4 réponses
- votes
-
- 2011-03-07
J'aifini parfaire ce qui suit. J'ai configuré un champ événement-momthet comparé àpartir de là.mercipour l'aide
<?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
J'aifini partravaillerexactement sur lamême choseet cepost a ététrès utile. J'ai utilisé des champspersonnaliséset voici le code quej'ai utilisépour créer une liste detous les événements supérieurs à la date actuelle. Notez lesfiltres supplémentairesbasés sur lataxonomie.
<?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', ) ) ) ); ?>
-
pourquoipas `'type'=> 'DATE'`?why not `'type' => 'DATE'` ?
- 5
- 2015-02-23
- Francisco Corrales Morales
-
Jepeux confirmer les doutes de @FranciscoCorralesMorales: vous devez spécifier letype 'DATE',surtoutparce que lesméta-champs de datene sontpasenregistrés sousforme denombremais sous laforme de "Y-m-d" (veuilleznoter lestirets).J'ai édité la réponse de Jonathan.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
-
Pour l'internationalisation,vous voudrezpeut-être utiliser lafonction WordPress `date_i18n ()`,au lieu dephpnative `date ()`.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
Cela dépenden grandepartie de lafaçon dont votre dateest stockée dans laméta valeuren premier lieu. Engénéral,c'est unebonneidée de stocker les dates dans MySQL sousforme de dates/horodatages MySQL.
Les horodatages MySQL ont leformat
Y-m-d h:i:s
.Cependant,c'esttoujours unebonneidée d'utiliser lespropresfonctions demodification de date de WP. Entant quetel,pour obtenir la date actuelle auformat MySQL,utilisez
current_time('mysql')
.Pourformater une date MySQL à afficher,utilisez
mysql2date($format, $mysql_date)
. Dans ce cas,ilestpréférable d'afficher la datetelle que configurée dans lesparamètres,utilisez donc$format = get_option('date_format');
.Pour stocker une date sélectionnéepar l'utilisateur,vous devrez latranscoderen une date MySQL. Pour cefaire,lemoyen leplus simple -maispas leplus sûr -est
date('Y-m-d h:i:s', $unix_timestamp);
.$unix_timestamp
peut souvent être dérivé viastrtotime($user_input)
.Cependant,
strtotime()
ne faitpas de vérification de cohérencepar lui-même,ilest doncpréférable d'écrire votreproprefonction de conversion.En ce qui concerne l'obtention de laplage demois,voici unefonction quej'utilisepour obtenir les limites demoispourn'importe quel horodatage 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 ); }
Si vous souhaitez obtenir les limites de la semaine,WPest déjàfourni avec unefonctionpour cela:
get_weekstartend($time);
,quifournit également les limites sousforme detableau.Vouspouvezensuite les utiliser dans votre argument
meta_query
en effectuant deux comparaisons distinctes.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.-
Vousne voulezpas dire "Les horodatages MySQL ont leformat` Y-m-d G:i: s` "?«G:i: s» correspond à 24 heures,«h:i: s» correspond à 12 heures.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
Bonjour ci-dessous,je publiema solution.Oùj'ai stocké la date auformat
Y-m-d H:i
(comme 2013-07-31 16:45).- Triéen fonction de la date de début de l'événement.
-
L'événement qui setermine après Aujourd'hui serainterrogé uniquementpar
meta_query
.date_default_timezone_set('Asia/Calcutta');
J'ai défini lefuseau horairepar défautpour lafonction
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();
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();
J'ai un appel query_posts dans unmodèle WP. Grâce à l'utilisation duplug-in More Fields,je peux donner à l'administrateur du site lapossibilité de créer un événement (type depublicationpersonnalisé),puis de saisir une date auformat: AAAA/mm/jj.
La questionprincipaleest; quelle valeur dois-jepasser à l'option value dans letableaumeta_query? J'essaye actuellement depasser "date (" Y/m/j h:i A ")" (moins lesguillemets),parce que,sije comprendsbien,celaimprimera la date actuelle aujourd'hui. Jene me souciepas de l'heure de la date,donc celapeutne pas êtrepertinent. Enfin de compte,j'essaie d'utiliser l'option de comparaisonpour déterminer les événements à venir,les événementspassés à différentsendroits sur ce site. Dans un autreendroit,je doisen faitpasser l'option de valeur untableau quiimprime lepremieret le dernierjour dumoisen cours,limitant la sortie aux événements qui seproduisent cemois-ci.