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

この前にデータベースをバックアップするか、少なくとも 1 つまたは 2 つの投稿でテストを行ってください。ただし、これで解決するはずです。その後、後で使用できるようになります:

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プラグインのAdvancedCustomFieldsを使用しているので、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 に答える