Как дополнить места, где искать шаблоны страниц?
По умолчанию WordPress ищет шаблоны страниц в корне темы. Можно ли ему указать, чтобы он заглядывал дополнительно, ещё, к примеру, в папку tpl?
Для чего это нужно? К примеру, когда делаешь модуль для темы, то хочется всё лежало аккуратно всё в одной папке, в том числе шаблоны произвольных таксономий, архивы произвольных типов записи.
С помощью фильтра, посаженного на хук template_include это сделать легко с перечисленным, но вот как поступить со страницей? Даже если мы её создадим автоматом, человек сможет ей изменить slug или вообще передумать и сделать другую. И тут то указание шаблона выручает (и поиск по нему).
Но как его подгружать через тот же template_include, заведомо не зная id или slug? Только по шаблону, который лежит в отдельной папке и WP его пока не знает!
В общем разобрался. По порядку распишу, чтобы можно было сделать под себя и как нужно и вообще не только для страниц.
Для начала рекомендую прочитать о том как работает структура шаблонов.
В результате все упирается в функцию get_query_template() и хук из нее (type)_template_hierarchy.
Вместо (type) в хуке указываем page, потому что нам нужны страницы. Вместо page там может быть: index, 404, category и любое значение параметра $type из get_query_template().
Внутри хука добавляем в начало массива $templates еще один элемент - свой файл. Этот массив содержит название файлов которые нужно искать, см. locate_template() $templates потом туда передается...
В результате твой код будет выглядеть так:
После его установки в functions.php, WP будет в первую очередь проверять файл шаблона вида 'page-(page_name).php' в папке tpl. Если его нет, то дальше все работает как и прежде...
Что мы сделали в коде, чтобы было понятнее. Переменная $templates выглядела так:
мы добавили элемент в начало и переменная $templates стала выглядеть так:
Точно также можно сделать для любого типа страницы, нужно только немного разобраться...
Добавление произвольных фалов шаблонов на страницу редактирования записи
Если нужна полная динамика, то через хук theme_(post_type)_templates добавляешь файл шаблона, в выбор шаблона на странице редактирования записи, чтобы пользователь мог выбрать нужный файл:
А дальше WP уже сам подставит выбранный шаблон страницы в иерархию шаблонов и код который выше уже не нужен...
Спасибо! Последнее решение идеальное для моего случая!
Дополнил немного код. Будет полезен в случае если файлы шаблонов WordPress -> page необходимо хранить в любой нужно директории внутри текущей темы. Вставляем в functions.php
$templates_dir - путь к папке шаблонов в текущей теме.
$templates_files - загоняем в массив файлы в нужной нам директории.
locate_template - стандартная функция WP определяющая абсолютный путь к текущей теме.
Имя файлов в итоге будет именем шаблона соответственно на странице редактирования страницы в админке WP.
НИШТЯК!