在WP query_posts meta_query中比较日期的正确方法是什么


32

我在WP模板中有一个query_posts调用。通过使用“更多字段”插件,我可以使站点管理员能够创建事件(自定义帖子类型),然后输入格式为YYYY / mm / dd的日期。

主要问题是;我应该将什么值传递给meta_query数组中的value选项?我目前正在尝试传递“ date(“ Y / m / dh:i A”)”(减去引号),因为据我所知,它将在今天打印当前日期。我不在乎日期的时间,所以可能无关紧要。最终,我正在尝试使用compare选项来确定显示即将发生的事件,该站点上不同位置的过去事件。在另一个地方,我实际上需要将值选项传递给一个数组,该数组将打印当前月份的第一天和最后一天,从而将输出限制为该月发生的事件。

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

Answers:


44

我结束了完全相同的工作,这篇文章非常有帮助。我使用了“自定义字段”,这是我用来创建大于当前日期的所有事件的列表的代码。注意额外的基于分类法的过滤器。

<?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',
                )
            )
        )
    );
?>

5
为什么不'type' => 'DATE'呢?
弗朗西斯科·科拉莱斯·莫拉莱斯2015年

我可以肯定@FranciscoCorralesMorales的疑问:您必须指定'DATE'类型,尤其是因为日期元字段不是保存为数字而是以“ Ymd”的形式保存(请注意连字符)。我已经编辑了乔纳森的答案。
Marco Panichi '17

为了实现国际化,您可能需要使用WordPress函数date_i18n()而不是php native date()
杰克

7

首先,这很大程度上取决于您的日期如何存储在元值中。通常,将日期存储在MySQL中作为MySQL日期/时间戳是一个好主意。

MySQL时间戳具有格式Y-m-d h:i:s

但是,使用WP自己的日期处理功能总是一个好主意。因此,要获取MySQL格式的当前日期,请使用current_time('mysql')

要格式化MySQL日期以显示,请使用mysql2date($format, $mysql_date)。在这种情况下,最好显示设置中配置的日期,因此请使用$format = get_option('date_format');

要存储用户选择的日期,您必须将其转码为MySQL日期。这样做是最简单但不是最安全的方法date('Y-m-d h:i:s', $unix_timestamp);$unix_timestamp通常可以通过导出strtotime($user_input)

但是,strtotime()不要自己进行完整性检查,因此最好编写自己的对话函数。

至于获取月份范围,这是我用来获取任何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 );
}

如果要获取周边界,则WP已经提供了该函数:get_weekstartend($time);,该函数还以数组形式提供边界。

然后,您可以meta_query通过做两个单独的比较在自己的参数中使用它们。


您不是说“ MySQL时间戳具有格式Y-m-d G:i:s”吗?G:i:s是24小时,h:i:s是12小时。
admcfajn

3

我总结了以下内容。我设置了一个事件移动字段并从那里进行比较。谢谢您的帮助

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

1

您好,以下是我发布的解决方案。我将日期存储为Y-m-d H:i格式的地方(例如2013-07-31 16:45)。

  • 根据事件开始日期排序。
  • 只有在今天之后结束的事件才会被查询meta_query

    date_default_timezone_set('Asia/Calcutta');

我为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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.