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