web-dev-qa-db-ja.com

Meta_key日付によるWP_Queryのグループ化

私は、カスタムフィールド 'time'でソートされた、カスタム投稿タイプからの投稿をリストするwp_queryを持っています。

このリストを別のカスタムフィールド「日付」でグループ化して、同じカスタムフィールド「日付」を持つすべての投稿がその日付の下に表示されるようにします。私はこれらの日付を前もって知りません。

出力は以下のようになります。

日付x
- 投稿3
- 投稿6
- ポスト8

日付y
- 投稿1
- 投稿4

日付z
- 投稿2
- 投稿5
- ポスト7
- ポスト9

以下は私の現在のWP_Queryです:

<?php
        // WP_Query arguments
        $args = array (
            'post_type'              => 'movie',
            'posts_per_page'         => '50',
            'orderby'                => 'meta_value_num',
            'order'                  => 'ASC',
            'meta_key'               => 'time',
        );

        // The Query
        $query = new WP_Query( $args );

        // The Loop
        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post();
                echo "<li><a href='".get_permalink()."'>";
                echo "<div class='xyz'>".get_the_title()."</div>";
                echo "</a></li>";

                $vbrand = get_post_meta( get_the_id(), 'brand', true ); 
                $vyear = get_post_meta( get_the_id(), 'year', true ); 
                $vtime = get_post_meta( get_the_id(), 'time', true ); 

                        echo "<p>".$vbrand;
                echo "<p>".$vyear;
                echo "<p>".$vtime;
            }

        } else {
            // no posts found
        }
        /* Restore original Post Data */
        wp_reset_postdata();
?>
1
BoBoz

これに対する良いアプローチは、まず日付順にソートされたすべての投稿を取得し、それからそれらをグループ化することです。

timeカスタムフィールドのフォーマットはY-m-dであるため、orderby => 'meta_value'を使用して投稿を適切に並べ替えることができます(現在のように、meta_value_numではなく、値を数値型にキャストします)。

次に、異なる日付ごとにタイトルを出力する場合は、最後に表示された日付を保存し、次の投稿がその日付と異なる場合はその日付で出力する(および保存日付を変更する)ことができます。これはこれに類似した何かをもたらすでしょう:

$dategroup = '';

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        // Fetch date for current post
        $postdate = get_post_meta( get_the_ID(), 'time', true );

        // Check if the post date differs from the current date
        if ( $postdate != $dategroup ) {
            // In that case, this is a new date that hasn't yet been displayed
            // So, we output the title...
            echo '<h3>' . $postdate . '</h3>';

            // ...and change the stored date for the current group
            $dategroup = $postdate;

            [your output stuff]
        }
    }
}
2
engelen