Estou desenvolvendo um tema WordPress usando um mecanismo de modelo. Quero que meu código seja o mais compatível possível com a funcionalidade principal do WP.
Algum contexto primeiro
Meu primeiro problema foi encontrar uma maneira de resolver o modelo a partir de uma consulta WP. Eu resolvi aquele usando uma biblioteca minha, Brain \ Hierarchy .
Com relação get_template_part()
e outras funções que cargas parciais gosto get_header()
, get_footer()
e semelhantes, que era muito fácil escrever wrapper para a funcionalidade parcial modelo de motor.
O problema
Meu problema agora é como carregar o modelo de comentários.
A função WordPress comments_template()
é uma função de ~ 200 linhas que faz muitas coisas, o que eu quero fazer também para obter a compatibilidade máxima do núcleo.
No entanto, assim que eu chamo comments_template()
, um arquivo é require
d, é o primeiro de:
- o arquivo na constante
COMMENTS_TEMPLATE
, se definido comments.php
na pasta do tema, se encontrado/theme-compat/comments.php
no WP inclui pasta como fallback de último recurso
Em suma, não há como impedir que a função carregue um arquivo PHP, o que não é desejável para mim, porque preciso renderizar meus modelos e não simplesmente usá-lo require
.
Solução atual
No momento, estou enviando um comments.php
arquivo vazio e estou usando o 'comments_template'
gancho de filtro para saber qual modelo o WordPress deseja carregar e usar o recurso do meu mecanismo de modelos para carregar o modelo.
Algo assim:
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 '';
}
A questão
Isso funciona, é compatível com o núcleo, mas ... existe uma maneira de fazê-lo funcionar sem ter que enviar um vazio comments.php
?
Porque eu não gosto disso.
comments_template
filtro ouCOMMENTS_TEMPLATE
constante para personalizar o modelo. O que não é crucial, mas, como eu disse, queria permanecer o máximo possível compatível com o núcleo.