web-dev-qa-db-fra.com

Balises en requête mysql post-ID. Recherche de balises

Je suis en train d'essayer de mettre en œuvre une recherche basée sur les balises. Lorsque je spécifie certaines balises, les publications marquées seront recherchées et le post-id correspondant aux critères de recherche sera affiché.

Actuellement, cela ne fonctionne que pour une seule étiquette.

$query = "SELECT DISTINCT $wpdb->posts.ID FROM $wpdb->terms
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id)
    LEFT JOIN $wpdb->posts ON ($wpdb->term_relationships.object_id = $wpdb->posts.ID)
        WHERE $wpdb->term_taxonomy.taxonomy = 'post_tag' " . $substring;

La sous-chaîne ressemble à ce qui suit:

$substring = "AND $wpdb->terms.slug IN ('tag1','tag2')"

Et voici le problème. Il ne recherche pas les publications uniques qui correspondent à tous les critères. Au lieu de cela, il "collecte" toutes les publications avec toutes les balises recherchées.

Par exemple:

// postid1 -> tag1
// postid2 -> tag2
// postid3 -> tag1, tag2

$substring = "AND $wpdb->terms.slug IN ('tag1')"
//Output: postid1, postid3 - - - CORRECT
$substring = "AND $wpdb->terms.slug IN ('tag1','tag2')"
//Output: postid1, postid2, postid3 - - -WRONG!

//Expected: postid3

Jusqu'ici, je ne sais pas comment le résoudre en une seule requête mysql. Peut-être que je manque quelque chose. Merci d'avance pour votre aide.

1
Tom Siwik

Ce sont des mécanismes normaux IN - ils correspondent à tout dans un ensemble, mais pas dans l'ensemble.

Le type de correspondance souhaité est appelé tag_slug__and dans les arguments de requête WP. Vous pouvez voir le code qui génère du code SQL dans la source de la méthode WP_Query->&get_posts() .

SQL résultant est comme ceci:

SELECT p.ID 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON (tt.term_id = t.term_id) 
WHERE tt.taxonomy = 'post_tag' 
AND t.slug IN ('is', 'filler') 
GROUP BY p.ID HAVING count(p.ID) = 2
2
Rarst