我有一个会员自定义帖子类型,出生日期保存为 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 );
我想要一个按月和日排序的成员生日列表
使用上面的代码,列表按天排序
同样重要的是,排序不受出生年份的影响
您在自定义字段中以错误的格式存储了日期。您应该使用 UNIX 标记或类似 Y-m-d 的格式,它允许按时间顺序排序。 您现在唯一的解决方案是检索结果而不对它们进行排序(忘记
'order' => 'ASC'
),但也不限制它们(因为您的日期限制不起作用,即使它看起来像这样),创建一个包含所有这些的数组,转换作为 UNIX 时间戳的日期时间(使用 strtotime
)并按日期排序...
但我真正的建议是使用时间戳或格式正确的日期(年-月-日)来重构您的网站。您可以创建一个循环来遍历每个帖子,并将自定义字段的值替换为 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 );
我认为我的任务不能仅用 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 的参与。