Иерархия файлов темы (шаблона)

В этом посте речь пойдет о том, какие бывают названия у файлов темы WordPress и за показ какой страницы на сайте отвечает каждый из них. Это очень важные, нужные, и в тоже время очень простые, для понимания, знания. Ими должен обладать каждый, кто работает с WordPress. Ниже полностью расписана структура файлов темы WordPress и порядок их подключения (иерархия).

Об иерархии файлов темы я упоминал в статье «Условные теги в WordPress». А ниже тоже самое, только описано подругому (надеюсь более понятно).

Пример того как работает иерархия

Например, мы заходим на страницу рубрики «Моя рубрика» http://example.com/category/my-category. my-category здесь — это ярлык этой рубрики. И ID этой рубрики 25.

Тогда за шаблон этой страницы WordPress будет отвечать один из файлов ниже (файлы проверяются по-очереди, первый существующий в теме файл станет шаблоном этой страницы):

  1. category-my-category.php
  2. category-25.php
  3. category.php
  4. archive.php
  5. index.php

Иерархия, в данном случае — это последовательная проверка на существование файла шаблона. Для контента одной страницы на сайте, может подходить несколько файлов. Проверка какой именно файл будет использован идет по-очереди. Т.е. в WordPress есть список подходящих названий файлов, каждое из названий проверяется по очереди на физическое существование такого файла, как только WordPress видит что файл существует поиск подходящего файла прекращается и найденный файл используется в качестве шаблона.

Другие файлы темы

Также, в WordPress есть общепринятые подключаемые файлы. Он не участвуют в иерархии, а просто подключаются вручную там где нужно. Например файл sidebar.php подключается в файле шаблона темы с помощью функции get_sidebar().

Список таких «подключаемых» файлов:

Типы страниц и названия файлов

Теперь когда мы понимаем как работает иерархия, давайте посмотрим на все варианты названий файлов, которые WordPress пытается найти при посещении той или иной страницы сайта.

Полная схема для всех видов страниц и подходящих для них файлов выглядит так:

Схема в интерактивном виде

Теперь, я распишу эту картинку, сделаю из неё список страниц сайта и подходящие для них php файлы темы.

Файлы из списка ниже должны находится в папке темы.

Записи

Страница (запись page)

Запись (запись post)

  • single-post-{ярлык_записи}.php
  • single-post.php
  • single.php
  • singular.php
  • index.php

Произвольный тип записи

  • {любое_название}.php (для древовидного типа с поддержкой шаблонов. С WP 4.7)
  • single-{post_type}-{urldecode_post_name}.php
  • single-{post_type}-{post_name}.php
  • single-{post_type}.php
  • single.php
  • singular.php
  • index.php

Вложение

  • {начало_MIME_типа}.php
  • {конец_MIME_типа}.php
  • {начало_MIME_типа}-{конец_MIME_типа}.php
  • attachment.php
  • single-attachment-{ярлык_вложения}.php (позволяет указать шаблон для отдельной картинки)
  • single-attachment.php (тоже что и attachment.php)
  • single.php
  • singular.php
  • index.php

Под началом и концом MIME типа, имеется виду первая и последняя часть MIME типа, разделенная /. Например, MIME-тип текстового файла: 'text/plain' и значит будет проверяться наличие файл text.php, затем plain.php, затем text-plain.php.

Полный список MIME типов смотрите в описании get_allowed_mime_types().

Архивы

Рубрика

  • category-{ярлык}.php
  • category-{id}.php
  • category.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

Метка

  • tag-{ярлык}.php
  • tag-{id}.php
  • tag.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

Таксономия

  • taxonomy-{ярлык_таксономии}-{ярлык_элемента}.php
  • taxonomy-{ярлык_таксономии}.php
  • taxonomy.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

Страница архива типа записи

  • archive-{ярлык_типа_записи}.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

Страница автора

  • author-{nickname}.php
  • author-{id}.php
  • author.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

Страница архива по дате (день, месяц, год)

  • date.php
  • archive.php
  • paged.php (если страница пагинации)
  • index.php

404 страница

  • 404.php
  • index.php
  • search.php
  • index.php

Главная страница

  • front-page.php
  • Логика постоянных страниц, когда для главной выбрана страница в настройках.
  • home.php
  • index.php

Страница блога

Страница блога появляется, когда для главной выбрана постоянная страница

  • home.php
  • index.php

Встраивания (embeds)

Шаблоны встраивания используются когда запрашивается короткая версия статьи для добавления её на другом сайте. Обычно такие URL выглядят так: http://dom/post-url/embed Встраивания появились в версии 4.5 и позволяют встраивать ваши записи в чужие сайты. См. get_post_embed_url()

  • embed-{post-type}-{post_format}.php
  • embed-{post-type}.php
  • embed.php

Чтобы изменить только контент встраивания, можно в теме создать файл embed-content.php и описать там HTML. Оригинальный HTML находится в файле движка /wp-includes/theme-compat/embed-content.php

Как это работает в ядре

