我有会员的自定义帖子类型,出生日期保存为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 );
我想要一个列表,其中包含按月和按日排序的成员的生日
列表上方的代码按日排序
同样重要的是,排序不受出生年份的影响
答案 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)
这可以帮助您找到解决方案:
答案 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的参与。