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 é required, é o primeiro de:
- o arquivo na constante
COMMENTS_TEMPLATE, se definido comments.phpna pasta do tema, se encontrado/theme-compat/comments.phpno 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.phparquivo 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_templatefiltro ouCOMMENTS_TEMPLATEconstante 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.