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

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

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

Ищем WP-разработчика! Фулл-тайм, удаленка, хорошая зарплата, соц. пакет. Подробности.
Компания Boosta.

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

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

Например, мы заходим на страницу рубрики «Плагины» http://example.com/category/plugins. Ярлык этой рубрики = plugins, а ID = 25 (ярлык и ID мы можем посмотреть на странице редактирования рубрики в админке). Тогда за шаблон этой страницы WordPress будет отвечать один из файлов ниже (файлы проверяются по-очереди, первый существующий в теме файл станет шаблоном этой страницы):

  1. category-plugins.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 и запускается визуальная часть генерации страницы.

меню

Фильтры

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

  • (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

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

--

Источник

20 комментов
Полезные 1 Вопросы 2 Все
    Войти