logo

Now Loading...

WEBサイト作りノウハウ WEBノウハウメモ

  • HOME
  • 記事一覧
  • Wordpressでメタボックスの値を使用したクエリ

WordPressでメタボックスの値を使用したクエリ

カテゴリー:wordpress自作テーマ作成メモ

作成日付:2019年4月13日

更新日付:2019年6月26日

目的

wordpressで投稿画面に作成したメタボックスをクエリの条件として指定します。

メタボックスの作成方法はをWordPressで独自の投稿画面を作成する方法参照。

  • 独自に作成した値をキーに投稿を表示することができる
  • キーの値を好きな型にすることができる

例として、イベント(催し物)に関する投稿記事一覧を作成します。

イベント投稿記事にはイベントの開催日付けを示す値として、add_meta_boxを使用して追加したメタボックスの値「event-date」(date型)が設定してあり、その値が、現在時刻より先に設定された投稿記事のみを記事一覧として表示します。

(過去に開催されたイベントに関する記事は表示しないという意味)

結果

メタボックスで日付が本日より未来に設定された記事の一覧をsingle.phpに表示します。

以下イメージ図、ユーザの閲覧日付が4月5日だった場合、メタボックスで指定した日付がそれ以降でないと表示されない。(開催日4/4は表示されない)

また、投稿の出力順序はメタボックスで指定した日付をソートして出力する。

イメージ図

メタボックスの日付比較

方法

フロー

1前提として投稿にメタボックスでdate型の値を作成
参考WordPressで独自の投稿画面を作成する方法
2single.phpにメタボックスをキーとしたクエリを作成 (修正ファイル:single.php)

1.前提として投稿にメタボックスでdate型の値を作成

以下にカスタムポストを作成し、そこにメタボックスとしてdate型の設定方法を記載しています。

参考WordPressで独自の投稿画面を作成する方法

2.single.phpにメタボックスをキーとしたクエリを作成

post_typeがpost(通常投稿)のものに対して、meta_keyとしてメタボックス_event-dateに合致するものを取得します。

表示された時刻をphpのdate関数で取得し、meta_queryの中で_event-dateと比較(compare)をします。_event-dateはDATE型であり、DATE型で比較します。

実行されたSQL文の例を本ページ下部に記載します。

※_event-dateに関して、頭に_のついた値にすると、Wordpressのカスタムフィールドに候補として出力されない。

処理の流れとしては以下です。

①クライアント側で表示時の現在時刻の取得

②_event-dateをキーに設定

③meta_queryによる現在時刻と各投稿の_event_dateの比較


<?php
  $current_date = date('Y-m-d');  <--- ①クライアント側表示時の現在時刻の取得
  $args = array(
    'post_type'   => 'post',
    'orderby'   => '_event-date',
    'order'   => 'ASC',
    'posts_per_page' => -1,   <--- 「-1」にすることで全件表示
    'meta_key' => '_event-date',   <--- ②_event-dateをキーに設定
    'type' => 'DATE',
    'meta_query' => array(   <--- ③meta_queryによる現在時刻と各投稿の_event_dateの比較(以下から日付比較箇所)
     array(
       'key' => '_event-date',
       'value' =>  $current_date,
       'compare' => '>=',
       'type' => 'DATE',
      ),
    ),
  );
 ?>
<?php $customPosts = get_posts($args); ?>

参考

その他詳細

実行されたSQL文

wp_XXXXXXXXXXはインストール時に設定しているテーブル接頭辞


SELECT wp_XXXXXXXXXXposts.* 
  FROM wp_XXXXXXXXXXposts 
  INNER JOIN wp_XXXXXXXXXXpostmeta 
  ON ( wp_XXXXXXXXXXposts.ID = wp_XXXXXXXXXXpostmeta.post_id ) 
  INNER JOIN wp_XXXXXXXXXXpostmeta AS mt1 
  ON ( wp_XXXXXXXXXXposts.ID = mt1.post_id ) 
  WHERE 1=1 
  AND ( wp_XXXXXXXXXXpostmeta.meta_key = '_event-date' 
  AND ( ( mt1.meta_key = '_event-date' AND CAST(mt1.meta_value AS DATE) >= '2019-04-05' ) ) )   <---$current_dateが4月5日の場合
  AND wp_XXXXXXXXXXposts.post_type = 'event' 
  AND (wp_XXXXXXXXXXposts.post_status = 'publish' 
  OR wp_XXXXXXXXXXposts.post_status = 'private') GROUP BY 
  wp_XXXXXXXXXXposts.ID ORDER BY wp_XXXXXXXXXXpostmeta.meta_value ASC

mysqlDB上でのメタボックスの値

メタボックス作成時にinputタグでtype="date"を指定した場合、値はYYYY-MM-DDとして格納される。


mysql> select * from wp_XXXXXXXXXXpostmeta where meta_key = "_event-date" ;
+---------+---------+-------------+------------+
| meta_id | post_id | meta_key    | meta_value |
+---------+---------+-------------+------------+
|      17 |      40 | _event-date | 2019-04-10 |
+---------+---------+-------------+------------+