web-dev-qa-db-fra.com

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

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/j h: 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
                 ?>
31
tjsherrill

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

J'ai fini par travailler sur la même chose et ce message m'a été très utile. J'ai utilisé des champs personnalisés et voici le code que j'ai utilisé pour créer une liste de tous les événements supérieur à 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',
                )
            )
        )
    );
?>
41
Jonathan Wold

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, c'est une bonne idée de stocker des 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 date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestamp peut souvent être dérivé via strtotime($user_input).

Cependant, strtotime() ne vérifie pas son intégrité, il est donc 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 souhaitez obtenir les limites de la semaine, WP est déjà doté d'une fonction: get_weekstartend($time);, qui fournit également les limites sous forme de tableau.

Vous pouvez ensuite les utiliser dans votre argument meta_query en effectuant deux comparaisons distinctes.

7
wyrfel

Salut ci-dessous, je poste ma solution. Où j'ai stocké la date au format Y-m-d H:i (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');

J'ai défini le fuseau horaire par défaut pour la fonction 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();
1
Makarand Mane