WordPress Шаблонна Йерархия: Пълното Техническо Ръководство
WordPress's Template Hierarchy е детерминираната система за разрешаване, която WordPress използва за избор на PHP шаблонен файл, който рендира даден заявен URL адрес. Когато посетител зареди URL адрес на вашия сайт, WordPress оценява контекста на заявката — тип публикация, таксономия, slug, ID и др. — след което преминава надолу по приоритизиран списък с имена на файлове-кандидати, докато намери съвпадение в директорията на активната тема. Ако не съществува специфичен шаблон, системата се връща към index.php.
Разбирането на тази система на дълбоко ниво не е по избор за сериозна разработка с WordPress. Тя е основата на всяко персонализирано оформление, всяко заместване на тема и всяка оптимизация на производителността, свързана с кеширане на шаблони. Независимо дали управлявате публикация с много съдържание, WooCommerce магазин или headless WordPress конфигурация, йерархията управлява кой PHP код се изпълнява при всяко зареждане на страница.
Какво всъщност представлява Template Hierarchy
В основата си Template Hierarchy е верига за търсене, вградена в ядрото на WordPress (wp-includes/class-wp-query.php и wp-includes/template.php). Когато WordPress приключи с разбора на заявката и попълването на глобалния обект $wp_query, той вътрешно извиква еквиваленти на get_template_part() за разрешаване на правилния шаблон. Разрешаването не е произволно — то е строг, наредени списък с имена на файлове, проверявани спрямо основната директория на вашата тема.
Ключовото архитектурно прозрение, което повечето уроци пропускат: WordPress не сканира директорията на вашата тема. Той изгражда приоритизиран масив от имена на файлове-кандидати въз основа на query variables, след което проверява за всеки файл с locate_template(). Това разграничение е важно, когато отстранявате грешки с липсващи шаблони или изграждате програматични генератори на теми.
Веригата за резервни варианти винаги завършва с index.php. Този файл е единственият шаблонен файл, който WordPress изисква всяка тема да включва, съгласно стандартите за разработка на теми.
Основни шаблонни файлове, които всяка тема трябва да разбира
| Шаблонен файл | Активира се когато | Резервен вариант |
|---|---|---|
front-page.php | Статична начална страница е зададена в Settings > Reading | home.php |
home.php | Индексна страница на блог публикации | index.php |
single-{post-type}.php | Единична публикация от специфичен custom post type | single.php |
single.php | Всяка единична публикация (стандартен тип публикация) | singular.php |
singular.php | Всяка единична публикация или страница (общ catch-all) | index.php |
page-{slug}.php | Специфична страница по slug | page-{ID}.php |
page-{ID}.php | Специфична страница по database ID | page.php |
page.php | Всяка статична страница | singular.php |
category-{slug}.php | Архив на категория по slug | category-{ID}.php |
category-{ID}.php | Архив на категория по term ID | category.php |
category.php | Всеки архив на категория | archive.php |
tag-{slug}.php | Архив на таг по slug | tag-{ID}.php |
tag.php | Всеки архив на таг | archive.php |
taxonomy-{tax}-{term}.php | Персонализирана таксономия, специфичен термин | taxonomy-{tax}.php |
taxonomy-{tax}.php | Персонализирана таксономия, всеки термин | taxonomy.php |
taxonomy.php | Всеки архив на персонализирана таксономия | archive.php |
author-{nicename}.php | Архив на автор по user nicename | author-{ID}.php |
author-{ID}.php | Архив на автор по user ID | author.php |
author.php | Всеки архив на автор | archive.php |
archive-{post-type}.php | Архив на custom post type | archive.php |
archive.php | Всеки архив (по дата, автор, таксономия) | index.php |
date.php | Архив по дата | archive.php |
search.php | Страница с резултати от търсене | index.php |
404.php | Не е намерено съответстващо съдържание | index.php |
attachment.php | Страница на единично прикачване | single.php |
embed.php | oEmbed рамка за публикация | index.php |
index.php | Универсален резервен вариант | — |
Обърнете внимание на записа singular.php — това е шаблон, който много разработчици напълно пренебрегват. Въведен в WordPress 4.3, той се намира между single.php/page.php и index.php в йерархията, действайки като унифициран catch-all за всяко единично изглеждане на съдържание. Ако вашата тема включва singular.php, той ще улови случаите, при които нито single.php, нито page.php съществуват.
Пълният ред на разрешаване на шаблони по тип страница
Единични блог публикации
Когато посетител заявява стандартна публикация (post_type = 'post'), WordPress проверява в точно този ред:
single.phpsingular.phpindex.php
single-post-{slug}.php (WordPress 4.4+, напр. single-post-hello-world.php)
single-post.phpВариантът, базиран на slug на стъпка 1, рядко се документира, но е изключително полезен за даване на единична водеща публикация напълно уникално оформление, без да се засягат други шаблони.
Custom Post Types
За custom post type, регистриран като portfolio:
single-portfolio-{slug}.phpsingle-portfolio.phpsingle.phpsingular.phpindex.php
За неговия архив (изисква 'has_archive' => true в register_post_type()):
archive-portfolio.phparchive.phpindex.php
Честа грешка: регистриране на custom post type с 'has_archive' => false (по подразбиране) и след това недоумение защо archive-portfolio.php никога не се зарежда. В такъв случай архивният URL просто връща 404.
Статични страници
- Шаблонен файл, зададен чрез Page Attributes meta box (персонализиран шаблон на страница)
page-{slug}.phppage-{ID}.phppage.phpsingular.phpindex.php
Персонализираните шаблони на страници са PHP файлове в директорията на вашата тема, които включват коментар в заглавката на файла:
<?php
/**
* Template Name: Full Width Layout
* Template Post Type: page
*/Декларацията Template Post Type (WordPress 4.7+) ограничава кои типове публикации могат да използват този шаблон от редактора. Без нея шаблонът се появява в падащото меню Page Attributes само за страници.
Архиви на категории
category-{slug}.phpcategory-{ID}.phpcategory.phparchive.phpindex.php
Архиви на персонализирани таксономии
За таксономия, регистрирана като genre с term slug thriller:
taxonomy-genre-thriller.phptaxonomy-genre.phptaxonomy.phparchive.phpindex.php
Архиви на автори
author-{user_nicename}.phpauthor-{user_ID}.phpauthor.phparchive.phpindex.php
Началната страница (критичен граничен случай)
Това е най-неразбраната част от йерархията. WordPress прави разлика между два сценария за начална страница:
Сценарий А — Индекс на блог публикации като начална страница (Settings > Reading: „Your latest posts”):
front-page.phphome.phpindex.php
Сценарий Б — Статична страница като начална страница (Settings > Reading: „A static page”):
front-page.php
page.php (ако не съществува front-page.php)
index.phpКритичният нюанс: front-page.php има приоритет в двата сценария. Ако front-page.php съществува в темата ви, той винаги рендира началната страница, независимо от настройките в Reading. Това изненадва много разработчици, които създават front-page.php за статична начална страница, но забравят, че той ще замести и блог индекса, ако по-късно сменят настройката.
Резултати от търсене и 404
Резултати от търсене:
search.phpindex.php
Страници за грешка 404:
404.phpindex.php
Добре изработеният 404.php е актив за конверсии, а не второстепенен елемент. Той трябва да включва форма за търсене, връзки към популярно съдържание и ясна навигация — всичко, което изисква разбиране на системата от шаблони за правилно изпълнение.
Как WordPress разрешава шаблоните вътрешно
Разбирането на вътрешната механика помага при отстраняване на грешки или разширяване на системата. Процесът на разрешаване в wp-includes/template.php работи по следния начин:
// Simplified representation of WordPress template resolution
function get_query_template( $type, $templates = array() ) {
$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
if ( empty( $templates ) ) {
$templates = array( "{$type}.php" );
}
// Fires before template resolution — allows plugins/themes to modify the list
$templates = apply_filters( "_{$type}_template_hierarchy", $templates );
$template = locate_template( $templates );
// Fires after template is located — allows final override
$template = apply_filters( "{$type}_template", $template, $type, $templates );
return $template;
}Два filter hook-а са от критично значение тук:
_{$type}_template_hierarchy — активира се преди търсенето на файла, позволявайки ви да инжектирате допълнителни кандидати в масива
{$type}_template — активира се след намирането на файла, позволявайки ви да замените напълно разрешения път до шаблона
Тези hook-ове са начинът, по който плъгини за page builder, multisite мрежи и WooCommerce заместват шаблони, без да засягат файловете на темата.
Програматично заместване на Template Hierarchy
Инжектиране на персонализиран път до шаблон
add_filter( 'single_template_hierarchy', function( $templates ) {
// Prepend a plugin-directory template before theme templates are checked
if ( is_singular( 'portfolio' ) ) {
array_unshift( $templates, plugin_dir_path( __FILE__ ) . 'templates/single-portfolio.php' );
}
return $templates;
} );
Заместване на шаблон след разрешаване
add_filter( 'template_include', function( $template ) {
if ( is_singular( 'portfolio' ) && current_user_can( 'edit_posts' ) ) {
// Load a debug template for editors
$debug_template = get_stylesheet_directory() . '/debug/single-portfolio-debug.php';
if ( file_exists( $debug_template ) ) {
return $debug_template;
}
}
return $template;
} );
Филтърът template_include е последният hook преди WordPress да зареди шаблонния файл. Той получава напълно разрешения път и трябва да върне валиден път до файл.
Части от шаблони и функцията get_template_part()
Частите от шаблони са многократно използвани PHP фрагменти, заредени чрез get_template_part(). Те следват своя собствена мини-йерархия:
// Loads content-video.php if it exists, falls back to content.php
get_template_part( 'template-parts/content', 'video' );
WordPress 5.5 добави трети параметър за предаване на данни към части от шаблони:
get_template_part( 'template-parts/card', 'product', array(
'post_id' => get_the_ID(),
'show_price' => true,
) );
Вътре в частта от шаблона извлечете тези данни с:
$args = wp_parse_args( $args, array(
'post_id' => 0,
'show_price' => false,
) );
Това елиминира необходимостта от използване на глобални променливи за предаване на данни между шаблони — значително подобрение за поддръжката и тестването.
Child теми и системата за заместване на шаблони
Child темите разширяват йерархията, като добавят директорията на child темата в началото на пътя за търсене на шаблони. Когато locate_template() се изпълнява, той проверява:
Директория на child темата (get_stylesheet_directory())
Директория на parent темата (get_template_directory())
Това означава, че можете да замените всеки шаблон на parent темата, като създадете файл с идентично име в child темата. Не е необходимо да копирате целия файл — само частите, които искате да промените — но WordPress зарежда файла като цялостна единица, така че трябва да включите целия необходим markup.
Честа грешка с child теми: Копиране на functions.php от parent темата в child темата с очакване, че ще замести функциите на parent темата. За разлика от другите шаблонни файлове, functions.php в child темата се зарежда в допълнение към functions.php на parent темата, а не вместо него. И двата файла се изпълняват.
За създаване на минимална структура на child тема:
my-child-theme/
├── style.css (required — contains theme header comment)
├── functions.php (optional — enqueue parent styles here)
└── single-post.php (overrides parent's single-post.php)
Заглавката style.css трябва да декларира parent темата:
/*
Theme Name: My Child Theme
Template: parent-theme-directory-name
*/
Отстраняване на грешки — кой шаблон е активен
Метод 1: Плъгинът Query Monitor
Плъгинът Query Monitor (безплатен, WordPress.org) показва разрешения шаблонен файл и пълната йерархия от кандидати в панела на admin toolbar. Това е най-надеждният инструмент за отстраняване на грешки и добавя пренебрежимо малко натоварване.
Метод 2: Hook-ът template_include
add_filter( 'template_include', function( $template ) {
if ( current_user_can( 'manage_options' ) ) {
echo '<!-- Template: ' . esc_html( str_replace( ABSPATH, '', $template ) ) . ' -->';
}
return $template;
} );
Това извежда пътя до шаблона като HTML коментар, видим само за администратори. Премахнете го преди внедряване в production среда.
Метод 3: WP_DEBUG и логване
На сървър за разработка активирайте debug логването в wp-config.php:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
След това добавете временно логване вътре в template_include:
add_filter( 'template_include', function( $template ) {
error_log( 'Resolved template: ' . $template );
return $template;
} );
В среда с VPS Хостинг с root достъп можете да следите debug лога в реално време:
tail -f /var/www/html/wp-content/debug.log
Този подход е значително по-надежден от разчитането на инструменти за отстраняване на грешки в браузъра при отстраняване на проблеми с разрешаването на шаблони на live или staging сървър.
WooCommerce и системата за заместване на шаблони
WooCommerce разполага със собствена йерархия на шаблони, която се надгражда върху нативната система на WordPress. Шаблоните на WooCommerce се намират в wp-content/plugins/woocommerce/templates/ и се зареждат чрез собствената му функция wc_get_template(), която проверява за заместващи файлове в:
wp-content/themes/your-theme/woocommerce/wp-content/themes/your-child-theme/woocommerce/За да замените шаблона на единичен продукт на WooCommerce, копирайте woocommerce/templates/single-product.php в your-theme/woocommerce/single-product.php. Никога не редактирайте шаблонните файлове на плъгина директно — те се презаписват при всяка актуализация на плъгина.
WooCommerce също се закача към action hook-овете woocommerce_template_single_*, което ви дава детайлен контрол върху отделни секции (цена, табове, бутон за добавяне в количката) без заместване на цели шаблонни файлове. Това е предпочитаният подход за незначителни промени.
Block теми и Template Hierarchy при Full Site Editing
WordPress 5.9 въведе Full Site Editing (FSE) с block теми, което променя начина, по който Template Hierarchy работи на практика. Block темите съхраняват шаблони като HTML файлове в директория templates/, а не като PHP файлове:
my-block-theme/
├── templates/
│ ├── index.html
│ ├── single.html
│ ├── page.html
│ ├── archive.html
│ └── 404.html
├── parts/
│ ├── header.html
│ └── footer.html
└── theme.jsonЛогиката на разрешаване следва същите правила на йерархията, но WordPress сега проверява и базата данни за потребителски персонализирани шаблони, запазени чрез Site Editor. Редът на търсене става:
- Потребителски запазен шаблон в базата данни (тип публикация
wp_template) - HTML файл в директория
templates/на темата - HTML файл в директория
templates/на parent темата - Вградените резервни шаблони на WordPress
Класическите PHP теми и block темите могат да съществуват едновременно в WordPress инсталация, но не можете да смесвате PHP шаблони и HTML block шаблони в рамките на една тема. Ако темата ви има директория templates/ и валиден theme.json, WordPress я третира като block тема.
За екипи, изпълняващи натоварвания, критични за производителността, на Dedicated сървъри, разбирането на това разграничение е от съществено значение при оценка на рамки за теми — block темите прехвърлят рендирането на шаблони към block parser-а, който има различни характеристики на кеширане в сравнение с изпълнението на PHP шаблони.
Влияние на Template Hierarchy върху производителността
Всяко разрешаване на шаблон включва проверки на файловата система чрез locate_template(). На сайт с голям трафик това може да добави измеримо натоварване, ако не е кеширано. Ключови оптимизации:
Object кеширане: Използвайте постоянен object кеш (Redis или Memcached) за кеширане на резултатите от WP_Query и намаляване на броя на заявките към базата данни, участващи в избора на шаблон.
OPcache: Уверете се, че PHP OPcache е активиран и правилно конфигуриран. Тъй като шаблоните са PHP файлове, OPcache ги компилира до байткод при първото зареждане и обслужва последващите заявки от паметта. На правилно конфигуриран VPS с cPanel, OPcache обикновено е активиран по подразбиране, но може да изисква настройка на opcache.memory_consumption и opcache.max_accelerated_files за големи теми с много шаблонни файлове.
Избягвайте ненужни шаблонни файлове: Всеки шаблонен файл в директорията на вашата тема е кандидат, който locate_template() трябва да провери. Теми с стотици шаблонни файлове (характерно за раздути търговски теми) увеличават I/O на файловата система при всяка некеширана заявка. Одитирайте темата си и премахнете неизползваните шаблони.
Кеширане на цели страници: Инструменти като WP Rocket, W3 Total Cache или кеширане на ниво сървър (Nginx FastCGI cache, Varnish) заобикалят напълно изпълнението на PHP шаблони за анонимни потребители. Разрешаването на йерархията на шаблони се изпълнява само при пропуск в кеша.
Практически модели на персонализиране
Модел 1: Оформление, специфично за категория, без плъгин
Създайте category-news.php в директорията на вашата тема. WordPress автоматично го използва за архива на категорията „news”. Без плъгин, без filter hook — само файл с правилното име.
<?php
/**
* Template for the "news" category archive.
* Inherits from: category.php → archive.php → index.php
*/
get_header();
?>
<main class="news-archive">
<h1><?php single_cat_title(); ?></h1>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'template-parts/card', 'news' ); ?>
<?php endwhile; endif; ?>
<?php the_posts_pagination(); ?>
</main>
<?php get_footer(); ?>Модел 2: Оформление по автор за избрани сътрудници
// author-jane-smith.php — loads only for the author with nicename "jane-smith"
get_header();
?>
<div class="featured-author-layout">
<?php get_template_part( 'template-parts/author', 'featured' ); ?>
<!-- Custom bio section, social links, etc. -->
</div>
<?php get_footer(); ?>Модел 3: Условна логика вътре в index.php
Ако изграждате минимална тема и искате да избегнете множество шаблонни файлове, можете да използвате conditional tags вътре в index.php:
<?php get_header(); ?>
<?php if ( is_front_page() && is_home() ) : ?>
<?php get_template_part( 'template-parts/home', 'blog-index' ); ?>
<?php elseif ( is_front_page() ) : ?>
<?php get_template_part( 'template-parts/home', 'static' ); ?>
<?php elseif ( is_single() ) : ?>
<?php get_template_part( 'template-parts/content', get_post_type() ); ?>
<?php elseif ( is_archive() ) : ?>
<?php get_template_part( 'template-parts/archive', 'default' ); ?>
<?php else : ?>
<?php get_template_part( 'template-parts/content', 'none' ); ?>
<?php endif; ?>
<?php get_footer(); ?>Този модел се използва от теми като Twenty Twenty-One и е напълно валиден. Компромисът е, че единственият голям index.php става по-труден за поддръжка с нарастването на сложността.
Multisite и Template Hierarchy
В WordPress Multisite мрежа всеки сайт в мрежата може да използва различна активна тема. Template Hierarchy работи идентично за всеки сайт, но мрежово активираните плъгини могат да използват филтрите template_include или _{$type}_template_hierarchy за инжектиране на споделени шаблони в всички сайтове, без дублиране на файлове на темата.
Честият multisite модел е директория с „мрежови шаблони” извън web root-а, която се реферира чрез filter hook-ове на ниво плъгин. Това позволява на централен екип по дизайн да публикува актуализации на шаблони за всички сайтове едновременно — значително оперативно предимство за агенции, управляващи десетки клиентски сайтове в единична среда с Споделен уеб хостинг или VPS.
SSL, сигурност и права на достъп до шаблонни файлове
Шаблонните файлове са PHP и трябва да се третират като изпълним код. Неправилните права на достъп до файлове са честа точка за атака. На Linux сървър шаблонните файлове на темата трябва да са собственост на потребителя на уеб сървъра (обикновено www-data или nginx) и да са зададени с режим 644:
find /var/www/html/wp-content/themes/your-theme -type f -name "*.php" -exec chmod 644 {} ;
find /var/www/html/wp-content/themes/your-theme -type d -exec chmod 755 {} ;Никога не задавайте PHP файлове с 777. Ако шаблонен файл изисква право на запис (необичайно и като цяло нежелателно), използвайте 664 с правилна групова собственост.
Съчетаването на вашата WordPress инсталация с валиден SSL сертификат гарантира, че съдържанието, рендирано от шаблони — включително динамично генерирани страници с чувствителни потребителски данни — винаги се предава по HTTPS. Това е задължително за всеки сайт, използващ форми за контакт, потребителски акаунти или електронна търговия.
Справочник за Template Hierarchy: Визуален поток
Request URL
|
v
WordPress Query Resolution (WP_Query)
|
+-- Is it the front page?
| front-page.php → home.php → index.php
|
+-- Is it a single post?
| single-{type}-{slug}.php → single-{type}.php → single.php → singular.php → index.php
|
+-- Is it a static page?
| [custom template] → page-{slug}.php → page-{ID}.php → page.php → singular.php → index.php
|
+-- Is it a category archive?
| category-{slug}.php → category-{ID}.php → category.php → archive.php → index.php
|
+-- Is it a custom taxonomy?
| taxonomy-{tax}-{term}.php → taxonomy-{tax}.php → taxonomy.php → archive.php → index.php
|
+-- Is it an author archive?
| author-{nicename}.php → author-{ID}.php → author.php → archive.php → index.php
|
+-- Is it a date archive?
| date.php → archive.php → index.php
|
+-- Is it search results?
| search.php → index.php
|
+-- Is it a 404?
404.php → index.phpМатрица за решения: Кога да използвате кой подход за персонализиране
| Сценарий | Препоръчан подход | Избягвайте |
|---|---|---|
| Заместване на конкретна категория | Създайте category-{slug}.php в темата | Директна промяна на archive.php |
| Заместване на конкретна страница | Създайте page-{slug}.php или използвайте заглавка на персонализиран шаблон | Редактиране на page.php |
| Промяна на WooCommerce шаблон | Копирайте в директория theme/woocommerce/ | Редактиране на файлове на плъгина |
| Промяна на шаблон на parent тема | Създайте идентичен файл в child темата | Редактиране на файловете на parent темата |
| Прилагане на логика към множество типове страници | Използвайте conditional tags в споделен шаблон | Дублиране на код в шаблоните |
| Инжектиране на шаблони от плъгин | Използвайте филтъра _{$type}_template_hierarchy | Твърдо кодиране на пътища в файловете на темата |
| Заместване на всеки шаблон като последна мярка | Използвайте филтъра template_include | Използване на exit() или die() в шаблоните |
| Персонализиране на block тема | Използвайте Site Editor или HTML файлове templates/ | Смесване на PHP и HTML block шаблони |
Ключови технически изводи
index.phpе задължителен. Всяка тема трябва да го включва. Той е универсалният резервен вариант, който завършва всяка верига за разрешаване.singular.phpе неизползваният среден слой. Той улавя всяка единична публикация или страница, когато нитоsingle.php, нитоpage.phpсъществуват. Използвайте го в минимални теми за намаляване на броя на файловете.front-page.phpзамества всичко за началната страница, независимо от настройките в Reading. Ако съществува, той се зарежда — винаги.- Имената на файловете са чувствителни към регистъра на Linux сървъри.
Category-News.phpняма да съвпадне, когато WordPress търсиcategory-news.php. Това е тиха грешка, която е трудно да се открие без Query Monitor. - Филтърът
template_includeе главното заместване. Той се активира след приключване на цялото разрешаване на йерархията и ви дава последна възможност да замените всеки шаблон по каквато и да е причина. - Block темите съхраняват шаблони като HTML, а не PHP. Логиката на йерархията е идентична, но форматът на файловете и структурата на директориите се различават фундаментално от класическите теми.
functions.phpна child темата се зарежда в допълнение към тази на parent темата, а не вместо нея. Всички останали шаблонни файлове следват стандартния модел на заместване.- Настройката на OPcache е важна при мащаб. На сайтове с голям трафик се уверете, че
opcache.max_accelerated_filesнадвишава общия брой PHP файлове в WordPress инсталацията ви, включително всички шаблони на темата. - Шаблоните на WooCommerce са извън йерархията на WordPress. Те изискват отделен работен процес за заместване чрез поддиректорията
woocommerce/в темата ви. - Съчетайте работата по персонализиране на шаблони с правилно конфигуриран домейн и Регистрация на домейн, за да осигурите последователност на канонични URL адреси в всички страници, рендирани от шаблони.
ЧЗВ
Какво се случва, ако WordPress не може да намери никакъв шаблонен файл в йерархията?
WordPress винаги намира index.php, тъй като той е задължителен за всяка валидна тема. Ако index.php липсва, WordPress генерира фатална грешка и показва празна страница или грешка на сървъра. Това е единственият шаблонен файл, чието отсъствие напълно разрушава сайта.
Мога ли да използвам Template Hierarchy в плъгин, без да променям активната тема?
Да. Използвайте филтъра _{$type}_template_hierarchy за добавяне на път до директория на плъгин в началото на масива с кандидати преди изпълнението на locate_template(), или използвайте template_include за замяна на разрешения път до шаблона след разрешаването. Така WooCommerce, bbPress и повечето основни плъгини инжектират собствените си шаблони, без да изискват промени в темата.
Защо front-page.php замества блог индекса ми, дори когато съм задал „Your latest posts” в настройките на Reading?
Защото front-page.php има безусловен приоритет за началната страница при всички конфигурации на Reading. Ако искате блог индексът да използва home.php вместо това, преименувайте или премахнете front-page.php от темата си. Вътре в front-page.php използвайте is_home() за разпознаване дали началната страница е също блог индексът и рендирайте съответно.
Как да разбера кой шаблонен файл WordPress използва в момента за конкретна страница?
Инсталирайте плъгина Query Monitor. Той показва разрешения път до шаблона и пълната йерархия от кандидати в admin toolbar при всяко зареждане на страница. Алтернативно, добавете временен филтър template_include, който извежда пътя като HTML коментар, видим само за администратори.
Работи ли Template Hierarchy по същия начин в WordPress Multisite?
Логиката на разрешаване за всеки сайт е идентична. Всеки сайт разрешава шаблони спрямо собствената си активна тема. Разликата е на мрежово ниво: мрежово активираните плъгини могат да използват filter hook-ове за инжектиране на споделени шаблони в всички сайтове, а функцията get_stylesheet_directory() връща правилния път за активната тема на всеки отделен сайт, а не споделен мрежов път.
