Holen Sie sich 'Jiggy wit' der WP-Datenbank Konvertieren von Kategorie-Slugs in IDs ($ wpdb)

Die Art der Datenextraktion "out of the box", die Sie mit Wordpress durchführen können, ist großartig? wirklich ist es. Bis es nicht geht. Sie sehen, es gibt tatsächlich eine Reihe von Szenarien, in denen Sie mehr als nur eine einfache Funktion oder ein Tag benötigen, um die gewünschten Daten abzurufen und sie in etwas zu konvertieren, das tatsächlich nützlich ist. Schnallen Sie sich an, wir springen für ein paar Minuten von den Gleisen?


Schnittstelle mit der Datenbank für Spaß und Profitieren Kategorie-IDs

Heute werde ich ein kleines Code-Snippet mit Ihnen teilen, das ich in den letzten Monaten für unglaublich nützlich gehalten habe. Aber bevor Sie weiterlesen, wissen Sie, dass es so ist

  • ? in einige Datenbanksachen eintauchen (was bei nagelneuen WP-Entwicklern haarig werden kann)
  • ? Ich werde eine verwenden Ja wirklich spezielles Beispiel, um einige viel größere Lektionen zu unterrichten.

In der Tat ist das Beispiel selbst bedeutungslos? Hier geht es um die Techniken, mit denen wir das hypothetische Problem lösen. Am Ende erfahren Sie, dass es praktisch keine Einschränkung gibt, was Sie mit jeder Information tun können, die in der WordPress-Datenbank gespeichert ist.

Oh, und weil es sich dabei um Homebrew handelt, denke ich, dass jemand da draußen eine andere Art haben wird, dies zu tun. Teilen, schimpfen, lass es in den Kommentaren: P Ich bin ganz Ohr!

Unsere Annahme: Wir haben eine Liste von Kategorie-Slugs (aus einer benutzerdefinierten Meta-Box auf einer Seite gespeichert)..

Unser Problem: Kategorie-Slugs können nicht in query_posts () verwendet werden, aber wenn die einzige Information, die wir haben, der Slug ist, müssen wir einen Weg finden, um daraus etwas zu machen, das wir tatsächlich verwenden können: Kategorie-IDs. Es gibt einige Möglichkeiten, Slugs in IDs umzuwandeln (get_category_by_slug, get_term_by usw.), aber sie sind nicht ganz so flexibel oder mächtig wie die Methode, die ich Ihnen zeige. Werden sie trotzdem arbeiten? Ja, die werden gut funktionieren und wir werden sie am Ende besprechen. Wie gesagt, wir gehen hier für ein paar Minuten von den Spuren? genießen Sie die Fahrt :)

Unser Ziel: Um ein Teil der Kategoriedaten in ein anderes umzuwandeln, indem Sie die Datenbank dazu auffordern, es mit anderen ähnlichen Teilen zu einem Array zu kombinieren, um dieses Array in einen String zu verwandeln, den Sie tatsächlich an anderen Stellen unseres Themes oder Plugins verwenden können.


Das hypothetische Problem: Wie man die Kategorie-ID aus einem Category Slug bezieht


Unser hypothetisches Problem enthält eine benutzerdefinierte Meta-Box, die nur Category Slugs zurückgibt. Unser Problem ist, dass wir sie in IDs konvertieren müssen, bevor wir sie in query_posts () verwenden können..

Stellen Sie sich dies vor: Sie haben ein benutzerdefiniertes Feld mit der Bezeichnung "category_filter". Was man tut, ist eine Liste von Kategorien zu holen, die der Benutzer aus einer benutzerdefinierten Meta-Box ausgewählt hat, und deren Liste zurückgibt Kategorie-Slugs. Großartig? Schnecken Was machen wir damit??

Seit der aktuellen WordPress-Version gibt es keine schnelle und einfache Möglichkeit (zumindest die ich finden konnte), mit der Sie Kategorie-Slugs einfach in Kategorie-IDs konvertieren können. Was ehrlich gesagt scheiße ist, denn diese Art von Währungsumrechnungsart ist bemerkenswert einfach, wenn wir versuchen, dasselbe mit den Postdaten zu tun (z. B. einen Namen in einen Slug, einen Slug in eine ID oder in eine ID umzuwandeln) ID in einen Namen).

