Ich entwickle ein Plugin, mit dem ich benutzerdefinierte Seiten aktivieren möchte. In meinem Fall würde eine benutzerdefinierte Seite ein Formular wie ein Kontaktformular enthalten (nicht wörtlich). Wenn der Benutzer dieses Formular ausfüllt und sendet, sollte es den nächsten Schritt geben, der weitere Informationen erfordert. Nehmen wir an, die erste Seite mit Formular befindet sich bei www.domain.tld/custom-page/
und nach erfolgreicher Formularübermittlung sollte der Benutzer weitergeleitet werden www.domain.tld/custom-page/second
. Vorlage mit HTML-Elementen und PHP-Code sollte ebenfalls benutzerdefiniert sein.
Ich denke, dass ein Teil des Problems mit benutzerdefinierten URL-Umschreibungen erreicht werden kann, aber die anderen Teile sind mir derzeit unbekannt. Ich weiß wirklich nicht, wo ich anfangen soll zu suchen und wie das Problem richtig benannt ist. Jede Hilfe wäre sehr dankbar.
Antworten:
Wenn Sie eine Frontend-Seite besuchen, fragt WordPress die Datenbank ab. Wenn Ihre Seite nicht in der Datenbank vorhanden ist, wird diese Abfrage nicht benötigt und ist nur eine Verschwendung von Ressourcen.
Glücklicherweise bietet WordPress eine Möglichkeit, Frontend-Anfragen auf eine benutzerdefinierte Weise zu bearbeiten. Dies geschieht dank des
'do_parse_request'
Filters.Wenn Sie
false
auf diesen Haken zurückkehren, können Sie WordPress daran hindern, Anforderungen zu verarbeiten, und dies auf Ihre eigene Weise tun.Trotzdem möchte ich eine Möglichkeit vorstellen, ein einfaches OOP-Plugin zu erstellen, das mit virtuellen Seiten auf einfach zu verwendende (und wiederverwendende) Weise umgehen kann.
Was wir brauchen
Schnittstellen
Schreiben Sie vor dem Erstellen von Klassen die Schnittstellen für die drei oben aufgeführten Objekte.
Zuerst das Seiteninterface (Datei
PageInterface.php
):Die meisten Methoden sind nur Trickser und Trickser, ohne dass es einer Erklärung bedarf. Die letzte Methode sollte verwendet werden, um ein
WP_Post
Objekt von einer virtuellen Seite abzurufen.Die Controller-Schnittstelle (Datei
ControllerInterface.php
):und das Template Loader Interface (Datei
TemplateLoaderInterface.php
):phpDoc-Kommentare sollten für diese Schnittstellen ziemlich klar sein.
Der Plan
Nachdem wir nun Schnittstellen haben, und bevor wir konkrete Klassen schreiben, wollen wir unseren Workflow überprüfen:
Controller
Klasse (implementierendControllerInterface
) und injizieren (wahrscheinlich in einem Konstruktor) eine Instanz derTemplateLoader
Klasse (implementierendTemplateLoaderInterface
)init
Haken rufen wir dieControllerInterface::init()
Methode zum Einrichten der Steuerung und den Haken zu feuern , dass Code Verbraucher virtuelle Seiten hinzufügen verwenden.ControllerInterface::dispatch()
wir auf und überprüfen dort alle hinzugefügten virtuellen Seiten. Wenn eine davon dieselbe URL der aktuellen Anfrage hat, zeigen Sie sie an. Nachdem Sie alle globalen Kernvariablen ($wp_query
,$post
) gesetzt haben. Wir werden auchTemplateLoader
Klasse verwenden, um die richtige Vorlage zu laden.Während dieses Workflow werden wir einige Kernhaken auslösen, wie
wp
,template_redirect
,template_include
... machen das Plugin flexibler und die Kompatibilität mit Kern und anderen Plugins oder zumindest mit einer guten Anzahl von ihnen.Abgesehen von den vorherigen Arbeitsabläufen müssen wir auch:
the_permalink
, damit er bei Bedarf die richtige URL der virtuellen Seite zurückgibt.Konkrete Klassen
Jetzt können wir unsere konkreten Klassen codieren. Beginnen wir mit der Seitenklasse (Datei
Page.php
):Nichts weiter als die Implementierung der Schnittstelle.
Nun die Controller-Klasse (Datei
Controller.php
):Im Wesentlichen erstellt die Klasse ein
SplObjectStorage
Objekt, in dem alle hinzugefügten Seitenobjekte gespeichert werden.Ein
'do_parse_request'
Die Controller-Klasse durchläuft diesen Speicher, um auf einer der hinzugefügten Seiten eine Übereinstimmung für die aktuelle URL zu finden.Wenn es gefunden wird, macht die Klasse genau das, was wir geplant haben: Triggern Sie einige Hooks, richten Sie Variablen ein und laden Sie die Vorlage über die Klassenerweiterung
TemplateLoaderInterface
. Danach einfachexit()
.Schreiben wir also die letzte Klasse:
Auf der virtuellen Seite gespeicherte Vorlagen werden mit den Standardeinstellungen in einem Array zusammengeführt,
page.php
undindex.php
vor dem Laden der Vorlage'template_redirect'
wird die Flexibilität erhöht und die Kompatibilität verbessert.Danach durchläuft die gefundene Vorlage den benutzerdefinierten Filter
'virtual_page_template'
und den Kernfilter.'template_include'
Dies dient wiederum der Flexibilität und Kompatibilität.Zuletzt wird die Vorlagendatei geladen.
Haupt-Plugin-Datei
An diesem Punkt müssen wir die Datei mit Plugin-Headern schreiben und sie verwenden, um die Hooks hinzuzufügen, die unseren Workflow ermöglichen:
In der realen Datei werden wir wahrscheinlich weitere Header wie Plugin- und Autorenlinks, Beschreibung, Lizenz usw. hinzufügen.
Plugin Gist
Ok, wir sind mit unserem Plugin fertig. Den gesamten Code finden Sie in einer Übersicht hier .
Seiten hinzufügen
Das Plugin ist fertig und funktioniert, aber wir haben keine Seiten hinzugefügt.
Dies kann innerhalb des Plugins selbst, innerhalb des Themes
functions.php
, in einem anderen Plugin usw. erfolgen.Das Hinzufügen von Seiten ist nur eine Frage von:
Und so weiter. Sie können alle benötigten Seiten hinzufügen. Denken Sie jedoch daran, relative URLs für die Seiten zu verwenden.
In der Vorlagendatei können Sie alle WordPress-Vorlagen-Tags verwenden und alle benötigten PHP- und HTML-Dateien schreiben.
Das globale Post-Objekt ist mit Daten gefüllt, die von unserer virtuellen Seite stammen. Auf die virtuelle Seite selbst kann über eine
$wp_query->virtual_page
Variable zugegriffen werden .Das Abrufen der URL für eine virtuelle Seite ist so einfach wie das Übergeben
home_url()
des Pfads, der zum Erstellen der Seite verwendet wurde:Beachten Sie, dass in der Hauptschleife in der geladenen Vorlage der
the_permalink()
richtige Permalink zur virtuellen Seite zurückgegeben wird.Hinweise zu Stilen / Skripten für virtuelle Seiten
Wahrscheinlich ist es beim Hinzufügen virtueller Seiten auch wünschenswert, benutzerdefinierte Stile / Skripte in die Warteschlange zu stellen und dann nur
wp_head()
in benutzerdefinierten Vorlagen zu verwenden.Das ist sehr einfach, da virtuelle Seiten anhand von
$wp_query->virtual_page
Variablen leicht erkannt werden und virtuelle Seiten anhand ihrer URLs voneinander unterschieden werden können.Nur ein Beispiel:
Hinweise zum OP
Das Übergeben von Daten von einer Seite zu einer anderen bezieht sich nicht auf diese virtuellen Seiten, sondern ist nur eine allgemeine Aufgabe.
Wenn Sie jedoch ein Formular auf der ersten Seite haben und Daten von dort an die zweite Seite übergeben möchten, verwenden Sie einfach die URL der zweiten Seite im Formular
action
.ZB in der ersten Seitenvorlagendatei können Sie:
und dann in der zweiten Seitenvorlagendatei:
quelle
wordpress/virtual-page
und die abgeschnittene URL der Seite gleich sindvirtual-page
.Ich habe einmal eine hier beschriebene Lösung verwendet: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
Tatsächlich erweitere ich die Lösung, als ich sie verwendete, so, dass ich mehr als eine Seite pro Seite registrieren kann (der Rest eines Codes ist +/- ähnlich der Lösung, die ich aus einem obigen Absatz verknüpfe).
Die Lösung erfordert, dass Sie nette Permalinks haben, ...
quelle
content
Wenn Sie die gefälschte Seite registrieren, wird sie im Array im Hauptteil der Seite angezeigt. Sie kann sowohl HTML als auch einfachen Text oder sogar einen Shortcode enthalten.