Wie funktioniert das Routing in WordPress?

13

Wie funktioniert das Core-WP-Routing? Es fällt mir schwer zu verstehen ... In MVC sieht Ihre URL aus wie "mycontroller / myaction", das "MyController-> myaction ()" zugeordnet ist.

In Drupal ist es index.php? Q = mycustomerpath / hello, das jeder Funktion zugeordnet werden kann, die Sie mögen, und das einen Inhalt zurückgibt, der in Ihrem Design-Layout "thematisiert" ist.

Aber in wp habe ich keine Ahnung, wie die Dinge gemacht werden ... es ist? P = 1 dann? Product = 1 ... Ich habe nach einer Dokumentation des Routing-Ablaufs gesucht, kann aber keine finden (google gibt nur Artikel zu custom zurück) Routen) .. Ich möchte zuerst die Grundlagen des Core-Routings verstehen ..

Ja Mann
quelle
Wenn ich den Code eingrabe, sehe ich bei jeder Anfrage, die es aufruft, query_posts? Warum in aller Welt muss es jedes Mal Posts abfragen? Gibt es nicht Fälle, in denen Sie keine Beiträge anzeigen möchten?
Yeahman
1
Inhalte werden als Beitrag in WP gespeichert. Also, wenn Sie Inhalte zeigen müssen, müssen Sie es abfragen
Sisir
Darf ich vorschlagen, dass Sie über "die Schleife" lesen, das ist das Konzept, das Sie verstehen müssen, um zu wissen, wie WordPress funktioniert. Essential "the loop" zeigt ein Array von Posts an, das das Ergebnis von query_posts ist. Bei URL-Anfragen, die nicht von Administratoren stammen, werden in WP nur Posts angezeigt, und es ist eine benutzerdefinierte Programmierung erforderlich, um etwas anderes als einen Post anzuzeigen. Admin-URL-Anfragen sind unterschiedlich und diese verwenden nicht "the loop" und zeigen Dinge an, die keine Beiträge sind.
ok, aber dieser Ansatz ist ein bisschen seltsam und nicht sehr flexibel tbh
yeahman
Angenommen, ich möchte ein Kontaktformular anzeigen. Muss ich mein HTML in einen Seiteninhaltstyp einfügen? Ich versuche immer noch herauszufinden, wo ich die Logik für die Formularübermittlung platzieren kann ... (im Thema page.php? Sehr hässlicher Ansatz)
yeahman

Antworten:

20

In WordPress werden URLs nicht Routen zugeordnet. Sie werden Datenbankabfragen zugeordnet.

Wenn Sie WordPress im "Standard" -Modus für Permalinks verwenden, haben Sie eine Reihe von Variablen in der Haupt-URL-Abfrage, wie z. B.? P = 1 oder? Page = 234 und so weiter. Es gibt auch? S = Suche und viele andere.

Wenn Sie die "hübschen" Permalinks verwenden, wird ein großer Regelsatz mit der Bezeichnung "Umschreiberegeln" erstellt, der verschiedene URL-Muster direkt auf denselben Satz von URL-Parametern abbildet. Eine URL wie / 2014/04/12 / example würde also? Year = 2014 & month = 04 & day = 12 & postname = example oder ähnlich lauten. Das Folgende gilt also auch für diese, nachdem diese Zuordnung vorgenommen wurde.

Diese Variablen steuern im Wesentlichen die Hauptinstanz der WP_Query-Klasse. Die WP_Query-Klasse enthält alle Informationen, mit denen die Datenbankabfrage erstellt wird, um die "Posts" aus der Datenbank abzurufen. Die verschiedenen übergebenen Parameter steuern, welche Art von Abfrage erstellt und welche Daten abgerufen werden.

Sehen Sie, alles, was von WordPress angezeigt werden kann, ist im Wesentlichen ein "Beitrag". Ein Blog ist eine Reihe von Beiträgen in umgekehrter zeitlicher Reihenfolge. Eine "Seite" ist ein statischer Beitrag mit einem definierten Namen. Ein "benutzerdefinierter Beitragstyp" ist genau das, wonach es klingt, ein "Beitrag" mit einem benutzerdefinierten Typ, den Sie definieren. Alle Hauptabfragen, um etwas in WordPress anzuzeigen, erhalten eine Untermenge von Beiträgen aus der Tabelle wp_posts.

Die WP_Query macht das. Die Parameter aus der URL werden direkt in diese Hauptabfrage gesendet und dort verwendet.

