WP Query and date format

时间:2016-04-22 作者:Fafanellu

我一直在使用一个名为“session”的CPT,它有一些日期字段。这些日期字段通过CMB2插件存储,如下所示:

$cmb->add_field( array(
    \'name\' => __(\'Begin :\', \'cmb2\'),
    \'id\' => $prefix . \'session_datebegin\',
    \'desc\' => __( \'Beginning date of the session\', \'cmb2\' ),
    \'type\' => \'text_date\',
    \'date_format\' => \'d-m-Y\'
) );    
现在,我想显示会话,按“最近的”日期排序。以下是我的WP查询中使用的参数:

$args = array( 
    \'post_type\' => \'session\', 
    \'posts_per_page\' => -1,
    \'meta_key\' => \'session_datebegin\', 
    \'orderby\' => \'session_datebegin\', 
    \'order\' => \'ASC\' 
    );
假设我有3个日期:2016年4月22日、2016年4月20日和2016年5月5日。之前的查询给出:05-05-2016、20-04-2016、22-04-2016。正如您所猜测的,使用“DESC”而不是“ASC”返回:2016年4月22日、2016年4月20日、2016年5月5日。

我的WP安装的日期设置是自定义的,在以下表单下:d-m-Y。

我只是不知道问题出在哪里:对于“五月”,即使与美国日期格式有混淆,2016年5月5日总是等于2016年5月5日,不是吗?!

如何使用此日期格式进行适当排序?谢谢

2 个回复
SO网友:Fafanellu

对于那些经历过同样问题的人,我终于找到了一种方法。首先,我创建了一个额外的CMB,如下所示:

$cmb->add_field( array(
        \'id\' => $prefix . \'session_gooddatebegin\',
        \'type\' => \'hidden\',
    ) );
然后我使用save_post. 如果CPT“会话”正在更新,感谢$update, 我假设用户在CMB中选择了一个日期session_datebegin. 因此,我们现在可以更新隐藏日期字段,并将其转换为正确的格式:

add_action( \'save_post\', \'good_dates\', 99, 3);

function good_dates( $post_id, $post, $update ) {

    if (get_post_type($post_id)!=\'session\') {
        return;
    }

    //if the post is being updated
    if ($update==true) {

        //begin date 
        $datebegin = get_post_meta( $post_id, \'session_datebegin\', true );

        //put to the expected form with date() and strtotime() 
        $datebegingood = date("mdY", strtotime($datebegin));

        //update the hidden variable
        update_post_meta($post_id, \'session_gooddatedeb\', $datebegingood );
    }

}
最后,可以在存档页面中使用与之前相同的参数执行排序:

$args = array( 
    \'post_type\' => \'session\', 
    \'posts_per_page\' => -1,
    \'meta_key\' => \'session_datebegin\', 
    \'orderby\' => \'session_datebegin\', 
    \'order\' => \'ASC\' 
    );

SO网友:Rarst

简而言之,这是一种糟糕的存储日期格式。

你得到的结果是因为05<;20<;22在那个例子中。您只是在比较字符串,而在这些日期字符串中,日期字符串以月日为准。

您也无法轻松地将其转换为MySQL日期,因为它的格式是YYYY-MM-DD。

如果需要排序,则应将日期存储为字符串格式(如日期)或存储时间戳,时间戳可以按数字排序(但不是人类可读的)。

相关推荐

Admin multiple column sorting

这个问题似乎很简单,我很惊讶我在搜索谷歌时没有找到太多答案。到目前为止,我只找到了一个pro插件。我只想能够在管理区域中按多个列进行排序。例如,在页面部分,有三列:标题、作者和日期。我需要做些什么来按作者排序,然后对第一个作者,按标题按字母顺序排列他们的所有页面(这是假设作者已经可以自己排序,使用类似manage\\u edit-page\\u sortable\\u columns过滤器的东西)?我更喜欢用函数中的代码来实现这一点。php文件,而不是插件,但任何东西都很好。