Bei Posten müssen Sie nur hochfahren query_posts oder get_posts und es ist ziemlich einfach, alles zu packen, was Sie brauchen. Nicht so sehr bei Kategorien? Aber wie alles in WordPress, wo ein Wille ist, gibt es einen Weg.

Wir wissen, dass die Daten in unserer WordPress-Datenbank vorhanden sind. Solange es also eine Möglichkeit gibt, die eine Dateneinheit (Kategorie-ID) mit der anderen zu verknüpfen (Kategorie-Slug), können wir sie konvertieren? es wird nur ein wenig mehr Mühe kosten. So sehen unsere Daten in der Datenbanktabelle aus:


Zeigt die wp_terms-Tabelle an? Zeigt nur die Beziehung zwischen der Kategorie-ID (term_id) und dem Slug (gezeigt).
Ein Beispiel für die Daten in der aktuellen Tabelle.

Bearbeiten: Wir werden gleich hier in $ wpdb einsteigen, aber wie einige Kommentatoren darauf hingewiesen haben, gibt es hier Abkürzungen? und wenn ich Abkürzungen sage, meine ich, dass es kürzere Wege gibt, eine einzige Kategorie-ID zu erhalten. Für das, was wir letztendlich tun werden, sind diese Wege tatsächlich etwas länger. Aber wie gesagt, es geht darum, ein paar Möglichkeiten zu lernen, Dinge zu tun? also zeige ich beide (plus eine Bonusmethode) am Ende!


Einführung in $ wpdb->

Die Anbindung an die Datenbank ist einer der eher unübersichtlichen Abschnitte des WordPress-Codex, enthält jedoch nur die Informationen, die wir für unsere Konvertierung benötigen (und einen fantastischen neuen Trick lernen, den wir in vielen verschiedenen Situationen anwenden können). . Hier sind die Grundlagen:

Sie können das Objekt verwenden $ wpdb mit jeder Tabelle in der WordPress-Datenbank "sprechen". Wenn Sie jemals an MySQL gearbeitet haben, werden Sie erkennen, wie dies geschieht, da dies alles mit einer Version der ezSQL-Klasse geschieht. Zum Beispiel die Abfrage Mit dieser Funktion können Sie jede SQL-Abfrage in der WordPress-Datenbank ausführen.

 Abfrage ('Abfrage'); ?> // Wo steht "Abfrage" für die SQL-Abfrage, die Sie ausführen möchten

Sie können mehr über $ wpdb-> query auf der Codex-Seite nachlesen. Heute werden wir ein wenig mehr verfeinert und verwenden Folgendes:

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

Aus dem Kodex: Das get_var Funktion gibt eine einzelne Variable aus der Datenbank zurück. Obwohl nur eine Variable zurückgegeben wird, wird das gesamte Ergebnis der Abfrage für eine spätere Verwendung zwischengespeichert?

Perfekt! Was bedeutet dies, dass wir im Wesentlichen alles in die WordPress-Datenbank packen können, solange wir wissen, wo wir es finden können? und wir wissen einfach, wo wir unsere Category ID finden, weil wir bereits den Category Slug kennen. Folge mir immer noch?


Extrahieren einer einzelnen Kategorie-ID aus einem einzelnen Kategorie-Slug

Hier wird es heiß und schwer. In unserem Beispiel, in dem wir die Kategorie Slug kennen, können wir die ID folgendermaßen extrahieren:

 $ cats = get_post_custom_values ​​('category_filter'); // Gibt ein Array von Cat-Slugs aus dem benutzerdefinierten Feld zurück. $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Nimm die Kategorie-ID aus der WPDB mit der Kategorie slug ($ cat).

