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ć required, jest to pierwszy z następujących elementów:
- plik w stałej
COMMENTS_TEMPLATE, jeśli jest zdefiniowany comments.phpw folderze motywu, jeśli został znaleziony/theme-compat/comments.phpw 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.phpplik 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_templatefiltru lubCOMMENTS_TEMPLATEstałej w celu dostosowania szablonu. Co nie jest kluczowe, ale, jak powiedziałem, chciałem zachować jak największą zgodność z rdzeniem.