Sto sviluppando un tema WordPress usando un motore di template. Voglio che il mio codice sia il più compatibile possibile con la funzionalità core di WP.
Prima un po 'di contesto
Il mio primo problema era trovare un modo per risolvere il modello partendo da una query WP. Ho risolto quello usando una mia biblioteca, Brain \ Hierarchy .
Per quanto riguarda get_template_part()
e altre funzioni che i carichi parziali piace get_header()
, get_footer()
e simili, è stato abbastanza facile da involucro in scrittura a template engine funzionalità parziale.
Il problema
Il mio problema è ora come caricare il modello di commenti.
La funzione WordPress comments_template()
è una funzione di ~ 200 linee che fa molte cose, che voglio fare anche per la massima compatibilità di base.
Tuttavia, non appena chiamo comments_template()
, un file è require
d, è il primo di:
- il file nella costante
COMMENTS_TEMPLATE
, se definito comments.php
nella cartella del tema, se trovato/theme-compat/comments.php
in WP include la cartella come fallback dell'ultima risorsa
In breve, non c'è modo di impedire alla funzione di caricare un file PHP, il che non è desiderabile per me, perché devo renderizzare i miei modelli e non semplicemente usarli require
.
Soluzione attuale
Al momento, sto spedendo un comments.php
file vuoto e sto usando 'comments_template'
un hook di filtro, per sapere quale modello WordPress vuole caricare e utilizzare le funzionalità del mio motore di template per caricare il modello.
Qualcosa come questo:
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 domanda
Funziona, è compatibile con il core, ma ... c'è un modo per farlo funzionare senza dover spedire un vuoto comments.php
?
Perché non mi piace.
comments_template
filtro o laCOMMENTS_TEMPLATE
costante per personalizzare il modello. Il che non è fondamentale, ma, come ho già detto, volevo rimanere il più possibile compatibile con il core.