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 required, c'est le premier de:
- le fichier dans la constante
COMMENTS_TEMPLATE, si définie comments.phpdans le dossier du thème, s'il est trouvé/theme-compat/comments.phpdans 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.phpfichier 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_templatefiltre ou d'uneCOMMENTS_TEMPLATEconstante 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.