自定义字段排序的wordpress get_posts是自定义日期

时间:2013-01-04 22:11:41

标签: wordpress date custom-post-type

我有会员的自定义帖子类型,出生日期保存为01.01.2013

$args = array(
    'numberposts'   => -1,
    'post_type'       => 'mitglied',
    'post_status'     => 'publish',
    'meta_key'      => 'geburtsdatum',
    'meta_value'    => date("d.m.Y"),
    'meta_compare' => '>',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);
$geburtstage = get_posts ( $args );

我想要一个列表,其中包含按月和按日排序的成员的生日

  • 1月4日,10人
  • 3月8日,人2
  • ...
  • 12月1日,第3人

列表上方的代码按日排序

  • 12月1日,第3人
  • 1月4日,10人
  • 3月8日,人2

同样重要的是,排序不受出生年份的影响

3 个答案:

答案 0 :(得分:4)

您已在自定义字段中以错误的格式存储日期。您应该使用UNIX标记或Y-m-d之类的格式,它允许按时间顺序排序。 你现在唯一的解决方案是检索你的结果而不对它们进行排序(忘记'order' => 'ASC')但也不限制它们(因为你的日期限制即使它看起来也不起作用),创建一个包含所有这些的数组,将日期时间转换为UNIX时间戳(使用strtotime)并按日期排序... 但我真正的建议是使用时间戳或正确格式化日期(Y-m-d)来重构您的网站。您可以使用以下命令创建一个遍历每个帖子的循环,并使用UNIX中的等效值替换自定义字段的值:

$oldvalue = get_post_meta($post_id, 'geburtsdatum', true);  
update_post_meta($post_id, 'geburtsdatum', strtotime($old_value));  

请在此之前备份您的数据库或至少对矿石或两个帖子进行测试,但这应该解决它。然后你就可以在以后使用:

date("d.m.Y", $yourunixstamp)

获得格式化日期。

然后,您之前的代码也会变成:

$args = array(
'numberposts'   => -1,
'post_type'       => 'mitglied',
'post_status'     => 'publish',
'meta_key'      => 'geburtsdatum',
'meta_value'    => time(),
'meta_compare' => '>',
'orderby' => 'meta_value',
'order' => 'ASC'
);
$geburtstage = get_posts ( $args );

答案 1 :(得分:0)

这可以帮助您找到解决方案:

http://wpquestions.com/question/show/id/3598

答案 2 :(得分:0)

我认为我的任务只能通过get_posts解决,所以我分3步完成了。

首先,我使用get_posts来获取所有成员

$args = array(
    'numberposts'   => -1,
    'post_type'       => 'mitglied',
);
$geburtstage = get_posts ( $args );

然后用数据填充数组。为了排序,我创建了一个时间戳,其中包含生日的日期和月份,但是实际的年份。 虽然使用此解决方案没有必要,但我将日期格式更改为yyyy-mm-dd。 @barakadam在回答我的问题时解释了如何做到这一点。 我使用wordpress插件高级自定义字段,因此我使用get_field()

获取自定义字段
$mitglieder = array( array() );
$i = 0;
foreach($geburtstage as $post){
    setup_postdata( $post );

    $datum = explode( "-",get_field('geburtsdatum') );

    $mitglieder[$i]['orderby'] = mktime(0, 0, 0, (int)$datum[1], (int)$datum[2], date('Y'));
    $mitglieder[$i]['name'] = get_field( 'name' );
    $i++;
}

最后一步是使用array_multisort获取预期的订单

foreach ($mitglieder as $key => $row) {
    $dates[$key] = $row['orderby'];
}
array_multisort($dates, SORT_ASC, $mitglieder);

感谢@barakadam和@Christopher的参与。