値の配列を使用して meta_query を実行し、シリアル化された配列に格納されているメタ値にすべてが存在するかどうかを検索しようとしています。これは可能ですか?
クエリの引数は次のとおりです (これはクラスにネストされていることに注意してください)。
$args = array(
'post_type' => $this->posttype,
'posts_per_page' => '9',
'paged' => $paged,
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_key' => 'lumens',
'meta_query' => array(
array(
'key' => 'mount',
'value' => array('pendant' , 'wall'),
'compare' => 'IN'
)
)
);
格納されたメタ データの例は、以下のようなシリアル化された配列にあります。
a:4:{i:0;s:7:"pendant";i:1;s:15:"surface-ceiling";i:2;s:4:"wall";i:3;s:14:"aircraft-cable";}
私のクエリは、何を試しても適切な結果を返しません。各値を配列ではなく別のメタキーに格納する必要があったことに気付きましたが、メタデータを変更するエントリがすでに非常に多くなっています。
アップデート:
@Leander アプローチと同様に、これは私の回避策でした。データベースにすでに大量のエントリがあるため、シリアル化された入力を変更したくなかったのですが、1 つ忘れていたことがありました。チェックボックス フィールドをシリアル化されたデータとしてネイティブに格納するCMB2 Developer Toolkitを利用していたことです。
// This is pulled from a user input
$meta_queries = array('pendent' , 'wall');
// Metaqueries are passed through loop to create single entries with the like comparison operator
foreach($meta_queries as $key => $value){
$meta_query = array(
'key' => '_tf_' . $key,
// Serialize the comparison value to be more exact
'value' => serialize(strval($value)),
'compare' => 'LIKE',
);
}
// Generate $args array
$args = array(
'post_type' => $this->posttype,
'posts_per_page' => '9',
'paged' => $paged,
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_key' => 'lumens',
'meta_query' => $meta_queries
);
データを入力している間、パフォーマンスの問題にあまり気づきませんでした。処理するデータが圧倒的に多い場合、このアプローチを作り直す必要があると思います。