由于日期差异,使用UNIXTIMESTAMP的META_KEY进行时间排序失败

时间:2013-11-10 作者:Sean M.

我正在处理以下问题,试图通过使用高级自定义字段插件创建的元键对自定义帖子类型进行排序Date and Time Picker 附加组件。该插件创建一个jQuery日期选择器,供用户在仪表板中设置时间。默认情况下,选项save\\u as\\u timestamp设置为true,因此后端中的数据设置为Unix时间戳/历元时间。

我试图按时间对一系列事件(都发生在一天内)进行排序。我遇到的问题是,如果所有事件都是在一天内添加的,那么它们会正确排序(例如,上午9:00的事件会排在第一位,下午5:00的事件会排在最后)。然而,如果一两天后,我的老板在列表中添加了一个新事件,它将显示为最终事件,如果是上午9:00的事件,它将显示为最终事件,因为日期不同。我的帖子类型查询如下:

<?php $args = array(
    \'post_type\' => \'event\',
    \'posts_per_page\' => -1,
    \'nopaging\' => true,
    \'post_status\' => \'publish\',
    \'meta_key\' => \'start_time\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$my_query = new WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post(); ?>
在我的估计中,我有两个选项,将save\\u as\\u timestamp选项更改为false,以便没有日期与时间关联。问题是,我必须进入并再次设置所有事件的时间,而且我还必须管理一个meta\\u查询,该查询可以在上午时间之后对下午时间进行排序,因为当我这样做时,它仍然会在下午5:00之后对上午9:00的时间进行排序。我已经尝试过使用meta\\u查询,并将type设置为“TIME”,但仍然没有成功。

第二种选择是,我设想我可以使用PHP中的日期、时间或日期时间函数的某种组合来格式化时间戳,但我不知道如何正确地做到这一点。我尝试将以下内容添加到查询中,但我对meta\\u查询没有任何经验:

\'meta_query\' => array(
    array(
        \'key\' => \'start_time\',
        \'value\' => date(\'Hi\', time()),
        \'compare\' => \'>=\'
    )
)
有没有办法做到这一点,或者我必须使用一些函数或pre\\u get\\u posts过滤器来格式化meta\\u键,以便在循环开始之前可以将其作为格式化变量访问?非常感谢您的帮助!

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

我要警告你,我仍然不能百分之百确定我知道你在做什么,但我相信下面将按时间对你的结果进行排序,前提是你的元值是正确的Unix时间戳。

function orderby_time_only($orderby) {
  remove_action(\'posts_orderby\',\'orderby_time_only\');
  return preg_replace(\'|(.*)\\s(.*)|\',\'DATE_FORMAT(FROM_UNIXTIME($1),"%k%i") $2\',$orderby);
}
add_filter(\'posts_orderby\',\'orderby_time_only\');

$args = array(
    \'post_type\' => \'event\',
    \'posts_per_page\' => -1,
    \'nopaging\' => true,
    \'post_status\' => \'publish\',
    \'meta_key\' => \'start_time\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'ASC\'
);
$my_query = new WP_Query( $args );
日期本身被忽略,因此如果您有多个不应该混合在一起的日期,它们将被置乱。

这个add_filter 行应该紧跟在您希望它影响的查询之前,但回调可以在其他地方定义。

结束

相关推荐

CURRENT_TIME(‘Timestamp’)似乎与实际当前时间不同

current\\u time(“timestamp”)是否存在问题?我试图获取当前的\\u时间(“时间戳”),而不是给我current time: Jun 26 2013 14:30 它给了我:Jun 26 2013 21:30 我试着检查秒数,它给了我:1372282238 这对于给定的时间是正确的,但对于real current time. 发生了什么事?

由于日期差异,使用UNIXTIMESTAMP的META_KEY进行时间排序失败 - 小码农CODE - 行之有效找到问题解决它

由于日期差异,使用UNIXTIMESTAMP的META_KEY进行时间排序失败

时间:2013-11-10 作者:Sean M.

我正在处理以下问题,试图通过使用高级自定义字段插件创建的元键对自定义帖子类型进行排序Date and Time Picker 附加组件。该插件创建一个jQuery日期选择器,供用户在仪表板中设置时间。默认情况下,选项save\\u as\\u timestamp设置为true,因此后端中的数据设置为Unix时间戳/历元时间。

我试图按时间对一系列事件(都发生在一天内)进行排序。我遇到的问题是,如果所有事件都是在一天内添加的,那么它们会正确排序(例如,上午9:00的事件会排在第一位,下午5:00的事件会排在最后)。然而,如果一两天后,我的老板在列表中添加了一个新事件,它将显示为最终事件,如果是上午9:00的事件,它将显示为最终事件,因为日期不同。我的帖子类型查询如下:

<?php $args = array(
    \'post_type\' => \'event\',
    \'posts_per_page\' => -1,
    \'nopaging\' => true,
    \'post_status\' => \'publish\',
    \'meta_key\' => \'start_time\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$my_query = new WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post(); ?>
在我的估计中,我有两个选项,将save\\u as\\u timestamp选项更改为false,以便没有日期与时间关联。问题是,我必须进入并再次设置所有事件的时间,而且我还必须管理一个meta\\u查询,该查询可以在上午时间之后对下午时间进行排序,因为当我这样做时,它仍然会在下午5:00之后对上午9:00的时间进行排序。我已经尝试过使用meta\\u查询,并将type设置为“TIME”,但仍然没有成功。

第二种选择是,我设想我可以使用PHP中的日期、时间或日期时间函数的某种组合来格式化时间戳,但我不知道如何正确地做到这一点。我尝试将以下内容添加到查询中,但我对meta\\u查询没有任何经验:

\'meta_query\' => array(
    array(
        \'key\' => \'start_time\',
        \'value\' => date(\'Hi\', time()),
        \'compare\' => \'>=\'
    )
)
有没有办法做到这一点,或者我必须使用一些函数或pre\\u get\\u posts过滤器来格式化meta\\u键,以便在循环开始之前可以将其作为格式化变量访问?非常感谢您的帮助!

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

我要警告你,我仍然不能百分之百确定我知道你在做什么,但我相信下面将按时间对你的结果进行排序,前提是你的元值是正确的Unix时间戳。

function orderby_time_only($orderby) {
  remove_action(\'posts_orderby\',\'orderby_time_only\');
  return preg_replace(\'|(.*)\\s(.*)|\',\'DATE_FORMAT(FROM_UNIXTIME($1),"%k%i") $2\',$orderby);
}
add_filter(\'posts_orderby\',\'orderby_time_only\');

$args = array(
    \'post_type\' => \'event\',
    \'posts_per_page\' => -1,
    \'nopaging\' => true,
    \'post_status\' => \'publish\',
    \'meta_key\' => \'start_time\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'ASC\'
);
$my_query = new WP_Query( $args );
日期本身被忽略,因此如果您有多个不应该混合在一起的日期,它们将被置乱。

这个add_filter 行应该紧跟在您希望它影响的查询之前,但回调可以在其他地方定义。

相关推荐

CURRENT_TIME(‘Timestamp’)似乎与实际当前时间不同

current\\u time(“timestamp”)是否存在问题?我试图获取当前的\\u时间(“时间戳”),而不是给我current time: Jun 26 2013 14:30 它给了我:Jun 26 2013 21:30 我试着检查秒数,它给了我:1372282238 这对于给定的时间是正确的,但对于real current time. 发生了什么事?