¿cuál es la forma correcta de comparar fechas en una consulta de consulta de WP meta_query

31

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

La pregunta principal es; ¿Qué valor debo pasar a la opción de valor en la matriz meta_query? Actualmente estoy intentando pasar "fecha (" Y / m / d h: i A ")" (menos las comillas), porque, según tengo entendido, eso imprimirá la fecha actual hoy. No me importa la fecha de la fecha, por lo que puede ser irrelevante. Ulitimatly, estoy tratando de usar la opción de comparación para indicar eventos próximos, eventos pasados en diferentes lugares de este sitio. En otro punto, en realidad necesito pasar la opción de valor a una matriz que imprime el 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
                 ?>
    
pregunta tjsherrill 04.03.2011 - 19:41

4 respuestas

3

Terminé yendo con lo siguiente. Configuré un campo de eventos y los comparé desde allí. 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 ?>
    
respondido por el tjsherrill 08.03.2011 - 00:08
38

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 a 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',
                )
            )
        )
    );
?>
    
respondido por el Jonathan Wold 17.03.2011 - 17:28
7

Depende en gran medida de cómo se almacene su fecha en el valor meta en primer lugar. En general, es una buena idea almacenar fechas en MySQL como fechas / marcas de tiempo de 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 gestión de fechas de WP. Como tal, para obtener la fecha actual en formato MySQL, use current_time('mysql') .

Para formatear una fecha de 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 use $format = get_option('date_format'); .

Para almacenar una fecha seleccionada por el usuario, tendrá que transcodificarla en una fecha de 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); . A menudo, $unix_timestamp se puede derivar a través de strtotime($user_input) .

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

En cuanto a obtener el rango del mes, aquí hay una función que estoy usando para obtener los límites del 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 entrega los límites como una matriz.

Luego puedes usar estos en tu argumento meta_query haciendo dos comparaciones separadas.

    
respondido por el wyrfel 04.03.2011 - 20:38
1

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

  • Ordenado según la fecha de inicio del evento.
  • El evento que finaliza después de hoy se consultará solo por meta_query .

    date_default_timezone_set('Asia/Calcutta');

Configuro la zona horaria predeterminada para la función 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();
    
respondido por el Makarand Mane 30.07.2013 - 12:37

Lea otras preguntas en las etiquetas