Gettin 'Jiggy wit' dans la base de données WP Conversion des slugs de catégorie en identifiants ($ wpdb)

Le type d'extraction de données "clé en main" que vous pouvez faire avec Wordpress est génial? vraiment c'est. Tant que ce n'est pas. Vous voyez, il existe en fait plusieurs scénarios où vous avez besoin de plus que d'une simple fonction ou d'une simple balise pour récupérer les données souhaitées et les convertir en quelque chose de réellement utile. Bouclez votre ceinture de sécurité, nous sommes sur le point de sortir des pistes pendant quelques minutes?


Interfaçage avec la base de données pour le plaisir et Profit ID de catégorie

Aujourd'hui, je vais partager avec vous un petit extrait de code que j'ai trouvé incroyablement utile au cours des derniers mois. mais avant de continuer à lire, sachez que c'est

  • ? va fouiller dans des bases de données (qui peuvent devenir poilues si vous êtes un tout nouveau développeur WP)
  • ? Je vais utiliser un vraiment exemple spécifique pour enseigner des leçons beaucoup plus grandes.

En fait, l'exemple lui-même n'a pas de sens? il s’agit des techniques que nous utiliserons pour résoudre le problème hypothétique. À la fin, vous découvrirez qu’il n’ya pratiquement aucune limite à ce que vous pouvez faire avec n’importe quel élément d’information enregistré dans la base de données WordPress..

Oh, et comme c'est un truc homebrew, je suppose que quelqu'un va avoir une façon différente de faire cela. Partagez, discutez, relâchez-vous dans la section commentaires: P je suis tout ouïe!

Notre hypothèse: Nous avons une liste de slugs de catégories (sauvegardés à partir d'une méta-boîte personnalisée sur une page).

Notre problème: Vous ne pouvez pas utiliser de slug de catégorie dans query_posts () ;, mais si la seule information dont nous disposons est le slug, nous devons trouver un moyen de le transformer en quelque chose que nous pouvons réellement utiliser: les identifiants de catégorie. Il existe plusieurs façons de convertir les slugs en ID (get_category_by_slug, get_term_by, etc.), mais ils ne sont pas aussi souples ni aussi puissants que la méthode que je vais vous montrer. Travailleront-ils bien? Oui, cela fonctionnera bien et nous en discuterons à la fin. Comme je le disais, on sort des pistes quelques minutes ici? Appréciez la balade :)

Notre objectif: convertir une partie des données de catégorie en une autre en demandant gentiment à la base de données, la combiner avec d'autres parties similaires pour créer un tableau, puis transformer ce tableau en une chaîne que nous pouvons réellement utiliser à d'autres endroits de notre thème ou de notre plugin.


Le problème hypothétique: comment récupérer l'ID de la catégorie à partir d'un slug de catégorie


Notre problème hypothétique inclut une méta-boîte personnalisée qui renvoie uniquement les slugs de la catégorie. Notre problème est que nous avons besoin de les convertir en ID avant de pouvoir les utiliser dans query_posts ();.

Imaginez ceci: Vous avez un champ personnalisé attribué à un modèle de page appelé "catégorie_filtre". Ce qui est fait est de saisir une liste de catégories que l'utilisateur a sélectionnées à partir d'une boîte méta personnalisée, et renvoie leurs catégorie-limaces. Génial? des limaces. Qu'allons-nous faire avec ceux?

