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 require
d, es ist die erste von:
- die Datei in der Konstante
COMMENTS_TEMPLATE
, falls definiert comments.php
im Themenordner, falls gefunden/theme-compat/comments.php
in 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.php
Datei 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_template
Filter oderCOMMENTS_TEMPLATE
Konstanten 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.