WordPress как на ладони
wordpress jino

Как дополнить места, где искать шаблоны страниц?

По умолчанию WordPress ищет шаблоны страниц в корне темы. Можно ли ему указать, чтобы он заглядывал дополнительно, ещё, к примеру, в папку tpl?

Для чего это нужно? К примеру, когда делаешь модуль для темы, то хочется всё лежало аккуратно всё в одной папке, в том числе шаблоны произвольных таксономий, архивы произвольных типов записи.

С помощью фильтра, посаженного на хук template_include это сделать легко с перечисленным, но вот как поступить со страницей? Даже если мы её создадим автоматом, человек сможет ей изменить slug или вообще передумать и сделать другую. И тут то указывание шаблона выручает (и поиск по нему).

Но как его подгружать через тот же template_include заведомо не зная id или slug? Только по шаблону, который лежит в отдельной папке и WP его пока не знает!

2
campusboy1950 год назад
  • 1
    Kama4696

    В общем разобрался. По порядку распишу, чтобы можно было сделать под себя и как нужно и вообще не только для страниц.

    Для начала рекомендую прочитать о том как работает структура шаблонов.

    В результате все упирается в функцию get_query_template() и хук из нее (type)_template_hierarchy.

    Вместо (type) в хуке указываем page, потому что нам нужны страницы. Вместо page там может быть: index, 404, category и любое значение параметра $type из get_query_template().

    Внутри хука добавляем в начало массива $templates еще один элемент - свой файл. Этот массив содержит название файлов которые нужно искать, см. locate_template() $templates потом туда передается...

    В результате твой код будет выглядеть так:

    ## Добавим папку где еще искать шаблон постоянной страницы
    add_filter('page_template_hierarchy', function( $templates ){
    	// добавим поиск в папке 'tpl' в теме. Файла с именем 'page-(page_name).php'
    	array_unshift( $templates, 'tpl/'. $templates[0] ); // 'tpl/page-(page_name).php'
    
    	//array_unshift( $templates, 'tpl/'. $templates[1] ); // 'tpl/page-(page_id).php'
    
    	return $templates;
    });

    После его установки в functions.php, WP будет в первую очередь проверять файл шаблона вида 'page-(page_name).php' в папке tpl. Если его нет, то дальше все работает как и прежде...

    Что мы сделали в коде, чтобы было понятнее. Переменная $templates выглядела так:

    array(
    	0 => page-pagename.php,
    	1 => page-25.php,
    	2 => page.php,
    )

    мы добавили элемент в начало и переменная $templates стала выглядеть так:

    array(
    	0 => tpl/page-pagename.php,
    	1 => page-pagename.php,
    	2 => page-25.php,
    	3 => page.php,
    )

    Точно также можно сделать для любого типа страницы, нужно только немного разобраться...

    Добавление произвольных фалов шаблонов на страницу редактирования записи

    Если нужна полная динамика, то через хук theme_(post_type)_templates добавляешь файл шаблона, в выбор шаблона на странице редактирования записи, чтобы пользователь мог выбрать нужный файл:

    add_filter('theme_page_templates', function( $templates ){ 
    	$templates['tpl/template_file.php'] = 'Мой шаблон'; 
    	return $templates; 
    });

    А дальше WP уже сам подставит выбранный шаблон страницы в иерархию шаблонов и код который выше уже не нужен...

    campusboy год назад

    Спасибо! Последнее решение идеальное для моего случая!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.