Depuis la version actuelle de WordPress, il n’existe aucun moyen simple et rapide (du moins que je puisse trouver) qui vous permette de convertir simplement des slug de catégorie en identifiants de catégorie. Ce qui, franchement, est un peu nul, car ce genre de choses de type "conversion monétaire" est remarquablement facile si nous essayons de faire la même chose avec les données de publication (c'est-à-dire: transformer un nom en slug, une slug en identifiant ou ID dans un nom).

Dans le cas des messages, tout ce que vous avez à faire est de lancer query_posts ou get_posts et il devient assez facile de saisir tout ce dont vous avez besoin. Pas tellement dans le cas des catégories? mais comme n'importe quoi dans WordPress, là où il y a une volonté, il y a un moyen.

Nous savons que les données existent dans notre base de données WordPress; Donc, tant que nous pourrons associer une donnée (catégorie ID) à une autre (catégorie slug), nous pouvons la convertir? ça demande juste un petit effort supplémentaire. Voici à quoi ressemblent nos données dans la table de la base de données:


Affichage de la table wp_terms? montrant seulement la relation entre l'id de la catégorie (term_id) et le slug (montré).
Un exemple des données sur la table réelle.

Modifier: Nous sommes sur le point de sauter dans $ wpdb ici, mais comme l'ont souligné quelques intervenants, y a-t-il des raccourcis autour de cela? et quand je parle de raccourcis, je veux dire, il existe des moyens plus rapides d’acquérir un ID de catégorie unique. Pour ce que nous ferons en fin de compte, ces moyens sont en fait un peu plus longs. mais comme je l'ai mentionné ci-dessus, s'agit-il d'apprendre quelques façons de faire les choses? donc je vais montrer les deux (plus une méthode de bonus) à la fin!


Présentation de $ wpdb->

L’interface avec la base de données est l’une des sections les plus obscures du codex WordPress, mais elle ne contient que les informations dont nous aurons besoin pour effectuer notre conversion (et apprendre un nouveau truc fantaisie que nous pourrons utiliser dans de nombreuses situations différentes). . Voici les bases:

Vous pouvez utiliser l'objet $ wpdb "parler" à n'importe quelle table de la base de données WordPress. Si vous avez déjà bricolé MySQL, vous reconnaîtrez une partie de la procédure, car tout cela est fait avec une version de la classe ezSQL. Par exemple, le question fonction vous permet d'exécuter n'importe quelle requête SQL sur la base de données WordPress.

 requête ('requête'); ?> // Où 'requête' représente la requête SQL que vous souhaitez exécuter

Vous pouvez en savoir plus sur $ wpdb-> query dans la page du codex? Aujourd'hui, nous allons être un peu plus raffinés et utiliser ce qui suit:

 get_var ('query', column_offset, row_offset); ?>

Du codex: le get_var fonction renvoie une seule variable de la base de données. Bien qu'une seule variable soit renvoyée, l'intégralité du résultat de la requête est mis en cache pour une utilisation ultérieure.?

Parfait! Cela signifie que nous pouvons essentiellement attraper quelque chose dans la base de données WordPress tant que nous savons où le trouver. et nous savons justement où trouver notre identifiant de catégorie car nous connaissons déjà le slug de catégorie. Me suivre encore?


Extraction d'un ID de catégorie unique d'un slug de catégorie unique

Voici où il fait chaud et lourd. En utilisant notre exemple où nous connaissons la catégorie slug, nous pouvons extraire l'ID de la manière suivante:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourne un tableau de cat-slugs à partir du champ personnalisé. $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> term WHERE slug =" $ cat ""); // Récupère l'ID de la catégorie depuis la WPDB à l'aide de la catégorie slug ($ cat).

Cela renverra un seul identifiant de catégorie (term_id comme on le dit dans la DB) et stockez-le dans notre $ catid variable. Dans certaines situations, nous pourrions être fait? vous pourriez simple écho la $ catid où vous vouliez. Dans notre exemple cependant, nous avons encore du travail à faire..

Pour être clair, la première $ chats variable est la capture de la catégorie limaces de notre domaine personnalisé? vous pouvez insérer les limaces en utilisant d'autres méthodes? mais vous avez besoin d'un moyen de récupérer les slugs (ou des données associées à notre identifiant).


Saisir plusieurs ID de catégorie à partir de plusieurs slug de catégorie

Etendons maintenant notre petit bout de code en permettant plus d’une catégorie en utilisant un rapide pour chaque boucle:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourne un tableau de cat-slugs à partir du champ personnalisé. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termes WHERE slug =" $ cat ""); // Récupère l'identifiant de la base de données à l'aide de la catégorie slug ($ cat). $ acats [] = $ catid; // Transforme la liste des identifiants en un tableau, $ acats []

Ce dernier morceau de code ($ acats?) Utilise un simple PHP pour transformer chaque ID de catégorie trouvé en partie d’un tableau? qui pourrait vous être utile. Mais allons encore un autre pas à pas et convertissez le tableau en chaîne (car la plupart des fonctions de WordPress utilisent des chaînes).


Conversion du tableau en chaîne séparée par des virgules à l'aide de Join ();

Nous nous rapprochons maintenant! Utilisons un peu plus simple PHP pour convertir le tableau des ID de catégorie que nous avons créés en une chaîne que nous pouvons utiliser dans query_posts.

 $ cats = get_post_custom_values ​​('category_filter'); // Retourne un tableau de cat-slugs à partir du champ personnalisé. foreach ($ cats en tant que $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termes WHERE slug =" $ cat ""); // Récupère l'identifiant de la base de données à l'aide de la catégorie slug ($ cat). $ acats [] = $ catid; // Transforme la liste des identifiants en un tableau, $ acats [] $ cat_string = join (',', $ acats); // Joignez-vous à ARRAY dans une STRING séparée par des virgules à utiliser dans query_posts // echo $ cat_string; // Supprimer les commentaires pour tester la sortie

Notez la dernière ligne où vous pouvez supprimer le "//" pour tester votre sortie à ce stade, ce qui devrait être une série de nombres (les ID de catégorie) comme ceci: 11, 123, 198, 210?

Vous pouvez lire sur le fonctionnement de la fonction 'join' de PHP ici, mais tout ce que vous avez besoin de savoir, c'est que nous venons de transformer notre tableau d'ID de catégorie en chaîne, chaque ID étant séparé par une virgule? C'est pratique, parce que c'est exactement ce dont nous avons besoin pour notre dernière étape?


Rassembler tout cela avec Query_Posts ();

Passons en revue avant le grand dévoilement. Nous avons pris une valeur connue (nos slugs de catégorie), les avons convertis en ID de catégorie en interrogeant la base de données, puis avons joint nos ID de catégorie à une chaîne que nous pouvons utiliser dans query_posts ();. Tout bon? Ok, voici à quoi ça ressemble:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourne un tableau de cat-slugs à partir du champ personnalisé. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termes WHERE slug =" $ cat ""); // Récupère l'identifiant de la base de données à l'aide de la catégorie slug ($ cat). $ acats [] = $ catid; // Transforme la liste des identifiants en un tableau, $ acats [] $ cat_string = join (',', $ acats); // Joignez-vous à ARRAY dans une STRING séparée par des virgules à utiliser dans query_posts // echo $ cat_string; // Supprimer les commentaires pour tester la sortie $ args = array ('cat' => $ cat_string, // Requête pour l'ID de cat (car vous ne pouvez pas utiliser plusieurs noms ou slugs? WP fou!)); query_posts ($ args);

Pas mal non? Nous sommes prêts à passer à l'action. Nous pouvons maintenant l'utiliser dans le processus de base. Si / pendant boucle de publication pour distribuer les messages qui sont seulement dans le particulier ID de catégories que l’utilisateur sélectionné dans les cases à cocher (vous vous souvenez de l’image de case à cocher en haut?).


L'extrait complet

Bon, la grande révélation! Nous avons juste besoin d'ajouter quelques garanties supplémentaires pour nous assurer que nous pouvons utiliser / réutiliser cet extrait. Nous devons nous assurer que le champ personnalisé, "catégorie_filtre"existe (il y a toujours une chance que l'utilisateur ne sélectionne aucune catégorie du tout). Si elle n'existe pas, cela n'a pas de sens de tourner en rond? nous allons donc utiliser un simple wrapper if / then pour exécuter uniquement notre extrait lorsque le champ personnalisé existe:

 get_var ("SELECT term_id FROM $ wpdb-> termes WHERE slug =" $ cat ""); // Récupère l'identifiant de la base de données à l'aide de la catégorie slug ($ cat). $ acats [] = $ catid; // Transforme la liste des identifiants en un tableau, $ acats [] $ cat_string = join (',', $ acats); // Joignez-vous à ARRAY dans une STRING séparée par des virgules à utiliser dans query_posts // echo $ cat_string; // Supprimer les commentaires pour tester la sortie endif; // Fin de la situation? Continuez comme d'habitude s'il n'y avait pas de filtre de catégorie. ?> $ cat_string, // Requête pour l'ID de chat (parce que vous ne pouvez pas utiliser plusieurs noms ou slugs? WP fou!)); query_posts ($ args); ?>