Dies gibt eine einzige Kategorie-ID zurück (term_id wie es in der DB bekannt ist) und speichern Sie es in unserer $ catid Variable. In einigen Situationen könnten wir fertig sein? Sie könnten einfach sein Echo das $ catid wo immer du wolltest. In unserem Beispiel haben wir jedoch noch einiges zu tun.

Um klar zu sein, der Anfang $ Katzen Variable greift die Kategorie Slugs aus unserem benutzerdefinierten Feld? Sie könnten die Schnecken auch mit anderen Methoden einsetzen? Sie benötigen jedoch eine Möglichkeit, die Slugs (oder einige Daten, die mit unserer ID verknüpft sind) zu greifen..


Mehrere Kategorie-IDs aus mehreren Kategorie-Slugs greifen

Lassen Sie uns jetzt unser kleines Snippet erweitern, indem Sie mehr als eine Kategorie mit einem Quick zulassen für jeden Schleife:

 $ cats = get_post_custom_values ​​('category_filter'); // Gibt ein Array von Cat-Slugs aus dem benutzerdefinierten Feld zurück. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Nimm die cat-id aus der DB mit der Kategorie slug ($ cat). $ acats [] = $ catid; // Verwandle die Liste der IDs in ein ARRAY, $ acats []

Dieser letzte Code ($ acats?) Verwendet ein paar einfache PHP, um jede Kategorie-ID, die wir finden, in einen Teil eines Arrays zu verwandeln. was für Sie nützlich sein könnte. Aber lass uns gehen noch ein anderer Schritt und Konvertieren des Arrays in eine Zeichenfolge (da die meisten Funktionen in WordPress Zeichenfolgen verwenden).


Konvertieren des Arrays in einen durch Kommas getrennten String mit Join ();

Wir kommen jetzt näher! Mit etwas einfacherem PHP konvertieren wir das von uns erstellte Array von Kategorie-IDs in eine Zeichenfolge, die wir in query_posts verwenden können.

 $ cats = get_post_custom_values ​​('category_filter'); // Gibt ein Array von Cat-Slugs aus dem benutzerdefinierten Feld zurück. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Nimm die cat-id aus der DB mit der Kategorie slug ($ cat). $ acats [] = $ catid; // Verwandle die Liste der IDs in ein ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Füge den ARRAY zu einem durch Komma getrennten STRING zur Verwendung in query_posts zusammen // echo $ cat_string; // Kommentar zur Testausgabe entfernen

Beachten Sie die letzte Zeile, in der Sie das "//" entfernen können, um Ihre Ausgabe an diesem Punkt zu testen. Dies sollte aus einer Reihe von Zahlen (den Kategorie-IDs) bestehen: 11, 123, 198, 210?

Sie können hier lesen, wie die PHP-Join-Funktion funktioniert, aber Sie müssen nur wissen, dass wir unser Array von Kategorie-IDs in einen String umgewandelt haben, wobei jede ID durch ein Komma getrennt ist. Das ist praktisch, denn genau das brauchen wir für unseren letzten Schritt?


Alles zusammenstellen mit Query_Posts ();

Lassen Sie uns einen Blick auf die große Enthüllung werfen. Wir haben einen bekannten Wert (unsere Kategorie-Slugs) genommen, sie durch Abfrage der Datenbank in Kategorie-IDs umgewandelt und dann unsere Kategorie-IDs in einem String zusammengefasst, den wir verwenden können query_posts ();. Alles gut? Ok, so sieht das alles aus:

 $ cats = get_post_custom_values ​​('category_filter'); // Gibt ein Array von Cat-Slugs aus dem benutzerdefinierten Feld zurück. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Nimm die cat-id aus der DB mit der Kategorie slug ($ cat). $ acats [] = $ catid; // Verwandle die Liste der IDs in ein ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Füge den ARRAY zu einem durch Komma getrennten STRING zur Verwendung in query_posts zusammen // echo $ cat_string; // Entfernen von Kommentaren zur Testausgabe $ args = array ('cat' => $ cat_string, // Abfrage der Cat-IDs (weil Sie nicht mehrere Namen oder Slugs verwenden können? Crazy WP!)); query_posts ($ args);

