Je développe un thème WordPress à l'aide d'un moteur de modèle. Je veux que mon code soit aussi compatible que possible avec les fonctionnalités de base de WP.
Un peu de contexte d'abord
Mon premier problème a été de trouver un moyen de résoudre le modèle à partir d'une requête WP. J'ai résolu celui-ci en utilisant une de mes bibliothèques, Brain \ Hierarchy .
En ce qui concerne get_template_part()
et d' autres fonctions qui charge comme partials get_header()
, get_footer()
et similaire, il était assez facile à wrapper d'écriture sur le moteur de template fonctionnalité partielle.
Le problème
Mon problème est maintenant de savoir comment charger le modèle de commentaires.
La fonction WordPress comments_template()
est une fonction de ~ 200 lignes qui fait beaucoup de choses, ce que je veux aussi faire pour une compatibilité maximale avec le cœur.
Cependant, dès que j'appelle comments_template()
, un fichier est require
d, c'est le premier de:
- le fichier dans la constante
COMMENTS_TEMPLATE
, si définie comments.php
dans le dossier du thème, s'il est trouvé/theme-compat/comments.php
dans WP inclut le dossier en dernier recours
En bref, il n'y a aucun moyen d'empêcher la fonction de charger un fichier PHP, ce qui n'est pas souhaitable pour moi, car j'ai besoin de rendre mes modèles et pas simplement d'utiliser require
.
Solution actuelle
En ce moment, j'expédie un comments.php
fichier vide et j'utilise un 'comments_template'
crochet de filtre, pour savoir quel modèle WordPress veut charger, et utiliser la fonctionnalité de mon moteur de modèle pour charger le modèle.
Quelque chose comme ça:
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 question
Cela fonctionne, est compatible avec le noyau, mais ... existe-t-il un moyen de le faire fonctionner sans avoir à expédier un vide comments.php
?
Parce que je n'aime pas ça.
comments_template
filtre ou d'uneCOMMENTS_TEMPLATE
constante pour personnaliser le modèle. Ce qui n'est pas essentiel, mais, comme je l'ai dit, je voulais rester le plus possible compatible avec le core.