За всю логику: какой файл подключать, отвечает файл ядра wp-includes/template-loader.php. Если разобраться, в нем все описано. Но, это занятие не особо интересное, поэтому я его распишу.

Прежде всего. template-loader.php подключается после того как загрузится вся среда WordPress. После того, как отработает файл wp-load.php и обработается основной запрос - функция wp(). Т.е. template-loader.php подключается в самом-самом конце PHP скрипта...

Сначала срабатывает хук template_redirect. В этом хуке можно произвести какие-то проверки и если надо перенаправить на другой URL. В нем нужно обрывать работу скрипта через die(). Т.е. если этот хук что-то меняет, то на этом работа файла template-loader.php должна закончиться и мы «улетаем» на какую-то другую страницу.

Дальше срабатывает никому не интересный хук exit_on_http_head. Он позволяет сделать так, чтобы при HTTP HEAD запросе что-либо выводилось на экран...

Дальше идут проверки по всем условным тегам где выясняется какой файл шаблона подходит под текущий запрос. Проверяется условный тег, затем еще один и еще... Как только один из условных тегов сработал, вызывается соответствующая функция, которая находит подходящий файл шаблона и возвращает путь до него. Все такие функции описаны в get_query_template().

Дальше - путь до файла шаблона определен! Теперь путь проходит через фильтр template_include. Который позволяет нам изменить путь до файла шаблона для текущего запроса.

Готово - файл шаблона подключается в PHP, таким образом запускается визуальная часть генерации страницы.

Список файлов шаблона из Кода

Описание файлов шаблона находится в коде, в файле wp-admin/includes/file.php

/** The descriptions for theme files. */
$wp_file_descriptions = array(
	'functions.php'         => __( 'Theme Functions' ),
	'header.php'            => __( 'Theme Header' ),
	'footer.php'            => __( 'Theme Footer' ),
	'sidebar.php'           => __( 'Sidebar' ),
	'comments.php'          => __( 'Comments' ),
	'searchform.php'        => __( 'Search Form' ),
	'404.php'               => __( '404 Template' ),
	'link.php'              => __( 'Links Template' ),
	'theme.json'            => __( 'Theme Styles & Block Settings' ),
	// Archives.
	'index.php'             => __( 'Main Index Template' ),
	'archive.php'           => __( 'Archives' ),
	'author.php'            => __( 'Author Template' ),
	'taxonomy.php'          => __( 'Taxonomy Template' ),
	'category.php'          => __( 'Category Template' ),
	'tag.php'               => __( 'Tag Template' ),
	'home.php'              => __( 'Posts Page' ),
	'search.php'            => __( 'Search Results' ),
	'date.php'              => __( 'Date Template' ),
	// Content.
	'singular.php'          => __( 'Singular Template' ),
	'single.php'            => __( 'Single Post' ),
	'page.php'              => __( 'Single Page' ),
	'front-page.php'        => __( 'Homepage' ),
	'privacy-policy.php'    => __( 'Privacy Policy Page' ),
	// Attachments.
	'attachment.php'        => __( 'Attachment Template' ),
	'image.php'             => __( 'Image Attachment Template' ),
	'video.php'             => __( 'Video Attachment Template' ),
	'audio.php'             => __( 'Audio Attachment Template' ),
	'application.php'       => __( 'Application Attachment Template' ),
	// Embeds.
	'embed.php'             => __( 'Embed Template' ),
	'embed-404.php'         => __( 'Embed 404 Template' ),
	'embed-content.php'     => __( 'Embed Content Template' ),
	'header-embed.php'      => __( 'Embed Header Template' ),
	'footer-embed.php'      => __( 'Embed Footer Template' ),
	// Stylesheets.
	'style.css'             => __( 'Stylesheet' ),
	'editor-style.css'      => __( 'Visual Editor Stylesheet' ),
	'editor-style-rtl.css'  => __( 'Visual Editor RTL Stylesheet' ),
	'rtl.css'               => __( 'RTL Stylesheet' ),
	// Other.
	'my-hacks.php'          => __( 'my-hacks.php (legacy hacks support)' ),
	'.htaccess'             => __( '.htaccess (for rewrite rules )' ),
	// Deprecated files.
	'wp-layout.css'         => __( 'Stylesheet' ),
	'wp-comments.php'       => __( 'Comments Template' ),
	'wp-comments-popup.php' => __( 'Popup Comments Template' ),
	'comments-popup.php'    => __( 'Popup Comments' ),
);

Фильтры

Иерархию файлов можно изменить через динамические фильтры:

  • (type)_template_hierarchy - фильтрует массив названий файлов иерархии, по которому будет идти поиск нужного файла. С WP 4.7.

  • (type)_template - фильтрует путь до уже определившегося файла шаблона.

Все варианты параметра type смотрите в одноименном параметр $type функции get_query_template(). Вот они:

  • index
  • 404
  • archive
  • post_type_archive
  • author
  • category
  • tag
  • taxonomy
  • date
  • home
  • frontpage
  • page
  • paged
  • search
  • single
  • singular
  • attachment
  • comments_popup

Пример использования такого фильтра смотрите в ответе на этот вопрос.

--

Источник