Nicht schlecht, richtig? Wir sind bereit zum Handeln - Jetzt können wir das im Basic verwenden Wenn / während post loop, um Beiträge auszuteilen, die sind nur im Besonderen Kategorie IDs, die der Benutzer in den Ankreuzfeldern ausgewählt hat (erinnern Sie sich an das Ankreuzfeld oben?).


Das komplette Snippet

Okay, die große Enthüllung! Wir müssen nur einige zusätzliche Sicherheitsmaßnahmen hinzufügen, um sicherzustellen, dass wir dieses Snippet verwenden / wiederverwenden können. Wir müssen sicherstellen, dass das benutzerdefinierte Feld "category_filtermsgstr "existiert (es besteht immer die Möglichkeit, dass der Benutzer überhaupt keine Kategorien auswählt). Wenn es keine gibt, hat es keinen Sinn, im Kreis herumzulaufen? Also verwenden wir einen einfachen if / then - Wrapper, um nur auszuführen unser Snippet, wenn das benutzerdefinierte Feld vorhanden ist:

 get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat "")); // Nimm die cat-id aus der DB mit der Kategorie slug ($ cat). $ acats [] = $ catid; // Verwandle die Liste der IDs in ein ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Füge den ARRAY zu einem durch Komma getrennten STRING zur Verwendung in query_posts zusammen // echo $ cat_string; // Kommentar zur Testausgabe entfernen endif; // die Situation beenden? Fahren Sie wie gewohnt fort, wenn es keinen Kategoriefilter gibt. ?> $ cat_string, // Abfrage nach den Katzen-IDs (weil Sie nicht mehrere Namen oder Slugs verwenden können? crazy WP!)); query_posts ($ args); ?>

Dieses Snippet setzt voraus, dass Sie ein benutzerdefiniertes Feld mit dem Namen "category_filter"Zu Ihrem Beitrag zugewiesen? Aber Sie können dieses Snippet mit Franken-Code so programmieren, dass Sie so ziemlich alles tun, was Sie wollen. Ok, vielleicht macht es Sie nicht zu einem Sammich? Aber es ist immer noch ein ziemlich geschicktes Snippet.


Ein praktisches Beispiel


Sehen Sie diese Bilder? Jeder ist ein Blogbeitrag, der von unserem benutzerdefinierten query_posts () übernommen wurde. Konfiguration? Siehe auch Kategorie-Slugs sind nicht völlig unbrauchbar! Sehen Sie sich das vollständige Beispiel an.

Zum Beispiel habe ich dieses Snippet verwendet, um die Grundlage für eine benutzerdefinierte, filterbare Portfolio-Seitenvorlage in meinem neuesten SuperSkeleton-WordPress-Design zu bilden. Die "Portfolio-Seitenvorlage" enthält die Liste der Kontrollkästchen für Kategorien, mit denen der Benutzer auswählen kann, welche Kategorien von Portfolio-Posts er auf der Seite anzeigen möchte. Der Workflow ist der gleiche, ich füge nur einige zusätzliche Drehungen hinzu, nachdem wir query_posts () verwendet haben..

  1. Kategorie Schnecken?
  2. Konvertiert in Kategorie-IDs?
  3. Wird in Query_Posts verwendet?
  4. Profitieren!!! Filterbare Portfolio-Seitenvorlage

Sie können dies jedoch für viele verschiedene Zwecke verwenden? In fast jedem Fall, in dem Sie eine Seitenvorlage erstellen müssen, bei der Abfragen für eine bestimmte Kategorie durchgeführt werden, kann dies verwendet werden.


Warum verwenden Sie $ wpdb?

Zwei Gründe. In erster Linie konnte ich die bevorzugten Techniken nicht bekommen get_category_by_slug und get_term_by Um in meinem Fall zu arbeiten, weil sie einfach nicht das zurückgegeben haben, was ich brauchte, um eine Menge von diesem Zeug zu ergattern (sie funktionierten gut, um einzelne Kategorien zu greifen, als ich die Kategorie Slug kannte?) Schnecke?).

