WordPressでメタボックスの値を使用したクエリ
目的
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 |
+---------+---------+-------------+------------+