Cet extrait suppose que vous avez un champ personnalisé appelé "catégorie_filtre"assigné à votre message? mais vous pouvez coder avec Franken cet extrait pour faire à peu près tout ce que vous voulez. Ok, peut-être que cela ne fera pas de vous un sammich? mais c'est quand même un joli extrait.


Un exemple pratique


Voir ces images? Chacun est un article de blog qui a été récupéré à partir de notre requête personnalisée query_posts (); installer? Voir, les limaces catégorie ne sont pas complètement inutiles après tout! Voir l'exemple complet.

Par exemple, j'ai utilisé cet extrait pour former la base d'un modèle de page de portefeuille filtrable personnalisé dans mon dernier thème WordPress SuperSkeleton. Le "modèle de page de portefeuille" comprend la liste des cases à cocher des catégories, ce qui permet à l'utilisateur de sélectionner les catégories de publications du portefeuille qu'il souhaite afficher sur la page. Le flux de travail est le même, j'ajoute juste quelques modifications supplémentaires après avoir utilisé query_posts ();.

  1. Catégorie Slugs?
  2. Converti en ID de catégorie?
  3. Utilisé dans Query_Posts?
  4. Profit!!! Modèle de page de portefeuille filtrable

Vous pouvez l'utiliser pour beaucoup de choses différentes? en fait, presque tous les cas où vous devez créer un modèle de page que les requêtes pour une catégorie spécifique peuvent utiliser.


