¿Cuál es la forma correcta de comparar fechas en un WP query_posts meta_query

32

Tengo una consulta query_posts en una plantilla WP. Mediante el uso del complemento Más campos, puedo darle al administrador del sitio la capacidad de crear un evento (tipo de publicación personalizada) y luego ingresar una fecha con formato: AAAA / mm / dd.

La pregunta principal es; ¿Qué valor debo pasar a la opción de valor en la matriz meta_query? Actualmente estoy tratando de pasar "fecha (" A / m / dh: i A ")" (menos las comillas), porque, según tengo entendido, eso imprimirá la fecha actual hoy. No me importa la fecha, así que puede ser irrelevante. Por cierto, estoy tratando de usar la opción de comparación para mostrar los próximos eventos, eventos pasados ​​en diferentes lugares de este sitio. En otro lugar, realmente necesito pasar la opción de valor a una matriz que imprime ese primer y último día del mes actual, limitando la salida a los eventos que suceden este mes.

<?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
fuente

Respuestas:

44

Terminé trabajando exactamente en lo mismo y esta publicación fue muy útil. Usé campos personalizados y aquí está el código que usé para crear una lista de todos los eventos mayores que la fecha actual. Tenga en cuenta los filtros adicionales basados ​​en taxonomía.

<?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
fuente
55
¿por qué no 'type' => 'DATE'?
Francisco Corrales Morales
Puedo confirmar las dudas de @FranciscoCorralesMorales: debe especificar el tipo 'FECHA', especialmente porque los metacampos de fecha no se guardan como número, sino en forma de "Ymd" (tenga en cuenta los guiones). He editado la respuesta de Jonathan.
Marco Panichi
Para la internacionalización, es posible que desee utilizar la función de WordPress date_i18n(), en lugar del nativo de php date().
Jake
7

En primer lugar, depende en gran medida de cómo se almacene su fecha en el metavalor. En general, es una buena idea almacenar fechas en MySQL como fechas / marcas de tiempo MySQL.

Las marcas de tiempo de MySQL tienen el formato Y-m-d h:i:s.

Sin embargo, siempre es una buena idea usar las propias funciones de cambio de fecha de WP. Como tal, para obtener la fecha actual en formato MySQL, use current_time('mysql').

Para formatear una fecha MySQL para su visualización, use mysql2date($format, $mysql_date). En este caso, es mejor mostrar la fecha como está configurada en la configuración, así que úsela $format = get_option('date_format');.

Para almacenar una fecha seleccionada por el usuario, deberá transcodificarla en una fecha MySQL. Para hacerlo, la forma más fácil, pero no la más segura, es date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampa menudo se puede derivar a través de strtotime($user_input).

Sin embargo, strtotime()no realiza controles de cordura por sí mismo, por lo que es mejor escribir su propia función de conversación.

En cuanto a obtener el rango de mes, aquí hay una función que estoy usando para obtener los límites de mes para cualquier marca de tiempo de 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 desea obtener los límites de la semana, WP ya viene con una función para eso: get_weekstartend($time);que también ofrece los límites como una matriz.

Luego puede usarlos en su meta_queryargumento haciendo dos comparaciones separadas.

wyrfel
fuente
¿No quiere decir "las marcas de tiempo de MySQL tienen el formato Y-m-d G:i:s"? G:i:ses de 24 horas, h:i:ses de 12 horas.
admcfajn
3

Terminé yendo con lo siguiente. Configuré un campo de evento-math y comparé a partir de ahí. gracias por la ayuda

<?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
fuente
1

Hola a continuación, estoy publicando mi solución. Donde he almacenado la fecha en Y-m-d H:iformato (como 2013-07-31 16:45).

  • Ordenado según la fecha de inicio del evento.
  • El evento que finaliza después de Hoy solo será consultado por meta_query.

    date_default_timezone_set('Asia/Calcutta');

Configuré la zona horaria predeterminada para la date()función.

$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
fuente