Ich entwickle ein WordPress-Theme mit einer Template-Engine. Ich möchte, dass mein Code so gut wie möglich mit der WP-Kernfunktionalität kompatibel ist.
Ein Kontext zuerst
Mein erstes Problem bestand darin, einen Weg zu finden, um die Vorlage ausgehend von einer WP-Abfrage aufzulösen . Ich habe dieses Problem mit einer meiner Bibliotheken, Brain \ Hierarchy, gelöst .
In Bezug auf get_template_part()und andere Funktionen, die Teilfunktionen wie und ähnliche laden get_header(), get_footer()war es ziemlich einfach, Wrapper in Teilfunktionen der Template-Engine zu schreiben.
Das Thema
Mein Problem ist jetzt, wie man eine Kommentarvorlage lädt.
Die WordPress-Funktion comments_template()ist eine ~ 200-Zeilen-Funktion, die viele Dinge erledigt, die ich auch für maximale Kernkompatibilität tun möchte.
Sobald ich jedoch anrufe comments_template(), ist eine Datei required, es ist die erste von:
- die Datei in der Konstante
COMMENTS_TEMPLATE, falls definiert comments.phpim Themenordner, falls gefunden/theme-compat/comments.phpin WP enthält Ordner als letzten Ausweg Fallback
Kurz gesagt, es gibt keine Möglichkeit, die Funktion zum Laden einer PHP-Datei zu verhindern, was für mich nicht wünschenswert ist, da ich meine Vorlagen rendern und nicht einfach verwenden muss require.
Aktuelle Lösung
Im Moment versende ich eine leere comments.phpDatei und verwende 'comments_template'Filter Hook, um zu wissen, welche Vorlage WordPress laden möchte, und verwende die Funktion meiner Vorlagen-Engine, um die Vorlage zu laden.
Etwas wie das:
function engineCommentsTemplate($myEngine) {
$toLoad = null; // this will hold the template path
$tmplGetter = function($tmpl) use(&$toLoad) {
$toLoad = $tmpl;
return $tmpl;
};
// late priority to allow filters attached here to do their job
add_filter('comments_template', $tmplGetter, PHP_INT_MAX);
// this will load an empty comments.php file I ship in my theme
comments_template();
remove_filter('comments_template', $tmplGetter, PHP_INT_MAX);
if (is_file($toLoad) && is_readable($toLoad)) {
return $myEngine->render($toLoad);
}
return '';
}
Die Frage
Dies funktioniert, ist kernkompatibel, aber ... gibt es eine Möglichkeit, es zum Laufen zu bringen, ohne ein leeres Schiff versenden zu müssen comments.php?
Weil ich es nicht mag.
comments_templateFilter oderCOMMENTS_TEMPLATEKonstanten zum Anpassen der Vorlage zu verwenden. Das ist nicht entscheidend, aber wie gesagt, ich wollte so weit wie möglich mit dem Kern kompatibel bleiben.