Comment sélectionner des articles avec des balises/catégories spécifiques dans WordPress

StackOverflow https://stackoverflow.com/questions/28196

Question

Il s'agit d'une question très précise concernant MySQL tel que mis en œuvre dans WordPress.

J'essaie de développer un plugin qui affichera (sélectionner) les publications contenant des 'Mots clés' et appartiennent à un spécifique 'catégories' (tous deux multiples)

On m'a dit que c'était impossible car la façon dont les catégories et les balises sont stockées :

  1. wp_posts contient une liste de messages, chaque message a un "ID"
  2. wp_terms contient une liste de termes (à la fois des catégories et des balises).Chaque terme a un TERM_ID
  3. wp_term_taxonomy a une liste de termes avec leurs TERM_ID et une définition de taxonomie pour chacun d'entre eux (soit une catégorie, soit une balise)
  4. wp_term_relationships a des associations entre les termes et les messages

Comment puis-je rejoindre les tables pour obtenir tous les messages avec les tags "Nucléaire" et Des « Deals » qui appartiennent également à la catégorie « Catégorie 1 » ?

Était-ce utile?

La solution

Je t'ai mal compris.Je pensais que tu voulais Nuclear ou Deals.Ce qui suit ne devrait vous donner que le nucléaire et les offres.

select p.*
from wp_posts p, wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr,
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id and t.term_id = tt.term_id and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id and t2.term_id = tt2.term_id and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and p.id = tr3.object_id and t3.term_id = tt3.term_id and tr3.term_taxonomy_id = tt3.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name = 'Nuclear')
and (tt3.taxonomy = 'post_tag' and tt3.term_id = t3.term_id and t3.name = 'Deals')

Autres conseils

Quelle structure de base de données grossière.

Quoi qu'il en soit, je ferais quelque chose comme ça (notez que je préfère EXISTS aux jointures, mais vous pouvez les réécrire sous forme de jointures si vous le souhaitez ;la plupart des analyseurs de requêtes les réduiront de toute façon au même plan de requête).Vous devrez peut-être jongler davantage d'une manière ou d'une autre pour que cela fonctionne...

SELECT *
  FROM wp_posts p
 WHERE EXISTS( SELECT *
                 FROM wp_term_relationship tr
                WHERE tr.object_id = p.id
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'category'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Category1" 
                                           )
                            )
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'post_tag'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Nuclear" 
                                           )
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Deals" 
                                           )
                            )
            )

J'ai donc essayé les deux options sur ma base de données WordPress.J'ai cherché la catégorie "Tech" dans mes posts avec les balises "Perl" ET "Programmation".

celui d'Éric a fonctionné une fois que j'ai ajouté une virgule manquante dans l'instruction select initiale.Il a renvoyé 3 enregistrements.Le problème est que la section qui recherche le "post_tag" fonctionne en fait comme une option OU.Un de mes messages n'avait qu'une seule balise, pas les deux.Il serait également bon de rendre le SELECT DISTINCT.

J'ai essayé Celui de Matt version, mais il renvoyait toujours un ensemble vide.Je vais peut-être essayer de "jongler" avec ça.

Essaye ça:

select p.*
from wp_posts p, 
wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id
and t.term_id = tt.term_id
and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id
and t2.term_id = tt2.term_id
and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name in ('Nuclear', 'Deals'))

Essentiellement, j'utilise 2 copies des tables enfants pertinentes -terms, term_taxonomy et term_relationship.Une copie applique la restriction « Catégorie 1 », l'autre la restriction « Nucléaire » ou « Deals ».

BTW, de quel genre de projet s'agit-il avec des articles entièrement consacrés aux accords nucléaires ?Vous essayez de nous inscrire sur une liste gouvernementale ?;)

Merci @Eric ça marche !Juste quelques corrections de code pour référence future :

  • les premières instructions select manquent un coma après wp_term_relationship tr2
  • Dans la même instruction select, les éléments suivants doivent être modifiés :
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

devrait être

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3

Vraiment une très bonne réponse ..m'a beaucoup aidé..

super bcoz., cela m'a donné une approche de base pour construire ma requête complexe !

une petite correction, pour les utilisateurs prêts comme moi :)

"wp_term_relationship" donnera "n'existe pas d'erreur" ..utiliser wp_term_relations car c'est le nom correct de la table.

Merci Éric

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top