前提・実現したいこと
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