qual é a maneira correta de comparar datas em um WP query_posts meta_query

32

Eu tenho uma chamada query_posts em um modelo WP. Com o uso do plug-in More Fields, posso dar ao administrador do site a capacidade de criar um evento (tipo de postagem personalizado) e inserir uma data formatada: AAAA / mm / dd.

A questão principal é; qual valor devo passar para a opção value na matriz meta_query? Atualmente, estou tentando passar "date (" Y / m / dh: i A ")" (menos as aspas), porque, pelo que entendi, isso imprimirá a data atual hoje. Não ligo para a hora da data, o que pode ser irrelevante. Por fim, estou tentando usar a opção de comparação para mostrar os próximos eventos, eventos passados ​​em diferentes locais deste site. Em outro ponto, na verdade, preciso passar a opção de valor de uma matriz que imprima esse primeiro e último dia do mês atual, limitando a saída aos eventos que acontecem este mês.

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

Respostas:

44

Acabei trabalhando exatamente na mesma coisa e este post foi muito útil. Usei campos personalizados e aqui está o código que usei para criar uma lista de todos os eventos maiores que a data atual. Observe os filtros extras baseados em taxonomia.

<?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
fonte
5
por que não 'type' => 'DATE'?
Francisco Corrales Morales
Posso confirmar as dúvidas do @FranciscoCorralesMorales: você precisa especificar o tipo 'DATE', principalmente porque os meta campos da data não são salvos como número, mas na forma de "Ymd" (observe os hífens). Eu editei a resposta de Jonathan.
Marco Panichi
Para internacionalização, você pode usar a função WordPress date_i18n(), em vez do nativo php date().
Jake1
7

Depende em grande parte de como sua data é armazenada no meta-valor em primeiro lugar. Em geral, é uma boa idéia armazenar datas no MySQL como datas / timestamps do MySQL.

Os carimbos de data e hora do MySQL têm o formato Y-m-d h:i:s.

No entanto, é sempre uma boa ideia usar as próprias funções de manipulação de datas do WP. Como tal, para obter a data atual no formato MySQL, use current_time('mysql').

Para formatar uma data do MySQL para exibição, use mysql2date($format, $mysql_date). Nesse caso, é melhor exibir a data conforme configurada nas configurações, então use $format = get_option('date_format');.

Para armazenar uma data selecionada pelo usuário, você terá que transcodificá-la para uma data do MySQL. Para fazer isso, o caminho mais fácil - mas não mais seguro - é date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampmuitas vezes pode ser derivado via strtotime($user_input).

No entanto, strtotime()não realiza verificações de sanidade por conta própria, por isso é melhor escrever sua própria função de conversão.

Quanto a obter o intervalo do mês, aqui está uma função que estou usando para obter os limites do mês para qualquer registro de data e hora do 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 );
}

Se você deseja obter os limites da semana, o WP já vem com uma função para isso:, get_weekstartend($time);que também entrega os limites como uma matriz.

Você pode usá-los em seu meta_queryargumento fazendo duas comparações separadas.

Wyrfel
fonte
Você não quer dizer "Os carimbos de data e hora do MySQL têm o formato Y-m-d G:i:s"? G:i:sé de 24 horas, h:i:sé de 12 horas.
admcfajn
3

Acabei indo com o seguinte. Eu configurei um campo de evento-dia e comparando a partir daí. Obrigado pela ajuda

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

Oi abaixo Estou postando minha solução. Onde eu armazenei a data no Y-m-d H:iformato (como 31-07-2013 16:45).

  • Classificado de acordo com a data de início do evento.
  • O evento que termina após Hoje será consultado apenas por meta_query.

    date_default_timezone_set('Asia/Calcutta');

Defino o fuso horário padrão para a date()função.

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