web-dev-qa-db-ja.com

直列化配列とmeta_queryのマッチング

私は以前に関連した質問をしました、しかし私はついに私の問題の核心を解決したと思います。

私は Advanced Custom Fieldsを使用しています 私の投稿タイプにはいくつかのカスタムフィールドが添付されています。カスタムフィールドと値で投稿を受け取るようにURLを変更しようとしています。

そして私は本当に近づいています。これが現在my functions.php にあるものです。

add_action('pre_get_posts', 'my_pre_get_posts');

function my_pre_get_posts( $query ) {
    if( is_admin() ) { return; }

    $meta_query = $query->get('meta_query'); // get original meta query

        if( isset($_GET['type']) ) {                        

        $type = '"' . $_GET['type'] . '"';      

        $meta_query[] = array(
            'key'       => 'type',
            'value'     => $type,
            'compare'   => 'LIKE',
        );
    }
    $query->set('meta_query', $meta_query); // update the meta query args
    return; // always return
}

ACFはカスタムフィールドの複数の値を扱うときに直列化された配列を使うので、私はLIKEクエリを使います。 typeカスタムフィールドは実際には複数の値を受け入れます。投稿を1つのtype(つまり女性)で表示することができます。

website.com?type=women

しかし、複数のtype(つまり、女性、男性、男の子)を検索しようとすると、うまくいきません。

website.com?type=women,men,boys

ここで直列化された配列を扱っていることに気付きました。複数のtypeをクエリしたいのであれば、その$type変数を分解しなければなりませんでしたが、どちらもうまくいっていないようです。

誰もが助けることができるなら、私は解決策を切望しています。ありがとうございます。

編集|タイプごとに複数回:

$meta_query[] = array(
    'relation'  => 'OR',
    array( 
        'key'       => 'type',
        'value'     => 'men',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'women',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'boys',
    ),
);
4
realph

私はちょうどそれをする方法を自分で考え出した

この例を見てください。

$args = array();
$args['relation'] = 'OR';
foreach ( $tag_ids as $t ) {
    $args[] = array(
        'key'     => 'afz_entry_tags',
        'value'   => serialize( strval( $t->id ) ),
        'compare' => 'LIKE'
    );
}

$query->set( 'meta_query', $args );

私は$tag_idsを通常のget_resultsと一緒に取得しています。

それから私は必要なORを定義するためにmeta_queryのための配列の最初の項目を作成します。

次に、get_resultsから受け取ったオブジェクトのコレクションを繰り返し処理し、必要なだけの数のmeta_queryの配列を作成します。

それは魅力のように働きます。

7
e4rthdog

LIKEは配列値を取りません。あなたのオプションはおそらく:

  1. 各タイプにメタクエリを追加します。すでにこのものを追加しており、OR節が必要になるため、うまく動作しない可能性があります。
  2. REGEXP compareを使用して複数の型を正規表現に結合すると、実行が非常に遅くなる可能性があります。
0
Rarst