Der zweite Grund ist pädagogisch? Diese kleine Problemlösungsaufgabe gibt mir die Gelegenheit, etwas über $ wpdb zu schreiben, eine sehr unterschätzte Technik, wenn versucht wird, sehr spezifische Informationen aus der Datenbank zu manipulieren und zu extrahieren. Aufgrund der Tatsache, dass Sie direkte SQL-Abfragen damit ausführen können, ist es schwierig, etwas zu finden, das es nicht kann.

Oh, und das Miniaturbild für diesen Beitrag ist, dass Will Smith einen Rap-Song singt? Ich hoffe, Sie haben nichts zu offiziell erwartet: P Dies ist ein guter Reinigungsspaß, und niemand sagt, dass dies der einzige Weg ist, um das zu packen, was wir getan haben? Hier sind noch ein paar andere Ideen:


Alternative Methoden ohne $ wpdb

Verwenden von Get_Category_By_Slug ();

Dank an Andrew für das Aufrufen, dass Sie auch eine spezifischere Funktion verwenden können, um einen Category Slug mithilfe von in eine ID zu konvertieren get_category_by_slug ();. Schauen Sie sich die Codex-Seite dafür an und Sie können unten sehen, wie unser Code aussehen würde:

Einfache Version:

 term_id; ?>

Unsere Version (die immer noch lang ist, aber Sie können sehen, wo wir arbeiten get_category_by_slug (); anstatt der $ wpdb-> als unser Datenerfassungswerkzeug:

 term_id; $ acats [] = $ id; // Verwandle die Liste der IDs in ein ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Füge den ARRAY zu einem durch Komma getrennten STRING zur Verwendung in query_posts zusammen // echo $ cat_string; // Kommentar zur Testausgabe entfernen endif; // die Situation beenden? Fahren Sie wie gewohnt fort, wenn es keinen Kategoriefilter gibt. ?> $ cat_string, // Abfrage nach den Katzen-IDs (weil Sie nicht mehrere Namen oder Slugs verwenden können? crazy WP!)); query_posts ($ args); ?>

Eine weitere Methode mit Get_Term_By ();

Schließlich, wie Thomas es in den Kommentaren formuliert hat, ist dies einem "Programmieren gleichwertig, wenn man von Rochester, NY über Wheeling WV nach Boston fährt"? Sie können die folgende Codex-Seite verwenden, um weitere Informationen zu dieser Methode zu erhalten. Es gibt sogar eine integrierte Funktion zum Erstellen unseres Arrays, die uns dabei hilft, einen Schritt zu überspringen:

 $ myCategory = get_term_by ('id', $ postCategories [0] -> cat_ID, 'category');

Wir könnten einfach unsere Schnecke passieren und auf unserem lustigen Weg sein;)


Verpacken

Ja, dies war ein sehr konkretes Beispiel mit einigen ganz bestimmten Annahmen im Vorfeld. Wenn Sie zu diesem Zeitpunkt jedoch noch folgen, sollten Sie ein oder zwei Dinge über Folgendes erfolgreich gelernt haben:

  • Verwendung von $ wpdb zum Ausführen von SQL-Abfragen in der WordPress-Datenbank (in unserem Beispiel wird die Kategorie-ID aus einem Kategorie-Slug übernommen, aber Sie können noch viel mehr tun)
  • So führen Sie eine foreach-Schleife für eine Liste von Kategorien aus und speichern diese in einem Array
  • Konvertieren Sie ein Array von Kategorie-IDs in eine durch Kommas getrennte Zeichenfolge zur Verwendung in query_posts ().

Hecklers Anmerkung: Ja, wenn wir überhaupt mit Kategorie-IDs angefangen hätten, müssten wir uns nie mit diesem langwierigen Prozess beschäftigen? Aber es wäre kein sehr lehrreiches Tutorial, jetzt? ; P Nur die Uhrzeit (und Ihre Kommentare) sagen, ob dies tatsächlich der Fall ist Beste So gehen wir das an, aber hoffentlich wissen Sie jetzt ein wenig mehr über WordPress! Danke fürs Lesen!