2013-01-04 57 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

相關問題