Ієрархія файлів теми (шаблону)
У цьому пості йтиметься про те, які бувають назви у файлів теми WordPress і за показ якої сторінки на сайті відповідає кожен з них. Це дуже важливі, потрібні і водночас дуже прості, для розуміння, знання. Ними повинен мати кожен, хто працює з WordPress. Нижче повністю розписано структуру файлів теми WordPress та порядок їх підключення (ієрархія).
Про ієрархію файлів теми я згадував у статті «Умовні теги WordPress» . А нижче те саме, тільки описано по іншому (сподіваюся зрозуміліше).
Приклад того, як працює ієрархія
Наприклад, ми заходимо на сторінку рубрики “Моя рубрика” http://example.com/category/my-category
. Ярлик цієї рубрики = my-category , а ID = 25 (ярлик та ID ми можемо подивитися на сторінці редагування рубрики в адмінці). Тоді за шаблон цієї сторінки WordPress відповідатиме один із файлів нижче (файли перевіряються по черзі, перший існуючий у темі файл стане шаблоном цієї сторінки):
category-plugins.php
category-25.php
category.php
archive.php
index.php
Ієрархія, у разі — це послідовна перевірка існування файлу шаблона. Для контенту однієї сторінки на сайті може підходити кілька файлів. Перевірка, який саме файл буде використаний йде по черзі. Тобто. у WordPress є список відповідних назв файлів, кожна з назв перевіряється по черзі на фізичне існування такого файлу, як тільки WordPress бачить, що файл існує пошук відповідного файлу припиняється і знайдений файл використовується як шаблон.
Інші файли теми
Також, у WordPress є загальноприйняті файли, що підключаються. Він не беруть участі в ієрархії, а просто підключаються вручну там, де потрібно. Наприклад, файл sidebar.php підключається у файлі шаблону теми за допомогою функції get_sidebar() .
Список таких файлів, що «підключаються»:
- functions.php – завжди підключається автоматично під час завантаження теми.
- header.php – get_header()
- sidebar.php – get_sidebar()
- footer.php – get_footer()
- searchform.php – get_search_form()
Типи сторінок та назви файлів
Тепер коли ми розуміємо, як працює ієрархія, давайте подивимося на всі варіанти назв файлів, які WordPress намагається знайти при відвідуванні тієї чи іншої сторінки сайту.
Повна схема для всіх видів сторінок і підходящих файлів виглядає так:
Тепер, я розпишу цю картинку, зроблю з неї список сторінок сайту та підходящі для них php файли теми.
Файли зі списку нижче повинні знаходитись у папці теми.
Записи
Сторінка (запис page)
- {будь-яка назва}.php (коли використовується шаблон сторінки )
- page-{urldecode_post_name}.php
- page-{post_name}.php
- page-{ID_запису}.php
- page.php
- singular.php
- index.php
Запис (запис 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
Пример использования такого фильтра смотрите в ответе на этот вопрос.
—