web-dev-qa-db-fra.com

wpdb affiche tous les posts meta

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
);
1
Muhammad Ibrahim

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
  • ou 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 message
  • post_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:

  • Vous n'avez pas besoin de préparer la déclaration. Aucune entrée utilisateur non sécurisée n'est insérée dans la requête. La seule raison pour laquelle vous voudriez le faire est d'économiser la clé plusieurs fois, mais vous pouvez toujours mettre la variable directement dans l'instruction si elle ne provient pas d'une entrée non sécurisée. Vous n'utilisiez même aucune des variables plusieurs fois (à l'exception de la clé méta, voir ci-dessous), ce qui n'était donc pas nécessaire pour votre requête.
  • Vous commandiez par la valeur littérale '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.

0
Jacob Peattie