Как загружаются шаблоны страниц:
Согласно стандартной иерархии шаблонов 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
автоматически искать шаблоны, - это использовать этот фильтр и вводить правильные имена файлов относительно этого подкаталога в массив иерархии шаблонов страниц.
Примечание: исходный фильтр-ловушка - это динамический фильтр-фильтр, определенный как{$type}_template_hierarchy
, который находится вwp-includes/template.php
файле. Так что, когда$type
естьpage
, фильтр-хук становитсяpage_template_hierarchy
.
Теперь для нашей цели мы вставим 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
файле вашей активной темы :
// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );
function wpse312159_page_template_add_subdir( $templates = array() ) {
// Generally this doesn't happen, unless another plugin / theme does modifications
// of their own. In that case, it's better not to mess with it again with our code.
if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
return $templates;
$page_tpl_idx = 0;
if( $templates[0] === get_page_template_slug() ) {
// if there is custom template, then our page-{slug}.php template is at the next index
$page_tpl_idx = 1;
}
$page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
// As of WordPress 4.7, the URL decoded page-{$slug}.php template file is included in the
// page template hierarchy just before the URL encoded page-{$slug}.php template file.
// Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
// always be different from page-{id}.php, even if you try to input the {id} as {slug}.
// So this check will work for WordPress versions prior to 4.7 as well.
if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
$page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
}
array_splice( $templates, $page_tpl_idx, 0, $page_tpls );
return $templates;
}
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );
Пример плагина:
Если вы хотите следовать одной и той же организации файла шаблона в нескольких темах, то лучше оставить эту функцию отдельной от вашей темы. В этом случае вместо изменения темыfunctions.php
файла с помощью приведенного выше примера КОДА вам потребуется создать простой плагин с тем же примером кода.
Сохраните следующий код с именем файла, например, page-slug-template-subdir.php
в вашем plugins
каталоге WordPress :
<?php
/*
Plugin Name: WPSE Page Template page-slug.php to Sub Directory
Plugin URI: https://wordpress.stackexchange.com/a/312159/110572
Description: Page Template with page-{slug}.php to a Sub Directory
Version: 1.0.0
Author: Fayaz Ahmed
Author URI: https://www.fayazmiraz.com/
*/
// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );
function wpse312159_page_template_add_subdir( $templates = array() ) {
// Generally this doesn't happen, unless another plugin / theme does modifications
// of their own. In that case, it's better not to mess with it again with our code.
if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
return $templates;
$page_tpl_idx = 0;
if( $templates[0] === get_page_template_slug() ) {
// if there is custom template, then our page-{slug}.php template is at the next index
$page_tpl_idx = 1;
}
$page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
uded in the
// page template hierarchy just before the URL encoded page-{$slug}.php template file.
// Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
// always be different from page-{id}.php, even if you try to input the {id} as {slug}.
// So this check will work for WordPress versions prior to 4.7 as well.
if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
$page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
}
array_splice( $templates, $page_tpl_idx, 0, $page_tpls );
return $templates;
}
// the original filter hook is {$type}_template_hierarchy,
// wihch is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );
Применение:
Используя любой из приведенных выше кодов, WordPress автоматически распознает page-{slug}.php
файлы шаблона в page-templates
каталоге вашей темы.
Скажем, например, у вас есть about
страница. Итак, если у него нет custom page template
набора из редактора, тогда WordPress будет искать THEME/page-templates/page-about.php
файл шаблона, а если его нет, тогда WordPress будет искать THEME/page-about.php
файл шаблона и т. Д. (То есть иерархию шаблонов страницы по умолчанию).