无法比较META_QUERY中的日期

时间:2011-05-26 作者:Pierre

这是我用来获取日期元数据比今天更新的事件帖子的代码:

    <?php
        query_posts( array(
        \'post_type\' => \'concerts\',
        \'meta_key\' => \'numericdate\',
        \'posts_per_page\' => -1,
        \'orderby\' => \'meta_value\',
        \'order\' => \'ASC\',
        \'meta_query\' => array(
            array(
                \'key\' => \'numericdate\',
                \'value\' => date(\'dmY\'),
                \'compare\' => \'>=\',
                \'type\' => \'date\'
                 )
           )
    ) );
    if (have_posts()) : ?>
这没有返回任何结果。“numericdate”字段包含一个“ddmmyyyy”字符串,因此我希望今天与“dmY”日期值进行比较可以奏效。我错了。或者上面的代码有错误。谢谢你的帮助!

5 个回复
SO网友:micha

我这里有完全相同的问题,只是我在查询中使用了标准的post类型(post)和一个类别。除排序顺序外,所有操作都正常。

$d = date("Y-m-d");
$args = array(
    \'post_type\'         => \'post\',
    \'category_name\'     => \'events\',
    \'post_status\'       => \'publish,draft,pending,future,private\', // just for me
    \'meta_key\'          => \'event_start\',
    \'orderby\'           => \'meta_value_num\',
    \'order\'             => \'ASC\',
    \'posts_per_page\'    => -1,
    \'meta_query\'        => array(
        array(
            \'key\' => \'event_start\',
            \'value\' => $d,
            \'type\' => \'date\',
            \'compare\' => \'>\'
        )
    )
);
但我的帖子仍然是通过字符串比较来排序的。我做错了什么?

经过一些尝试和错误,我发现我应该使用“meta\\u value”而不是“meta\\u num”:

$d = date("Y-m-d");
$args = array(
    \'post_type\'             => \'post\',
    \'category_name\'     => \'events\',
    \'post_status\'           => \'publish,draft,pending,future,private\',
    \'meta_key\'              => \'event_start\',
    \'orderby\'               => \'meta_value\',
    \'order\'                     => \'ASC\',
    \'posts_per_page\'        => -1,
    \'meta_query\'            => array(
        array(
            \'key\' => \'event_start\',
            \'value\' => $d,
            \'type\' => \'date\',
            \'compare\' => \'>\'
        )
    )
);

SO网友:eranda hettiarachchi

无论它有什么价值,请使用wordpresscurrent_time() 对于此类查询。

current_time(\'mysql\') 根据MySQL可接受的管理设置提供服务器时间

SO网友:Milo

我认为MySQL的日期格式应该是YYYY-MM-DD。此外,我认为orderby应该是meta\\u value\\u num,否则这些值会被视为字符串。

SO网友:goldenapples

抛开MySQL的日期格式首选项不谈,有很多很好的理由可以使用像Y-m-d这样的bigendian格式。

你会认为比较日期是显而易见的,但是。。。

05262011>01012012

等等尝试使用dmY格式会给自己带来很多问题。

此外,我不认为“date”是meta\\u查询“type”的可接受参数之一。去掉该参数,并使用字符串比较以获得最佳结果。

SO网友:Yaron

如果有人有同样的问题,你最好看看posts_clauses 过滤器
它允许您操作查询SQL本身
您可以在那里转换日期列值并更改where子句和orderby子句。

$pieces[\'where\'] .= " AND STR_TO_DATE(wp_postmeta.meta_value,\'%d%m%Y\' ) >= 
  CURRENT_DATE() ";

$pieces[\'orderby\'] = "STR_TO_DATE( wp_postmeta.meta_value,\'%d%m%Y\' ) DESC";

结束

相关推荐