Я хочу переместить файлы шаблонов страниц, например, page-{slug}.php
в подкаталог в моей теме, чтобы WordPress распознавал их автоматически. Если шаблоны страниц указанной формы не существуют в подкаталоге, WordPress должен вернуться к правилам загрузки шаблонов по умолчанию. Как я могу этого достичь?
Примечание-1: Этот вопрос и соответствующие ответы являются более общими для шаблонов страниц, и эта ссылка упоминает template-parts/page
, что не одно и то же.
Примечание-2: у меня есть несколько page-{slug}.php
похожих файлов шаблонов страниц, поэтому я хочу переместить их в подкаталог для более аккуратной организации файлов.
theme-development
themes
page-template
directory
manifestor
источник
источник
Ответы:
Как загружаются шаблоны страниц:
Согласно стандартной иерархии шаблонов WordPress ,
page
запрос загружает шаблон на основе приоритета и именования, как указано ниже:Custom Page Template
: если определено в редакторе страниц.page-{slug}.php
page-{url-encoded-slug}.php
: только для многобайтовых символов.page-{id}.php
page.php
singular.php
index.php
Среди них,
singular.php
иindex.php
это не на самом деле шаблонов страниц.singular.php
является резервным шаблоном для любых отдельных типов записей иindex.php
является конечным резервным шаблоном для всего, что должен загрузить шаблон WordPress. Итак, первые пять - это шаблоны страниц.Как добавить файлы шаблона из подкаталога в иерархии:
Основная функция WordPress
get_page_template()
генерирует необходимыйpage
массив иерархии шаблонов, и непосредственно перед тем, как решить, какой именно файл шаблона следует загрузить из иерархии, WordPress запускаетpage_template_hierarchy
ловушку фильтра. Поэтому лучший способ добавить подкаталог, в котором WordPress будетpage-{slug}.php
автоматически искать шаблоны, - это использовать этот фильтр и вводить правильные имена файлов относительно этого подкаталога в массив иерархии шаблонов страниц.Теперь для нашей цели мы вставим
sub-directory/page-{slug}.php
имя файла непосредственно перед тем, какpage-{slug}.php
в массив иерархии шаблонов передается функции обратного вызова hooks. Таким образом, WordPress загрузитsub-directory/page-{slug}.php
файл, если он существует, в противном случае он будет следовать обычной иерархии загрузки шаблонов страниц. Конечно, для обеспечения согласованности мы будем отдаватьCustom Page Template
более высокий приоритет по сравнению с нашимsub-directory/page-{slug}.php
файлом. Таким образом, измененная иерархия шаблонов страниц станет:Custom Page Template
: если определено в редакторе страниц.sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: только для многобайтовых символов.page-{slug}.php
page-{url-encoded-slug}.php
: только для многобайтовых символов.page-{id}.php
page.php
Образец
functions.php
кода:Если вы планируете сделать это изменение только для одной темы, вы можете использовать следующий КОД в
functions.php
файле вашей активной темы :Пример плагина:
Если вы хотите следовать одной и той же организации файла шаблона в нескольких темах, то лучше оставить эту функцию отдельной от вашей темы. В этом случае вместо изменения темы
functions.php
файла с помощью приведенного выше примера КОДА вам потребуется создать простой плагин с тем же примером кода.Сохраните следующий код с именем файла, например,
page-slug-template-subdir.php
в вашемplugins
каталоге WordPress :Применение:
источник