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.
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
));