Pourquoi utiliser $ wpdb?

Deux raisons. Principalement, je ne pouvais pas obtenir les techniques préférées de get_category_by_slug et get_term_by pour travailler dans mon cas parce qu'ils ne me rendaient tout simplement pas ce dont j'avais besoin pour attraper beaucoup de ce genre de choses (ils ont bien fonctionné pour attraper des catégories individuelles lorsque je connaissais la catégorie slug? limace?).

La deuxième raison est éducative? Ce petit exercice compliqué de résolution de problèmes me donne l’opportunité d’écrire quelque chose sur $ wpdb, une technique très sous-estimée lorsque vous essayez de manipuler et d’extraire des informations très spécifiques de la base de données. Franchement, étant donné que vous pouvez exécuter des requêtes SQL directes à l'aide de cette requête, il est difficile de trouver quelque chose qu'il ne peut pas faire..

Oh, et la vignette de ce message est Will Smith chantant une chanson de rap? J'espère que vous ne vous attendiez pas à quelque chose de trop officiel: P C'est un bon divertissement, personne ne dit que c'est la seule façon de s'emparer de ce que nous avons fait? en fait, voici quelques autres idées:


Méthodes alternatives sans $ wpdb

Utilisation de Get_Category_By_Slug ();

Merci à Andrew d’avoir indiqué que vous pouvez également utiliser une fonction plus spécifique pour convertir un slug de catégorie en un ID à l’aide de get_category_by_slug ();. Consultez la page du codex pour cela, et vous pouvez voir à quoi notre code ressemblerait ci-dessous:

Version simple:

 term_id; ?>

Notre version (qui est encore longue, mais vous pouvez voir où nous utilisons get_category_by_slug (); à la place du $ wpdb-> comme outil de collecte de données:

 term_id; $ acats [] = $ id; // Transforme la liste des identifiants en un tableau, $ acats [] $ cat_string = join (',', $ acats); // Joignez-vous à ARRAY dans une STRING séparée par des virgules à utiliser dans query_posts // echo $ cat_string; // Supprimer les commentaires pour tester la sortie endif; // Fin de la situation? Continuez comme d'habitude s'il n'y avait pas de filtre de catégorie. ?> $ cat_string, // Requête pour l'ID de chat (parce que vous ne pouvez pas utiliser plusieurs noms ou slugs? WP fou!)); query_posts ($ args); ?>

Une autre méthode utilisant Get_Term_By ();

Enfin, comme le dit si bien Thomas dans les commentaires, cela ressemble beaucoup à "une programmation équivalente à aller de Rochester, NY à Boston via Wheeling WV"? Vous pouvez utiliser la page de codex suivante pour plus de détails sur cette méthode. Il y a même une fonction intégrée pour construire notre tableau, ce qui nous aide à sauter une étape dans ce cas:

 $ myCategory = get_term_by ('id', $ postCategories [0] -> ID_cat, 'catégorie');

Nous pourrions simplement passer dans notre limace et être sur notre joyeux chemin;)


Envelopper

Oui, c’était un exemple très spécifique avec des hypothèses très spécifiques au départ? mais, si vous suivez toujours à ce stade, vous devriez avoir appris avec succès une ou deux choses sur les points suivants:

  • Comment utiliser $ wpdb pour exécuter des requêtes SQL sur la base de données WordPress (saisir l'ID de la catégorie à partir d'un slug de catégorie dans notre exemple, mais vous pouvez faire beaucoup plus que cela)
  • Comment exécuter une boucle foreach sur une liste de catégories et les stocker dans un tableau
  • Convertissez un tableau d'ID de catégories en une chaîne séparée par des virgules à utiliser dans query_posts ();

Note de Heckler: Oui, si nous avions commencé avec des identifiants de catégorie, nous n'aurions jamais besoin de nous embêter avec ce processus fastidieux? mais alors, ce ne serait pas un tutoriel très éducatif, n'est-ce pas? ; P Seul le temps (et vos commentaires) dira s’il s’agit bien de la meilleur façon d’aborder cela, mais j'espère que vous en savez un peu plus sur WordPress maintenant! Merci d'avoir lu!