wordpress get_posts 按自定义字段(自定义日期)排序

问题描述 投票:0回答:2

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

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

php wordpress sorting date custom-post-type
2个回答
4
投票

您在自定义字段中以错误的格式存储了日期。您应该使用 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 );

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 的参与。

© www.soinside.com 2019 - 2024. All rights reserved.