在自定义字段中列出按日期排序的即将到来的活动

时间:2013-03-16 作者:adam

我想按即将到来的顺序显示带有日期的事件列表。例如:

2013年3月23日,2013年3月30日,以下是我用于从数据库中筛选帖子的查询:

query_posts( 
    \'post_type=myevents&meta_key=_datepicker&orderby=meta_value&order=ASC&showposts=20\'
);
但这行不通。我按以下顺序列出我的活动:

最后列出了2013年4月7日、2013年4月18日、2013年6月19日、2013年10月20日、2013年3月23日、2013年3月24日发生的事件。一开始也没有秩序。

我使用自定义字段存储事件日期,日期格式为23-Mar-2013, 但我会以格式显示前端日期23 March 2013.

我怎样才能得到正确的订单?

2 个回复
SO网友:s_ha_dum

这是正确的字母数字顺序。如果你的日期像你在问题中发布的那样像人一样存储,那么这就是你得到的最好结果。看来情况就是这样。也就是说,如果您的日期存储为“2013年4月7日”、“2013年4月18日”等。,在数据库中对它们进行排序,就可以得到该顺序。这就是字母数字排序的工作原理。

你想要的是人类的日历顺序,它既不是数字也不是字母,除非有一种情况。如果您将日期存储为YYYY-MM-DD,并按数字排序,您将获得与人类日历顺序匹配的订单。另一种选择是将日期存储在UNIX-time. 我建议使用UNIX时间,因为PHP中的日期操作通常意味着首先转换为UNIX时间。

这里的问题是,您存储数据的格式总是会给您带来麻烦。

如果没有看到您已经拥有的代码,我真的无法为您指出正确的代码编辑。

类似问题,可能重复:order post my meta value m/d/y format with year as included value

SO网友:Ralf912

首先,永远不要用你喜欢的格式存储日期。仅以数据库喜欢的格式存储日期。对于MySQL,格式为YYYY-MM-DD

让我们编写一个简短的函数将日期转换为MySQL格式:

function date2mysql( $date ) {

  $timestamp = strtotime( $date );

  return ( false === $timestamp ) ?
    false : date( \'Y-m-d\', $timestamp );

}
此函数将返回用MySQL格式格式化的日期。如果给定日期不是有效日期(例如“16.Hugo 2013”),则函数返回false.

我希望您具有将数据存储在数据库中的功能。这可能看起来像这样:

function save_event( $data ) {
  $defaults = array(
    \'date\'  => \'01. January 1970\',
    \'event\' => \'Sample event\'
  );

  $data = wp_parse_args( $data, $defaults );

  /*
   * some code that store your data in the database
   */
}
在将数据存储到数据库中之前,必须将日期转换为正确的格式:

[...]
  $data = wp_parse_args( $data, $defaults );
  $date = date2mysql( $data[\'date\'] );

  // handle cases where the date could not be converted. here setup a default date
  if ( false === $date )
    $date = \'1970-01-01\';

  $data[\'date\'] = $date;
[...]
如果查询数据库,帖子现在将按正确的方式排序,但显示错误。您还需要从MySQL格式向后转换为人类可读的格式。WordPress有一个内置功能:

function display_data() {

  $events = query_posts( 
    \'post_type=myevents&meta_key=_datepicker&orderby=meta_value&order=ASC&showposts=20\'
  );

  $dateformat = get_option( \'date_format\' );

  echo \'<table>\';
  echo \'<thead><th><td>Date</td><td>Event</td></th></thead>\';
  echo \'<tbody>\';

  foreach ( $events as $single_event ) {
    printf(
      \'<th><td>%s</td><td>%s</td></th>\',
      mysql2date( $dateformat, $single_event[\'date\'],
      $single_event[\'event\']
    );
  }

  echo \'</tbody></table>\';
}
mysql2date() 使用给定的格式字符串格式化日期(本例中为WP选项中的日期格式)。

摘要:在数据库中存储日期之前,请将其转换为MySQL格式。仅在显示时将其转换回其他格式。在对数据进行排序或对数据执行其他操作之前,请勿对其进行转换。

结束

相关推荐

带两个元查询的ORDER BY META_KEY

这应该很简单,但我无法找到一个正确语法的好例子。我想按指定的meta\\u键和两个meta\\u查询排序。问题是query\\u帖子似乎不喜欢有两个带有meta\\u键的meta\\u查询。如果我取出一个meta\\u查询,代码就会工作,或者如果我删除meta\\u键并将orderby更改为title,而不使用meta\\u查询,代码也会工作。有没有办法通过两个meta\\u查询按meta\\u键排序? $args2 = array( \'meta_key\' => \