WordPressで2つのWP_Queryと変数を使って複雑な条件で記事を取得します。1つ目のWp-Queryで必要な値を取得して変数に格納して、その変数を使って2つ目のWp-Queryで情報を取得します。
ここでは実例のサッカーリーグのサイトで、全ての予定を表示しているページとは別に、次の試合の予定だけをトップページに表示するWP-Queryを解説します。
ページ内リンク
対象サイトの概要と目的
サッカーリーグのサイトを運営しいます。
次の試合の予定をトップページに表示します。
サッカーリーグのサイト運営はグランドが確保できたら対戦、時間を設定して1試合1試合の記事を作ります。
作った時はまだ試合が行われていないわけですから、カテゴリーに「試合予定」を設定します。
特定の記事表示
「試合予定」の固定ページには全ての予定が表示されていますが、トップページには次に行われる試合日の「試合予定」の情報を表示させます。
「試合予定」は試合が終了するとカテゴリを「試合結果」に手動で変更します。
つまり「試合予定」の一番早い試合日の数試合つまり複数記事の情報をトップページ表示するようにします。
33,'posts_per_page' => 1,'order'=>'ASC','orderby'=>'meta_value','meta_key'=>'wpcf-shiaibi', 'meta_query' => array( array('key'=>'wpcf-ground','value'=>array( 'mitei','nashi' ),'compare'=>'NOT IN') ) ) ); if ( $hwb_query->have_posts() ) : ?> have_posts() ) : $hwb_query->the_post();?> 33,'posts_per_page' => -1,'order'=>'ASC','orderby'=>'meta_value','meta_key'=>'wpcf-dai-nanshiai', 'meta_query' => array( array('key'=>'wpcf-shiaibi','value'=>$ShiaiYoteiBi,'compare'=>'=') ) ) ); if ( $hwb_query->have_posts() ) : ?> have_posts() ) : $hwb_query->the_post();?> 現在試合予定はありません。
1つ目の「WP_Query」で試合日取得
1-18行目までの1つ目の「WP_Query」でカテゴリーid「33」の「試合予定」の中から、4行目のパラメーターの「meta_query」の「NOT IN」で「’mitei’,’nashi’」以外の試合予定の記事をカスタムフィールドの「wpcf-shiaibi」順で取得しています。
「‘mitei’,’nashi’」は試合の無い日と未定の日の記事に設定しているカスタムフィールドの値です。
カテゴリー「試合予定」の1試合1試合の記事の中には、試合の無い日や試合がまだ決まっていない未定の記事も含まれています。
試合の無い日と試合がまだ決まっていない未定の日の記事を省いた、試合日の一番早い「試合予定」の記事1件「‘posts_per_page’ => 1」の、試合日のカスタムフィールドの値を、13行目の「変数」に格納「$ShiaiYoteiBi = post_custom(‘wpcf-shiaibi’);」しています。
2つ目の「WP_Query」で複数記事を取得
20行目からの2つ目の「WP_Query」では1-18行目までで取得した試合予定「‘cat’=>33」の一番早い日を変数$ShiaiYoteiBiを使って、23行目の「‘value’=>$ShiaiYoteiBi」と設定し、試合日の全試合の記事「posts_per_page’ => -1」情報を取得しています。
「get_template_part( ‘wpwpwp/top/top-scheduled-contents’ );」で20行目からの「WP_Query」で取得した記事のカスタムフィールドの値でHTMLを設定している別ファイル「top-scheduled-contents」を呼出して表示させます。
まとめ
例えば9月の第1日曜日に3試合予定があって、第2日曜日に2試合、第3日曜日に4試合ある場合、1つの「WP_Query」でそれぞれの試合日の試合数の記事を自動的に表示させる事は難しいかと思います。
今回のように「WP_Query」を2つ使って、1つ目で最新の試合予定の試合日を取得して変数に格納し、2つ目でその試合日の変数で試合日の複数記事を呼出すようにすれば可能です。