Arrière-plan
Comme indiqué dans Y at-il une différence entre les taxonomies et les catégories , les taxonomies font référence à un système généralisé de classification et d'organisation des objets ou des données. Dans le cas de WordPress; Les catégories, les balises, le format de publication (ting) et les catégories de lien sont des taxonomies intégrées permettant de classer et d'organiser les publications, les liens et les métadonnées. Les termes sont des exemples de ces taxonomies; Prenons par exemple un blog WordPress sur les logiciels. Si l'une des taxonomies est une catégorie, l'un des termes serait alors langage de programmation, car celui-ci est un sujet de logiciel informatique et pourrait être considéré comme une taxonomie catégorique. De plus, les développeurs WordPress et les développeurs de plug-in peuvent utiliser la fonction register_taxonomy()
pour initialiser les taxonomies intégrées, ainsi que créer de nouvelles taxonomies dans WordPress.
Utilisation de catégories WordPress
Ok, donc WordPress offre quelques fonctions intéressantes sous l’API Taxonomy (pas de page de codex, liens vers le code source le plus récent). Si je les comprends bien, voici certaines des fonctions prometteuses que je peux utiliser pour mes besoins:
get_terms()
: Le codex dit à peu près la même chose que disent les commentaires du code source; qu'il récupère les termes dans une taxonomie ou une liste de taxonomies donnée. Je peux fournir un tableau d'arguments pour changer les termes retournés. par exemple, pour m'assurer d'inclure les termes vides (c'est-à-dire, ils ne sont pas référencés dans les publications dans le cas de catégories ou de balises), je peux définir l'argument masqué vide sur 0
ou false
;get_term_heirarchy()
: Renvoie tous les ID de terme des enfants d'un terme donné sous forme de tableau.term_is_ancestor_of()
: Fait exactement ce qu'il dit; comparez deux termes, le terme un étant le terme de référence et le terme deux, le terme permettant de vérifier l’ascendance.Euh, alors qu'en est-il des descendants
Mon but ici est de savoir quelles catégories n’ont pas de catégories d’enfant (ou de termes descendants, pour être plus général). Je ne veux pas non plus ignorer les catégories vides (les catégories qui ont des enfants mais qui n'ont pas de posts qui les référencent).
WordPress dispose-t-il d'un moyen facile d'effectuer une telle recherche? Si tel est le cas, y a-t-il des problèmes de performance avec lesquels je devrais être inquiet?
Quelques modifications : Pour donner un exemple pour référence future, voici quelques données concrètes avec lesquelles je travaille ...
Dans mon cas de test, je souhaite renvoyer ce qui suit:
Tous n'ont pas d'enfants, même si certains ont un compte vide.
Il n'y a aucun moyen facile de le faire. Vous devez interroger directement pour y parvenir. Je suppose, vous voulez seulement les catégories parentes qui n'ont pas de descendants ou même si elles ont des descendants, ce n'est pas utilisé dans aucun post
global $wpdb;
$categories = $wpdb->query("SELECT $wpdb->terms.*
FROM $wpdb->terms
INNER JOIN $wpdb->term_taxonomy
ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
WHERE $wpdb->terms.term_id NOT IN(
SELECT $wpdb->term_taxonomy.parent
FROM $wpdb->term_taxonomy
)
AND $wpdb->term_taxonomy.taxonomy = 'category'"
);
l'addon de l'affiche originale EDIT
Supposons que le préfixe de la table est main _ . Premièrement, nous devons obtenir toutes les catégories afin de pouvoir commencer à examiner celles qui n’ont pas d’enfants. Ceci est fait en sélectionnant tout dans la table term_taxonomy et en utilisant une clause WHERE
pour limiter les résultats où le champ taxonomy est égal à catégorie :
SELECT *
FROM main_terms
WHERE main_term_taxonomy.taxonomy = 'category';
Cependant, nous avons également besoin des noms des catégories qui sont stockés dans la table termes . Nous joignons donc les deux tables en utilisant un INNER JOIN
, ce qui garantit également que seules les lignes de données communes aux deux les colonnes sont incluses (comme par opposition à une jointure externe). Les deux tables assemblées ont besoin d'une colonne commune pour les "assembler".
SELECT *
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category';
Enfin, nous excluons les catégories où elles apparaissent en tant que parent d’une autre catégorie dans la table term_taxonomy . Pour ce faire, nous utilisons les mots-clés NOT IN
et construisons une autre requête SQL dans SELECT
tout ce qui se trouve dans la colonne parent dans term_taxonomy . Cette requête SQL imbriquée indique ensuite quels identificateurs de terme doivent être exclus de nos résultats car ils ont des entrées dans term_taxonomy.parents , indiquant qu’ils sont les parents d’une autre catégorie.
SELECT main_term_taxonomy.*
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
SELECT main_term_taxonomy.parent
FROM main_term_taxonomy
);
Fait intéressant, cela renvoie les lignes correctes, mais n'inclut pas le nom de la catégorie. En effet, nous sélectionnons toutes les colonnes de la mauvaise table, main_term_taxonomy . Nous devons donc changer les emplacements des tables dans notre code SQL pour obtenir les informations souhaitées.
SELECT main_terms.*
FROM main_terms
INNER JOIN main_term_taxonomy
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
SELECT main_term_taxonomy.parent
FROM main_term_taxonomy
);