web-dev-qa-db-ja.com

Pre_get_postsのmeta_queryと配列を比較する

Advanced Custom Fieldsプラグインで作成したカスタムフィールドを使用して投稿のリストをフィルタリングするためのフォームに取り組んでいます。このフォームのため、GETリクエストを介してクエリを変更するためにpre_get_postsアクションを使用します。 (以下のコード参照はPHPまたはprint_r()からダンプされたものです)

Meta_queryをこのように設定します。

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

$filterは次のようになります。

Array
(
    [0] => Array
        (
            [key] => delivery_method
            [value] => Array
                (
                    [0] => Online
                    [1] => Scheduled

                )

            [compare] => IN
        )
)

私が問い合わせているカスタムフィールドは、次のように構成されています。

Array (
    [delivery_method] => Array (
        [0] => Online
        [1] => Scheduled
    )
)

[compare] => INの投稿を探すと(上記のように)、投稿は返されません。 [compare] => NOT INで投稿を探すと、すべての投稿が返されます。

私は特定の「配達方法」を持っているそれらの投稿だけを返そうとしています。見逃した2つの配列を比較する方法はありますか?それともどうにかして配列の1つを爆発させ、個々の値を配列と比較する必要がありますか?

2
camara_tech

ACFドキュメントでは、同時に配列を使用するのではなく、値を個別にチェックすることをお勧めしています。

次のコードは、チェックボックスフィールドタイプに関するACFドキュメントからのものです。

http://www.advancedcustomfields.com/resources/field-types/checkbox/

/*
*  Query posts for a checkbox value.
*  This method uses the meta_query LIKE to match the string "red" to the database value a:2:{i:0;s:3:"red";i:1;s:4:"blue";} (serialized array)
*  The above value suggests that the user selected "red" and "blue" from the checkbox choices
*/

$posts = get_posts(array(
    'meta_query' => array(
        array(
            'key' => 'field_name', // name of custom field
            'value' => '"red"', // matches exaclty "red", not just red. This prevents a match for "acquired"
            'compare' => 'LIKE'
        )
    )
));

したがって、pre_get_postsのクエリは次のようになります。

$filter = array(
    array(
        'key' => 'delivery_method'
        'value' => '"Online"'
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'delivery_method'
        'value' => '"Scheduled"'
        'compare' => 'LIKE'
    )
)

$query->set('meta_query',$filter);
2
camara_tech

私が正しければ、あなたは配列を含むフィールドを持っています。

add_post_meta( $postid, 'delivery_method', array('Online', 'Scheduled') );

次に、フィールド 'delivery_method' = array( 'Online', 'Scheduled')の投稿をクエリします。

問題はあなたのようなメタクエリがあることです。

$meta_query = array(
  array(
    'key' => 'delivery_method',
    'value' => array( 'Online', 'Scheduled' ),
    'compare' => 'IN'
  )
);

'deliver_method'キーが 'Online' (文字列)または 'Scheduled' (文字列)、あるいはその両方に設定されている投稿を返します。そのため、その値は シリアライズ /データベースに保存される前のWordPressによって、シリアライズされていない配列を使用してシリアライズされた値を問い合わせることはできません...

そのため、異なる配信方法を保存したい場合は、複数の値を持つキーではなく、同じキーに複数の値を使用するほうがはるかに優れています。

add_post_meta( $postid, 'delivery_method', 'Online' );
add_post_meta( $postid, 'delivery_method', 'Scheduled' );

このように、適切な引数を使用すると、ニーズに応じて、どちらかの方法または両方の方法で投稿を取得できます。

私は誠意をこめてACFを使ってこれを実装する方法を知りません、しかしプラグイン特有の方法はこのサイトのためのトピックから外れています、しかし私は概念が単純であなたが単にそのプラグインに適用できると思います。

特定のケースに対するダーティーハックは、シリアル化された値を値として使用しているクエリです

$meta_query = array(
  array(
    'key' => 'delivery_method',
    'value' => serialize ( array( 'Online', 'Scheduled' ) )
  )
);

このメタクエリは両方のメソッドを配列として保存した投稿を返します。

1
gmazzap