WordPress で条件に応じた記事を一覧で表示したいという機会は数多くあります。WP_Query を使えばカテゴリで記事を絞り込んだり、並び替えたり色々な条件に応じた記事一覧を出力できます。
今回やりたいと思ったのはカスタムフィールド(日付)の値で記事を絞り込んで出力できるのか?という事でした。更に出力した記事をカスタムフィールドの値で並び替えもしたい、今日の日付以前の記事は表示したくないという複雑な要件です。
結論から言えば WP_Query を使って実現する事ができました。
目次
実装したい機能
- イベント情報を掲載しているウェブサイトを作っていてイベントの一覧を表示したい
- 開催日を過ぎたイベント記事は表示したくない
- 開催日が近い記事から表示したい
実装したい機能はこのような事で、直近のイベント情報という形で記事を絞り込んで表示する機能を作りたいと思っていました。
イベント開催日を過ぎた記事を手動で消すのは面倒ですので自動でやりたいと思います。
作り方
まず開催日となるデータを php で扱えるようにしなくてはいけません。その為にはカスタムフィールドで開催日のデータを作りました。
新しいカスタムフィールド「eventdate」を作り、スラッシュで区切って年月日を記入します。月と日も2桁にします。
ここから php プログラムを組んでいきます。
$today = date("Y/m/d");
まずは今日の日付も絞り込み条件に使うので、変数に今日の日付も入れておきます。
次に WP_Query で絞り込む条件を作成します。ここが一番大事な所です。
$args = Array( 'post_type' => 'post', 'category_name' => 'event', 'posts_per_page' => 10, 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => array(array( 'key' => 'eventdate', 'value' => $today, 'compare' => '>=', 'type' => 'DATE' )) );
大変複雑な条件指定になりましたが、一個一個見ていきましょう。
post_type
これは投稿のタイプです。
- post:投稿記事
- page:固定ページ
主に使うのはこの2つだと思います。今回は記事を表示したいので post にしています。
category_name
これはカテゴリーの名前です。カテゴリで絞り込みたい時に使います。カテゴリースラッグを記入します。
スラッグとはカテゴリーページの URL となる部分で、カテゴリーの設定画面にあります。
posts_per_page
これはいくつ記事を表示するかという値です。全部表示する時は -1 を書きます。
orderby
これは一覧に表示する記事について何を基準に並び替えするかというものです。
タイトル、日付、更新日など色々な条件で並び替えができますが、meta_value はカスタムフィールドの値で並び替えを行います。
order
これは並び替えを降順にするか昇順にするか指定します。
- ASC:昇順
- DSC:降順
開催日が近いものから表示したいので昇順にしています。
meta_query
これはカスタムフィールドを指定したりどんな条件で絞り込むか詳細な条件を設定します。
- key:絞り込みに使うカスタムフィールド名を指定
- value:カスタムフィールドを何と比較するか。今回は今日の日付と比較します
- compare:比較する条件(~より大きい、~より小さい、~と等しい)
- type:日付で絞り込む場合は DATE 指定が必須です
カスタムフィールド(開催日)と今日の日付を比較し、開催日の方が大きければ(今日の日付より先であれば)表示するという条件になります。compare の比較条件に「>=」を指定していますが、数式風にすればこんな感じです。
年月日を分解して数値で比較しなくても「2019/02/20」のまま比較ができちゃいます。これは簡単で助かります。
これで開催日が過ぎたものに関しては自動で表示されなくなります。
$querys = new WP_Query($args); if($querys -> have_posts()): while($querys -> have_posts()): $querys -> the_post(); (この中に出力する処理を書く) endwhile; endif; wp_reset_postdata();
これが絞り込んだ記事を出力する部分です。出力する処理には ul リストで出力したり書き方次第でお好きな形式で出力できます。
おわりに
以上で求めていた機能が実装できました。php でどうやって組むのか悩んでいましたが、WordPress のクラスで用意されているパラメーターだけで目的の機能が実装できました。WP_query は凄く優秀ですね。