前提・実現したいこと
WordPressで、カスタムフィールド検索をしたいです。
ECサイトの商品ページが、カスタム投稿タイプ(product_detail)で1商品あたり1記事が存在している状況です。
その中で、商品(product_detail)に対するクチコミのカスタムフィールド「review」の中に含まれている「性別」「年代」などで絞り込み検索が行えるようにしたいです。
このとき、reviewは「wp_postmeta」テーブルに
| meta_id | post_id | meta_key | meta_value |
|---|---|---|---|
| 001 | 200 | review | 2 |
| 002 | 200 | review_0_gender | 0 |
| 003 | 200 | review_0_age | 20 |
| 004 | 200 | review_0_title | hogehoge |
| 005 | 200 | review_1_gender | 1 |
| 006 | 200 | review_1_age | 30 |
| 007 | 200 | review_1_title | fugafuga |
と言った形式で保存されています。
meta_key = review にはクチコミの件数が保存され、以降で review_%_slugと言った形で保存されています。
理想の動きは、「age=20かつgender=0」のレビューが欲しいとき、「review_0_titleのhogehogeと、post_idの200」を合わせて取得されることです。
問題
この検索ではWordPressの基本機能である「WP_Query」は使えないと感じました。
理由として、meta_queryを指定する際、meta_keyの値が変動してしまうものの、ワイルドカードが使えるのはmeta_valueのみなため、検索が困難だと判断したからです。
試したこと
解決策として、以下のようなSQL文を生成することで解決しようと試みました。
SQL
1select * 2from wp_postmeta 3where meta_key like 'review\__\_gender' and meta_value = 0
知りたいこと
上記の検索だとpostsとしてではなくpostmetaとして取得しているため、Wordpress側に記事として渡すことができず再度post_idをWP_Queryで引きなおす必要があります。
そもそもpostmetaテーブルは非常に件数が多く重たい上に、こうなると非常に重くなってしまうので、何かいい方法がないかと悩んでいます。
カスタムフィールド の引き方を変えるなど、そもそも別の良い検索方法があれば教えていただけると幸いです。
バージョン
WordPress 4.9.4
DB : MySQL