Eine Alternative zum WordPress template_redirect Hook
Der Großteil der Arbeit, die ich derzeit mache, konzentriert sich auf benutzerdefinierte Plugins oder Dienstprogramme, die auf WordPress aufbauen.
Wenn Sie sich vorstellen müssten, wie viele der Projekte, die ich baue, zusammengefügt werden, würden Sie WordPress (und alles, was dazu gehört) als Grundlage überprüfen, und dann hat der Code eine Ebene, die mit WordPress kommuniziert und die kommunizieren kann mit APIs von Drittanbietern.
Dabei gibt es jedoch oft eine Front-End-Komponente, die erfordert, dass ich Informationen in Vorlagen rendere. Obwohl das Erstellen von Vorlagen für WordPress nicht von Natur aus schwierig ist (obwohl ich mir wünschte, wir hätten ein bisschen mehr als Vorlagen-Tags – wie z Vorlagen, die wir mit Plugins gebündelt haben.
Eine der ersten Fragen, die oft mit dieser Aussage aufgeworfen wird, ist jedoch
Warum sollten Sie benutzerdefinierte Vorlagen in ein Plugin aufnehmen?
Und ich verstehe es auf einigen Ebenen.
- Das Beibehalten von Vorlagen in einem Plugin verwischt die Grenzen zwischen Themen und Plugins ein wenig, insbesondere wenn Sie Themen für die Präsentation und Plugins für die Geschäftslogik verlassen.
- Benutzer aufzufordern, Designdateien von einem Speicherort zu einem anderen zu kopieren, ist eine schlechte Benutzererfahrung.
Aber es gibt ein paar Widerlegungen oder vielleicht geradezu Ausnahmen zu den oben genannten Fällen.
WordPress template_redirect-Hook
Bevor ich über den Hook template_redirect von WordPress spreche, möchte ich ein wenig auf die oben genannten Punkte eingehen.
1 Vorlagen in Plugins
Wenn Sie ein benutzerdefiniertes Plugin erstellen, das sowohl mit WordPress als auch mit einer Drittanbieter-API interagiert oder eine Art Kombination aus Repositorys, Factorys, Modellen und Ansichten verwendet, müssen Sie diese Informationen auf der Vorderseite anzeigen -end, und es muss themenunabhängig sein.
Das bedeutet nicht, dass jemand die Elemente auf der Seite nicht formatieren oder die Vorlage in seine Arbeit aufnehmen kann, aber es bedeutet, dass das Plugin eine grundlegende Informationsebene bereitstellen sollte, die dem Benutzer angezeigt wird.
2 Benutzer aufzufordern, Dateien zu kopieren, ist schlecht
Erinnern Sie sich an den Slogan, den Apple einst und oft propagierte: „ Es funktioniert einfach? „Auch wenn es vielleicht nicht mehr so viel ist wie früher (wenn überhaupt), gefällt mir die Idee, „nur Arbeit“ für den Benutzer zu haben, und das ist etwas, das ich in meinem Streben anstrebe Arbeit.
Wenn es also darum geht, benutzerdefinierte Vorlagen oder Ansichten für Plugins zu erstellen, möchte ich den Benutzer nicht bitten, Dateien kopieren zu müssen. Ich möchte nur, dass sie:
- Installieren Sie das Plugin,
- klicken Sie auf Aktivieren.
Und das ist es. Der Rest sollte entweder selbstverständlich oder gut dokumentiert sein.
Zurück zum Haken
Okay, nehmen wir für einen Moment an, dass wir ein Plugin erstellt haben, das Plugin mehrere grundlegende Vorlagen (oder Ansichten, je nach verwendetem Jargon) enthält und dass die Vorlagen in das Stammverzeichnis des aktiven Themenverzeichnisses geschrieben werden müssen.
Sie können den Hook template_redirect verwenden (und viele beliebte Plugins tun das). Sie können hier mehr darüber lesen, aber das Wesentliche ist wie folgt:
Dieser Action-Hook wird ausgeführt, kurz bevor WordPress bestimmt, welche Vorlagenseite geladen werden soll. Es ist ein guter Haken, wenn Sie eine Umleitung mit voller Kenntnis des abgefragten Inhalts durchführen müssen.
Und um es klar zu sagen, ich rate nicht von der Verwendung dieses Hakens ab. Ich biete nur eine Alternative an. Und das ist das (da es wie folgt funktionieren sollte):
- Plugin aktivieren,
- Suchen Sie das aktive Thema,
- Wenn sie noch nicht vorhanden sind, kopieren Sie die Vorlagendateien aus dem Plugin in das Stammverzeichnis des aktiven Designs
Der letzte Schritt ist kritisch, denn wenn die Vorlagendateien vorhanden sind, ist es wichtig, sie nicht zu überschreiben, weil der Benutzer seine Anpassungen geschrieben haben könnte.
Nachdem dies gesagt wurde, können Sie dies in einer einzigen Funktion tun (komplett mit Kommentaren, um zu zeigen, was Sie verwenden).
<?php
add_action('plugins_loaded', __NAMESPACE__. 'acmeCopyTemplates');
/**
* Copies the template files from the `assets/templates` directory to the root directory
* of the currently active theme (if they do not already exist).
*/
function acmeCopyTemplates()
{
// Find the currently active theme.
$activeThemeDir = get_template_directory();
/**
* Read all of the template files from assets/templates into an array but
* exclude the '.' and the '..' from the array.
*/
$templates = array_slice(scandir(dirname(__FILE__).'/assets/templates'), 2);
/**
* Now copy all of these files to the active theme directory.
* If the file already exists, then don't do it.
*/
foreach ($templates as $template) {
if (!file_exists($destination = trailingslashit($activeThemeDir).$template)) {
continue;
}
$source = dirname(__FILE__).'/assets/templates/'.$template;
$destination = trailingslashit($activeThemeDir).$template;
copy($source, $destination);
}
}
Beachten Sie, dass dies mehrere PHP-Funktionen verwendet. Nämlich:
All das ist meiner Meinung nach praktisch und wichtig zu wissen, unabhängig davon, in welcher Art Sie es verwenden.
Unterstützen Hosts dies?
Einige Gastgeber tun dies. Ich weiß mit Sicherheit, dass Hosts wie WPEngine dies nicht tun, und dies ist auch keine Kritik am Host. Einige tun dies aus Sicherheitsgründen; andere erlauben es, aber das bedeutet nicht, dass sie weniger sicher sind – es bedeutet nur, dass sie ihre Infrastruktur anders eingerichtet haben.
Letztendlich zeigt dies, dass es andere Möglichkeiten gibt, Benutzern Vorlagen zur Verfügung zu stellen, wenn ein Plugin verwendet wird, aber dies ist nicht die einzige Möglichkeit und funktioniert möglicherweise nicht immer.
Optionen zu haben ist jedoch gut, besonders wenn Sie eine bestimmte Architektur in Ihrem Plugin einer anderen vorziehen.