比较WP查询_POSTS元_查询中的日期的正确方法是什么

时间:2011-03-04 作者:tjsherrill

我在WP模板中有一个query\\u posts调用。通过使用More Fields插件,我可以让站点管理员创建一个事件(自定义帖子类型),然后输入格式为YYYY/mm/dd的日期。

主要问题是;我应该向meta\\u查询数组中的value选项传递什么值?我目前正试图通过“日期(“Y/m/d h:I A”)”(减去引号),因为据我所知,这将在今天打印当前日期。我不在乎约会的时间,所以这可能无关紧要。Ulitimatly我正在尝试使用compare选项来确定即将发生的事件,以及在这个网站上不同地方过去发生的事件。在另一个地方,我实际上需要向value选项传递一个数组,该数组打印当前月份的第一天和最后一天,将输出限制为本月发生的事件。

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

4 个回复
最合适的回答,由SO网友:tjsherrill 整理而成

我最终选择了以下几点。我设置了一个event momth字段,并从中进行比较。谢谢你的帮助

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

SO网友:Jonathan Wold

我最终还是做了同样的事情,这篇文章很有帮助。我使用自定义字段,下面是我用来创建大于当前日期的所有事件列表的代码。请注意额外的基于分类的过滤器。

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

SO网友:wyrfel

这在很大程度上取决于你的日期首先是如何存储在元值中的。通常,将日期存储在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 通过两次单独的比较进行论证。

SO网友:Makarand Mane

您好,我正在发布我的解决方案。存储日期的位置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();

结束

相关推荐