Je crée une requête pour créer une sortie de toutes les méta-valeurs à partir de la méta-clé select_analyst
, mais si je mets OR pour inclure deux post_status
, il affiche tout postmeta. Pourriez-vous s'il vous plaît me dire ce que je fais mal?
Si je ne mets qu’un seul statut, cela fonctionne mais j’ai besoin d’un autre post_status
.
Ma requête:
$query = $wpdb->prepare('
SELECT DISTINCT pm.meta_value FROM %1$s pm
LEFT JOIN %2$s p ON p.ID = pm.post_id
WHERE pm.meta_key = "%3$s"
AND p.post_status = "%4$s"
OR p.post_status = "%5$s"
AND p.post_type = "%6$s"
ORDER BY "%3$s"',
$wpdb->postmeta,
$wpdb->posts,
'select_analyst',
'new',
'pending_review',
$post_type
);
Ce n’est pas vraiment une question WordPress, il s’agit juste de SQL standard, ce qui n’appartient donc pas vraiment à la question, mais j’ai quelques remarques à faire sur votre utilisation de $wpdb->prepare()
.
Alors, regardons votre clause WHERE
, isolée, avec des valeurs substituées et indentée pour refléter la façon dont elle sera interprétée:
WHERE
pm.meta_key = "select_analyst" AND p.post_status = "new" OR
p.post_status = "pending_review" AND p.post_type = "post_type"
Ceci renvoie meta_value
pour les lignes qui répondent aux conditions suivantes:
meta_key
est select_analyst
et post_status
est new
post_status
est pending_review
et post_type
est votre type de message.Notez que la deuxième condition ne spécifie pas de clé méta, vous obtiendrez donc meta_values
pour toutes les publications qui sont pending_review
.
Vous devez formater vos conditions pour que vous interrogiez:
meta_key
est select_analyst
post_type
est votre type de messagepost_status
est new
ou pending_review
Le SQL pour cela serait
WHERE
pm.meta_key = 'select_analyst' AND
p.post_type = 'post_type' AND
p.post_status IN ('new', 'pending_review' )
Donc, votre requête complète devrait être:
$query = $wpdb->get_results(
"SELECT
DISTINCT pm.meta_value
FROM
$wpdb->postmeta pm
LEFT JOIN
$wpdb->posts p ON p.ID = pm.post_id
WHERE
pm.meta_key = 'select_analyst' AND
p.post_type = $post_type AND
p.post_status IN ('new', 'pending_review')
ORDER BY
pm.meta_value"
);
Quelques autres modifications que j'ai apportées:
'select_analyst'
, qui ne fera rien. Je suppose que vous vouliez trier la méta-valeur, alors je l'ai fait.Notez également que l'indentation du code afin de refléter la structure de la requête facilite la détection de ce type de problèmes.