Я разрабатываю тему WordPress с использованием шаблонизатора. Я хочу, чтобы мой код был максимально совместим с основными функциями WP.
Сначала какой-то контекст
Моя первая проблема состояла в том, чтобы найти способ разрешить шаблон, начиная с запроса WP. Я решил эту проблему, используя мою библиотеку Brain \ Hierarchy .
Что касается get_template_part()
и других функций , которые загружают обертонам нравятся get_header()
, get_footer()
и похоже, что это было довольно легко писать обертку для частичной функциональности шаблона двигателя.
Проблема
Моя проблема сейчас, как загрузить шаблон комментариев.
Функция WordPress comments_template()
- это функция ~ 200 строк, которая делает много вещей, которые я хочу сделать также для максимальной совместимости ядра.
Однако, как только я позвоню comments_template()
, файл require
d, это первый из:
- файл в константе
COMMENTS_TEMPLATE
, если он определен comments.php
в папке темы, если найден/theme-compat/comments.php
в WP включена папка как последнее средство откат
Короче говоря, нет способа помешать функции загружать файл PHP, что мне нежелательно, потому что мне нужно рендерить свои шаблоны, а не просто использовать require
.
Текущее решение
В данный момент я отправляю пустой comments.php
файл и использую 'comments_template'
фильтр-ловушку, чтобы узнать, какой шаблон WordPress хочет загрузить, и использую функцию из моего механизма шаблонов для загрузки шаблона.
Что-то вроде этого:
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 '';
}
Вопрос
Это работает, совместимо ли ядро, но ... есть ли способ заставить его работать, не отправляя пустой comments.php
?
Потому что мне это не нравится.
comments_template
фильтр илиCOMMENTS_TEMPLATE
константу для настройки шаблона. Что не является ключевым, но, как я уже сказал, я хотел быть максимально совместимым с ядром.