Das Thema bestimmt dann, welche Vorlage verwendet werden soll, basierend darauf, mit was die Abfrage zurückkommt. Wenn Sie / category / example angefordert haben, wird dies zu? Category_name = example, was bedeutet, dass das $ wp_query-> query_vars-Hauptarray diese Informationen abruft und die WP_Query die letzten X Posts für die Kategorie "example" und diese abruft setzt das Flag is_category auf true.

Danach wird der Template-Loader ausgeführt, um festzustellen, ob is_category () true zurückgibt, und um die Kategorieschablone auszuwählen, wird nach category-example.php gesucht und entsprechend dem Template auf category.php usw. zurückgegriffen Hierarchie.

Die Frage, ob Sie die Funktionsweise von URLs ändern möchten, ist also ganz einfach: Möchten Sie die URLs ändern oder auf welche Art und Weise sie zugeordnet werden? Da URLs nicht Funktionen zugeordnet sind, sind sie Parametern zugeordnet, die die Abfrage steuern. Wenn Sie möchten, dass die URL diese Hauptabfrage anpasst, ist dies ein etwas anderer Vorgang als wenn Sie möchten, dass eine spezielle URL einen ganz anderen speziellen Code ausführt.

Und um Ihre spezielle Frage in den Kommentaren zu beantworten: "Gibt es nicht Fälle, in denen Sie eigentlich keine Beiträge anzeigen möchten?" Nein, da ist kein. Alles ist ein Beitrag. Alle Inhalte werden in Beiträgen gespeichert. Wenn Sie Inhalte an einem anderen Ort speichern und anders sein möchten, können Sie dies tun, aber es ist schwieriger, da dies ehrlich gesagt normalerweise nicht erforderlich ist. Wenn Sie speziellen Inhalt haben, erstellen Sie einen benutzerdefinierten Beitragstyp, speichern Sie Ihren Inhalt als Beitrag mit diesem Typ und ordnen Sie ihm ein URL-Muster zu. Einfach.

Otto
quelle
Ich verstehe, dass alles in einem Beitrag dargestellt werden sollte (über benutzerdefinierte Beitragstypen usw.), der den benutzerdefinierten Typen in Drupal 6 sehr ähnlich ist. Hat dies jedoch Auswirkungen auf die Leistung, wenn jeder einzelne Inhalt der Website in einer einzelnen Beitragstabelle gespeichert wird? Drupal 7 löste das Problem durch die Einführung eines Entitätstyps, sodass Sie keinen benutzerdefinierten Typ erstellen und alles in der Knotentabelle speichern müssen, sondern in Ihrer eigenen Entitätstabelle, die weiterhin das Drupal-Framework nutzen kann. Ich hoffe, dass WordPress in Zukunft einen solchen Ansatz einführt. Danke für die ausführliche Erklärung.
Yeahman
Ich denke, wenn ich eine URL zu einer meiner eigenen Funktionen / Themen zuordnen möchte, würde wp Router helfen?
Yeahman
Das Hinzufügen eines vollständigen Routingsystems ist normalerweise nicht erforderlich. Es gibt einfachere Wege. Die Basis von WordPress ist die Anzeige von benutzergenerierten Inhalten, die alle in der Posts-Tabelle gespeichert sind. Wenn Sie Inhalte anzeigen möchten, die nicht vom Benutzer erstellt wurden, tun Sie dies in der Regel im Design oder in einem Plugin. Es gibt Hunderte (Tausende) Aktions-Hooks, Filter und andere Möglichkeiten, mit denen Code verschiedene Teile des Prozesses beim Generieren der Seite überschreibt. Und mit Dingen wie Shortcodes ist das Einfügen von benutzerdefiniertem HTML in den Inhalt relativ einfach.
Otto
Wie füge ich einem von mir erstellten Beitragstyp benutzerdefiniertes HTML / PHP hinzu? ohne die single.php des themas zu ändern oder eine single-mycustompost.php zu erstellen (kein sehr portabler
ansatz
6
Nach mehr als einem Jahr mit WordPress bin ich immer noch nicht davon überzeugt. Das Framework ist nicht elegant und ziemlich hässlich. Es funktioniert als einfacher Blog, aber wenn Sie andere Arten von Websites entwickeln möchten. es ist eine Art, WordPress zu hacken, um etwas zu tun, für das es nicht gedacht war.
Yeahman