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.
Un poco de contexto primero
Mi primer problema fue encontrar una manera de resolver la plantilla a partir de una consulta WP. Lo resolví utilizando una biblioteca mía, Brain \ Hierarchy .
Con respecto a get_template_part()
y otras funciones que cargan parciales como get_header()
, get_footer()
y similares, fue bastante fácil escribir la envoltura en la funcionalidad parcial del motor de plantilla.
El problema
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 Quiero hacer lo mismo para la máxima compatibilidad del núcleo.
Sin embargo, tan pronto como llamo a 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 de temas, si se encuentra -
/theme-compat/comments.php
en WP incluye la carpeta como último recurso de recurso
En resumen, no hay forma de evitar que la función cargue un archivo PHP, lo cual no es conveniente para mí, porque necesito renderizar mis plantillas y no simplemente usar require
.
Solución actual
En este momento, estoy enviando un archivo comments.php
vacío y estoy usando 'comments_template'
gancho de filtro, para saber qué plantilla WordPress quiere cargar, y usar 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 comments.php
vacío?
Porque no me gusta.