Quelle est la bonne façon de comparer les dates dans un WP query_posts meta_query

32

J'ai un appel query_posts dans un modèle WP. Grâce à l’utilisation du plugin More Fields, je peux donner à l’administrateur du site la possibilité de créer un événement (type de message personnalisé), puis de saisir une date au format AAAA / mm / jj.

La question principale est: Quelle valeur dois-je passer à l'option value du tableau meta_query? J'essaie actuellement de passer "date (" J / m / dh: i A ")" (moins les guillemets), car, si j'ai bien compris, la date du jour sera imprimée aujourd'hui. Je me moque de l'heure de la date, ce n'est peut-être pas pertinent. Ulitimatly, j’essaie d’utiliser l’option de comparaison pour préciser les événements à venir, les événements passés à différents endroits sur ce site. À un autre endroit, j'ai besoin de passer à l'option value un tableau qui affiche le premier et le dernier jour du mois en cours, en limitant la sortie aux événements survenant ce mois-ci.

<?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
                 ?>
tjsherrill
la source

Réponses:

44

J'ai fini par travailler sur exactement la même chose et ce poste a été très utile. J'ai utilisé les champs personnalisés et voici le code que j'ai utilisé pour créer une liste de tous les événements supérieurs à la date du jour. Notez les filtres basés sur la taxonomie supplémentaire.

<?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',
                )
            )
        )
    );
?>
Jonathan Wold
la source
5
pourquoi pas 'type' => 'DATE'?
Francisco Corrales Morales
Je peux confirmer les doutes de @FranciscoCorralesMorales: vous devez spécifier le type 'DATE', en particulier parce que les champs de méta de date ne sont pas enregistrés en tant que nombre mais sous la forme "Ymd" (notez les traits d'union). J'ai édité la réponse de Jonathan.
Marco Panichi
Pour l'internationalisation, vous pouvez utiliser la fonction WordPress date_i18n()au lieu du php natif date().
Jake
7

Cela dépend en grande partie de la façon dont votre date est stockée dans la méta-valeur en premier lieu. En général, il est conseillé de stocker les dates dans MySQL sous forme de dates / horodatages MySQL.

Les horodatages MySQL ont le format Y-m-d h:i:s.

Cependant, il est toujours bon d'utiliser les fonctions de gestion des dates de WP. En tant que tel, pour obtenir la date actuelle au format MySQL, utilisez current_time('mysql').

Pour formater une date MySQL en vue de son affichage, utilisez mysql2date($format, $mysql_date). Dans ce cas, il est préférable d'afficher la date telle que configurée dans les paramètres, utilisez donc $format = get_option('date_format');.

Pour stocker une date sélectionnée par l'utilisateur, vous devez la convertir en une date MySQL. Pour ce faire, le moyen le plus simple - mais pas le plus sûr - est de le faire date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestamppeut souvent être dérivé via strtotime($user_input).

Cependant, strtotime()ne vérifiant pas l'intégrité physique, il est préférable d'écrire votre propre fonction de conversation.

Pour obtenir la plage de mois, voici une fonction que j'utilise pour obtenir les limites de mois pour tout 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 voulez obtenir les limites de semaine, WP est déjà doté d'une fonction:, qui get_weekstartend($time);fournit également les limites sous forme de tableau.

Vous pouvez ensuite les utiliser dans votre meta_queryargument en faisant deux comparaisons distinctes.

wyrfel
la source
Ne voulez-vous pas dire "les horodatages MySQL ont le format Y-m-d G:i:s"? G:i:sest 24 heures, h:i:sest 12 heures.
admcfajn
3

Je me suis retrouvé avec ce qui suit. J'ai configuré un champ événementiel et comparé à partir de là. Merci pour 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 ?>
tjsherrill
la source
1

Salut ci-dessous, je poste ma solution. Où j'ai mis la date au Y-m-d H:iformat (par exemple 2013-07-31 16:45).

  • Trié en fonction de la date de début de l'événement.
  • L'événement qui se termine après aujourd'hui ne sera interrogé que par meta_query.

    date_default_timezone_set('Asia/Calcutta');

Je règle le fuseau horaire par défaut pour la date()fonction.

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