この記事は最後に更新してから1年以上経過しています。
説明
5.3 RC4もリリースされ、正式リリースまであと1週間。5.3の変更点を確認していると、WP_Meta_Queryクラスが変更されていた。これは「Expanded meta key comparison operators in 5.3」で紹介されており、さまざまな条件指定が追加されていた。
compare_keyとtype_key
WP_Meta_Queryクラスの変更点は、クエリー条件を示す連想配列の内容である。
- compare_keyキーに指定できる条件が増えた。
- type_keyキーが追加され、'BINARY'が指定できるようになった。
MySQLのクエリーでREGEXPを使用した場合、デフォルトでは英字の大文字と小文字が区別されない(パターンマッチング)。大文字と小文字を区別した結果を得たい場合はBINARYでキャストする必要があり、type_keyキーはそのために使用する。次の表ではバージョン5.2.4と5.3.0の違いを示している。
compare_key | 5.2.4 | 5.3.0 | 備考 |
---|---|---|---|
= | 〇 | 〇 | |
!= | - | 〇 | |
LIKE | 〇 | 〇 | |
NOT LIKE | - | 〇 | |
IN | - | 〇 | |
NOT IN | - | 〇 | |
REGEXP | - | 〇 | BINARY指定可 |
NOT REGEXP | - | 〇 | BINARY指定可 |
RLIKE | - | 〇 | BINARY指定可 |
EXISTS | - | 〇 | =の別名 |
NOT EXISTS | - | 〇 | !=の別名 |
compare_keyが省略された場合、5.2.4では常に「=」が適用される。これに対し5.3.0ではkeyが配列の場合は「IN」が、配列以外は「=」が適用されるようになっている。
そのほかのBINARYキャスト
ここで気になったのはLIKE(およびNOT LIKE)などに対するBINARYキャストについて。先のMySQLのリファレンスページではLIKEのパターンマッチングでは大文字と小文字が区別されないとなっているが、LIKEのBINARYキャストについてはこのページ内では触れられていない。
MySQL 5.7のクライアントでLIKEの動作を確認してみた。
mysql> select meta_key from wp_postmeta where meta_key like '_Export%' group by meta_key;
+-------------------+
| meta_key |
+-------------------+
| _export_file_path |
| _export_file_url |
+-------------------+
2 rows in set (0.00 sec)
mysql> select meta_key from wp_postmeta where meta_key like binary '_Export%' group by meta_key;
Empty set (0.00 sec)
以上のように、LIKEのBINARYキャストは正しく機能しているように見える。近い将来、LIKEやNOT LIKEに対してもtype_keyキーが有効になるかもしれない。
WP_Queryクラスで試す
WP_Meta_Queryクラスの変更は、WP_Queryクラスにも影響している。WP_Queryクラスは連想配列でクエリー条件を指定できるが、WP_Meta_Queryクラスのtype_keyキーに対応するmeta_type_keyキーが追加されている。
検証用にカスタムフィールドを指定した投稿を2つ用意した。
mysql> select * from wp_postmeta where meta_key = 'addr';
+---------+---------+----------+----------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+----------+----------------+
| 67 | 76 | ADDR | 神奈川県横浜市 |
| 72 | 81 | addr | 東京都渋谷区 |
+---------+---------+----------+----------------+
2 rows in set (0.00 sec)
まずはカスタムフィールドの有無で投稿情報を取得してみる。
$q1 = new WP_Query( array(
'fields' => 'ids',
'meta_key' => 'addr',
'meta_compare_key' => 'EXISTS'
) );
print_r( $q1->posts );
$q2 = new WP_Query( array(
'fields' => 'ids',
'meta_key' => 'addr',
'meta_compare_key' => 'NOT EXISTS'
) );
print_r( $q2->posts );
出力結果は次の通り。'meta_compare_key'キーに'EXISTS'を指定した方はカスタムフィールド名が'ADDR'と'addr'の2つの投稿情報のIDが、次の'NOT EXISTS'を指定した方はそれら以外のIDが取得できている。5.3で追加される「別名」はソースコードの意味がわかりやすい。
Array
(
[0] => 81
[1] => 76
)
Array
(
[0] => 46
[1] => 1
)
今度はBINARYキャストの効果を確認する。ソースコードは次の通りで、先に'meta_type_key'キーの指定なしを、次に'meta_type_key'キーで'BINARY'を指定している。
$q3 = new WP_Query( array(
'fields' => 'ids',
'meta_key'=>'^ad',
'meta_compare_key' => 'REGEXP'
) );
print_r( $q3->posts );
$q4 = new WP_Query( array(
'fields' => 'ids',
'meta_key'=>'^ad',
'meta_compare_key' => 'REGEXP',
'meta_type_key' => 'BINARY'
) );
print_r( $q4->posts );
$q3の結果ではカスタムフィールド名が'ADDR'と'addr'の2つの投稿情報のIDが取得できているのに対し、$q4の結果はカスタムフィールド名が'addr'の投稿IDのみとなる。
Array
(
[0] => 81
[1] => 76
)
Array
(
[0] => 81
)
このように5.3ではカスタムフィールド名に関連する投稿検索がより柔軟に対応できる。またメタ情報は投稿情報だけでなく、ユーザー情報やターム情報、コメント情報もあり、それらのメタ情報が使いやすくなる意味は大きい。
最終更新 : 2019年11月19日 15:16
関連
お勧め
get_next_comments_link(2024年12月18日 更新)
add_dashboard_page(2022年6月27日 更新)
use_block_editor_for_post(2023年4月24日 更新)
wp_image_editor_supports(2012年12月20日 更新)
wp_check_filetype_and_ext(2019年2月23日 更新)