Estoy desarrollando un tema de WordPress usando un motor de plantillas. Quiero que mi código sea lo más compatible posible con la funcionalidad principal de WP.
Algún contexto primero
Mi primer problema fue encontrar una manera de resolver la plantilla a partir de una consulta WP. Lo resolví usando una biblioteca mía, Brain \ Hierarchy .
En cuanto get_template_part()
y otras funciones que las cargas parciales gustaría get_header()
, get_footer()
y similares, que era bastante fácil de envoltura de escritura a la funcionalidad parcial motor de plantillas.
La cuestión
Mi problema ahora es cómo cargar la plantilla de comentarios.
La función de WordPress comments_template()
es una función de ~ 200 líneas que hace muchas cosas, que también quiero hacer para obtener la máxima compatibilidad con el núcleo.
Sin embargo, tan pronto como llamo comments_template()
, un archivo es require
d, es el primero de:
- el archivo en la constante
COMMENTS_TEMPLATE
, si está definido comments.php
en la carpeta del tema, si se encuentra/theme-compat/comments.php
en WP incluye carpeta como último recurso alternativo
En resumen, no hay forma de evitar que la función cargue un archivo PHP, lo cual no es deseable para mí, porque necesito renderizar mis plantillas y no simplemente usarlas require
.
Solución actual
En este momento, estoy enviando un comments.php
archivo vacío y estoy usando el 'comments_template'
enlace de filtro, para saber qué plantilla quiere cargar WordPress, y uso la función de mi motor de plantillas para cargar la plantilla.
Algo como esto:
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 '';
}
La pregunta
Esto funciona, es compatible con el núcleo, pero ... ¿hay alguna manera de hacerlo funcionar sin tener que enviar un vacío comments.php
?
Porque no me gusta
comments_template
filtro oCOMMENTS_TEMPLATE
constante para personalizar la plantilla. Lo cual no es fundamental, pero, como dije, quería mantener la mayor compatibilidad posible con el núcleo.