WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

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

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

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

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

3
campusboy
7.3 года назад 4750
  • 4
    Kama9616

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

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

    В результате все упирается в функцию 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 7.3 года назад

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

    Комментировать
  • 4
    hdm20

    Дополнил немного код. Будет полезен в случае если файлы шаблонов WordPress -> page необходимо хранить в любой нужно директории внутри текущей темы. Вставляем в functions.php

    add_filter( 'theme_page_templates', function( $templates ){
    	$templates_dir = 'templates/page/';
    	$templates_files = scandir(locate_template($templates_dir));
    	foreach ( $templates_files as $file ) {
    		if ( $file == '.' || $file == '..') continue;
    		$name = explode('.', $file);
    		$templates[$templates_dir.$file] = $name[0];
    	}
    	return $templates; 
    });

    $templates_dir - путь к папке шаблонов в текущей теме.
    $templates_files - загоняем в массив файлы в нужной нам директории.
    locate_template - стандартная функция WP определяющая абсолютный путь к текущей теме.

    Имя файлов в итоге будет именем шаблона соответственно на странице редактирования страницы в админке WP.

    Osmoday 5.5 лет назад

    НИШТЯК!

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