web-dev-qa-db-fra.com

meta_query avec tableau comme valeur

J'écris des PHP qui permettent aux utilisateurs de mon site de soumettre un formulaire et d'interroger des publications par leur post_meta. Tout fonctionne bien, sauf une chose: j'ai utilisé Advanced Custom Fields pour créer le post_meta et ACF enregistre les méta-valeurs sous forme de tableau sérialisé. Je dois conserver les données dans ce format afin qu'ACF puisse pré-remplir les champs personnalisés dans le panneau d'administration. J'ai besoin d'un moyen de comparer un tableau de valeurs (l'utilisateur sélectionne via des cases à cocher dans le formulaire) à un tableau sérialisé dans la base de données. La première partie de ma requête ressemble à la suivante, avec $ amenities étant le tableau de valeurs des cases à cocher:

$the_query = new WP_Query(
    array(
        'post_type' => 'listing',
        'meta_query' => array(
            array(
                'key' => 'distance',
                'value' => $distance,
                'type' => 'numeric',
                'compare' => '<='
            ),
            array(
                'key' => 'amenities',
                'value' => $amenities[0],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'amenities',
                'value' => $amenities[1],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'amenities',
                'value' => $amenities[2],
                'compare' => 'LIKE'
            )
        )
    )
);

La seule façon pour que la requête fonctionne est d'interroger chaque valeur possible ($ amenities [#]) que l'utilisateur aurait pu entrer dans les cases à cocher, mais cela semble trop compliqué à gérer pour ma base de données.

2
tyler

J'ai trouvé un moyen de créer une requête personnalisée en cochant les cases sélectionnées par l'utilisateur, puis d'ajouter dynamiquement un tableau contenant cette valeur à la requête. De cette façon, il vérifie si chaque valeur sélectionnée se trouve dans le tableau sérialisé, puis passe à la suivante. Rune beaucoup plus lisse que ce que je faisais avant.

for ($i=0; $i< count($amenities); $i++)
    {
        $count = count($arrays);
        $arrays[$count] = array(
                    'key' => 'amenities',
                    'value' => $amenities[$i],
                    'compare' => 'LIKE'
                    );
    }

$the_query = new WP_Query(array(
        'post_type' => 'listing',
        'post_status' => 'publish', 
        'category_name' => 'private_rental',
        'meta_query' => $arrays
    ));
1
tyler