*

WordPressのWP_Queryでカスタムフィールドで絞り込み今日の日付以前の記事は表示しない

公開日: : 最終更新日:2019/02/21 WordPress

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 は凄く優秀ですね。

  • Pocket

おすすめトピックス

関連記事

WordPressでログイン時だけ表示する条件分岐を行うには?

WordPress では色々条件分岐があります。トップページだけ、カテゴリページだけ、固定ページだけ、単一記事ページだけ等、様々な条件分岐を行って表示を制御する事ができます。 WordPress でサイトを作っているうち […]

アップロード中にエラーが発生しました。
WordPressで画像がエラーでアップロードできなくなる原因

WordPress でサイト(ブログ)を運営していて恐怖のエラーがあります。それはもう Windows で言えばブルースクリーンが発生した時のように蒼白になります。 それは新たに画像をアップロードできなくなるエラーです。 […]

wordpress
【WordPress】テーマ「Stinger3」のスマホページでCSSが効かない

WordPress のテーマで Stinger3 というものがあります。これが結構人気テーマで、このブログでも使わせて頂いています。 「必要な物は、揃っている。」というキャッチコピーの通り、主要プラグインに類する機能、ス […]

AMP
WordPressを簡単にAMPに対応するテーマやテンプレートを紹介

ウェブサイトの SSL 対応と同様に、いずれ AMP にも対応せざるを得なくなるんじゃないかなぁと思っています。AMP とはスマートフォンなどのモバイル端末でのウェブ閲覧を爆速化するプロジェクトです。AMP に対応したウ […]

WordPressで記事ごとにページビュー(アクセス数)を表示する方法

WordPress でブログやサイトを運営していると、どの記事がどの程度読まれているのか?という事が気になってくるものでしょう。それを調べる為にはアクセス解析や Google Analytics といったようなツールを利 […]

pasokon-pc
WordPressで投稿日時の年月日を別に取得する方法

WordPress には投稿日時を取得する関数 get_the_date() という便利なものがありますが、これだと年月日全てが表示されてしまいます。投稿年月日を年・月・日と別に取得する方法はないかと結構頭を悩ませたんで […]

著者について

名前:Azell
作曲したり風景写真撮ったりWeb制作したりする人です。 好きな事を楽しくブログに綴れていけたらと思います。

フォローはこちら

       

       
エックスサーバーでメールが送れない「Client host rejected:Access denied」

エックスサーバーで作成したメールアカウントでメールを送信しよう

札幌駅パセオ地下1階のパスタとパフェが美味しい「プロヴァンス」でランチ

札幌駅のパセオ地下1階にあるプロヴァンスは南フランスとイタリア

千歳市の和食処「ほうりん」の安い充実の寿司ランチ

千歳市にある和食処ほうりんは千歳駅の南西にある居酒屋が立ち並ぶ

スパホテルソーレ
札幌のカプセルホテル「スパホテルソーレすすきの」に泊まった感想

札幌の地下鉄すすきの駅の近くにあるカプセルホテル「スパホテルソ

札幌駅近くのモダン和食レストラン「えりも亭」で珍しい縮れ蕎麦ランチ

札幌駅の北口から徒歩2分程度の所に和風なモダンレストラン「えり

→もっと見る