Tworzę motyw WordPress za pomocą silnika szablonów. Chcę, aby mój kod był jak najbardziej zgodny z podstawową funkcjonalnością WP.
Najpierw jakiś kontekst
Moim pierwszym problemem było znalezienie sposobu rozwiązania szablonu, zaczynając od zapytania WP. Rozwiązałem ten przy użyciu mojej biblioteki, Brain \ Hierarchy .
Jeśli chodzi o get_template_part()
inne funkcje ładujące częściowe get_header()
, takie jak get_footer()
i podobne, dość łatwo było napisać opakowanie do częściowej funkcjonalności silnika szablonu.
Problem
Mój problem polega teraz na tym, jak załadować szablon komentarzy.
Funkcja WordPress comments_template()
to ~ 200 linii funkcja, która robi wiele rzeczy, które chcę zrobić również dla maksymalnej kompatybilności rdzenia.
Jednak jak tylko zadzwonię comments_template()
, plik ma postać require
d, jest to pierwszy z następujących elementów:
- plik w stałej
COMMENTS_TEMPLATE
, jeśli jest zdefiniowany comments.php
w folderze motywu, jeśli został znaleziony/theme-compat/comments.php
w WP zawiera folder jako rezerwowy w ostateczności
Krótko mówiąc, nie ma sposobu, aby funkcja nie załadowała pliku PHP, co nie jest dla mnie pożądane, ponieważ muszę renderować moje szablony, a nie po prostu ich używać require
.
Aktualne rozwiązanie
W tej chwili wysyłam pusty comments.php
plik i korzystam z 'comments_template'
haka filtru, aby wiedzieć, który szablon WordPress chce załadować, i użyć funkcji z mojego silnika szablonów, aby załadować szablon.
Coś takiego:
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 '';
}
Pytanie
Działa, jest kompatybilny z rdzeniem, ale ... czy istnieje sposób, aby działał bez konieczności wysyłania pustego comments.php
?
Ponieważ mi się nie podoba.
comments_template
filtru lubCOMMENTS_TEMPLATE
stałej w celu dostosowania szablonu. Co nie jest kluczowe, ale, jak powiedziałem, chciałem zachować jak największą zgodność z rdzeniem.