0

我有一个成员的自定义帖子类型,出生日期保存为 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 人

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

4

2 回答 2

4

您在自定义字段中以错误的格式存储了日期。您应该使用 UNIX 标记或 Ymd 之类的格式,它允许按时间顺序排序。您现在唯一的解决方案是检索结果而不对其进行排序(忘记'order' => 'ASC')但也不限制它们(因为您的日期限制不起作用,即使它看起来确实如此),创建一个包含所有这些的数组,转换日期时间作为 UNIX 时间戳(使用strtotime)并按日期排序......但我真正的建议是使用时间戳或格式正确的日期(Ymd)重构您的站点。您可以创建一个遍历每个帖子的循环,并将自定义字段的值替换为 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 );
于 2013-01-04T22:52:09.657 回答
0

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

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

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

然后用数据填充一个数组。为了排序,我用生日的日期和月份制作了时间戳,但实际年份。尽管使用此解决方案没有必要,但我将日期格式更改为 yyyy-mm-dd。@barakadam 在回答我的问题时解释了如何做到这一点。我使用 wordpress 插件 Advanced Custom Fields,所以我使用 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 的参与。

于 2013-01-06T12:09:38.397 回答