私は、カスタムフィールド '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();
?>
これに対する良いアプローチは、まず日付順にソートされたすべての投稿を取得し、それからそれらをグループ化することです。
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]
}
}
}