2013-01-04 54 views
0

我有一个自定义后类型成员和出生日期被保存象2013年1月1日通过自定义字段排序的WordPress get_posts这是一个自定义日期

$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); 

我想与各成员的有序生日列表按月份和日子里,

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

与列表上面的代码是由日下令十二月

  • 月1日,人3
  • 1月4日的,人3月10日
  • 8日,人2

也很重要的是,排序不受出生年份的影响

+0

wordpress问题在这里没关系,但为了将来的使用,我发现WP有一个特定的StackExchange站点,它非常好。 http://wordpress.stackexchange.com –

+0

问题是,通过存储格式化的日期而不是Unix时间,Wordpress的订购选项不会对你有任何帮助。您需要提出自己的排序方法,或者挂钩保存操作并使用strtotime将帖子的DOB元数据转换为Unix。 – maiorano84

回答

0

我想,我的任务是不是只有get_posts solveable,所以我做了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参与。

4

已存储的格式不正确的日期在自定义字段。您应该使用UNIX邮票或其他格式,如Y-m-d,这样可以按时间顺序排序。 你现在唯一的解决方案是检索你的结果而不对它们进行排序(忘记'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); 
+0

感谢这一点,我已经想过改变日期格式,但与update_post_meta它是非常容易和快速!现在唯一的事情是,我如何才能按月份和日期对日期进行排序?因此,如果某人出生在1950年或2000年,那么这无关紧要 - 出生在前一个月的人应该位列榜首 – oliverspies

+0

然后,您应该将日,月和年存储在不同的字段中(+保留一个字段UNIX邮票)或有一个字段“md”(月和日 - 在这种情况下,你会自动得到你想要的名单)。 (再次,您可以在循环中使用'add_post_meta',在您存储'geburtsdatum'时检索其值并在另一个自定义字段中提供月份和日期。 – barakadam

相关问题