5.3の機能強化:カスタムフィールドキーの条件指定が使いやすくなる

説明

5.3 RC4もリリースされ、正式リリースまであと1週間。5.3の変更点を確認していると、WP_Meta_Queryクラスが変更されていた。これは「Expanded meta key comparison operators in 5.3」で紹介されており、さまざまな条件指定が追加されていた。

compare_keyとtype_key

WP_Meta_Queryクラスの変更点は、クエリー条件を示す連想配列の内容である。

  1. compare_keyキーに指定できる条件が増えた。
  2. type_keyキーが追加され、'BINARY'が指定できるようになった。

MySQLのクエリーでREGEXPを使用した場合、デフォルトでは英字の大文字と小文字が区別されない(パターンマッチング)。大文字と小文字を区別した結果を得たい場合はBINARYでキャストする必要があり、type_keyキーはそのために使用する。次の表ではバージョン5.2.4と5.3.0の違いを示している。

compare_key5.2.45.3.0備考
= 
!= 
LIKE 
NOT LIKE 
IN 
NOT IN 
REGEXPBINARY指定可
NOT REGEXPBINARY指定可
RLIKEBINARY指定可
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月07日 12:10


お勧め

wp_insert_user(2019年5月29日 更新)

mixed wp_insert_user( mixed $userdata )
ユーザーを登録する。

fetch_feed(2018年5月27日 更新)

mixed fetch_feed( mixed $url )
RSSまたはAtom形式のフィードデータを読み込む。

is_tag(2018年5月27日 更新)

bool is_tag( [ mixed $slug = '' ] )
要求されているページが、タグアーカイブページか調べる。

esc_js(2019年1月24日 更新)

string esc_js( string $text )
文字列をインラインJavaScript向けにエスケープ処理する。

wp_list_pages(2015年4月28日 更新)

string wp_list_pages( [ mixed $args = '' ] )
固定ページを一覧表示する。