Как узнать, какой шаблон используется для отображения текущей страницы?
Когда вы активируете тему WordPress, всегда возникает сложность с поиском нужного файла для внесения изменений. Есть ли идеи, как упростить этот процесс?
Однако, учитывая функциональность get_template_part, это может быть невозможно. Что скажете?

Подключитесь к хуку template_include
, установите глобальную переменную для записи шаблона, установленного темой, затем прочитайте это значение в подвале или шапке сайта, чтобы увидеть, какой шаблон используется для данного представления.
Я уже говорил об этом фильтре ранее в статье Получение имени текущего файла шаблона, но возьмите копию этого кода и поместите его в файл functions.php
вашей темы.
Затем откройте файл header.php
или footer.php
темы (или любой другой по вашему выбору) и используйте что-то вроде следующего, чтобы вывести текущий шаблон.
<div><strong>Текущий шаблон:</strong> <?php get_current_template( true ); ?></div>
Если вы хотите использовать это на рабочем сайте и скрыть эту информацию от пользователей, не являющихся администраторами, добавьте условную логику.
<?php
// Если текущий пользователь может управлять настройками (т.е. администратор)
if( current_user_can( 'manage_options' ) )
// Выводим сохранённую глобальную переменную
printf( '<div><strong>Текущий шаблон:</strong> %s</div>', get_current_template() );
?>
Теперь вы можете отслеживать, какие представления используют какие шаблоны, скрывая эту информацию от посетителей.

Если что-то не так с этим ответом, или если у кого-то есть комментарии по поводу того, как можно улучшить этот ответ, не стесняйтесь, оставьте комментарий здесь и поделитесь своими мыслями и идеями о том, как сделать его лучше.

Это должно быть get_page_template

get_current_template
— это не функция, и get_page_template
ничего не выводит для меня (страница WooCommerce).

@run_the_race - вам следует скопировать функцию отсюда: https://wordpress.stackexchange.com/questions/10537/get-name-of-the-current-template-file/10565#10565 и вставить её в ваш functions.php

Для тех, кому лень читать полностью: get_current_template
— это ПОЛЬЗОВАТЕЛЬСКАЯ функция, которую предлагает использовать @t31os. Просто перейдите по его ссылкам, чтобы увидеть, как это реализовано.
Функция get_page_template
бесполезна — она работает только для обычных страниц. Обратитесь к документации WordPress для уточнений. Насколько мне известно, предложенное здесь решение — единственный универсальный способ определить текущий шаблон во всех случаях.

Что ж, если вам просто нужно узнать, какой файл шаблона использовался для генерации текущей страницы, то вам не обязательно пачкать руки кодом ;)
Есть удобный плагин под названием Debug Bar. Это отличный помощник во многих ситуациях, включая вашу. Вам определённо стоит его попробовать — для меня и многих других это обязательный инструмент в разработке на WordPress.
Я прикрепил скриншот, который может заставить вас влюбиться...
Чтобы заставить Debug Bar работать, вам нужно включить опции wp_debug
и wp_savequeries
. Эти опции по умолчанию отключены.
Прежде чем вносить какие-либо изменения, учтите несколько моментов:
- Не делайте этого в рабочей среде, если только сайт не обслуживает небольшой трафик.
- После завершения отладки обязательно отключите эти опции (особенно wp_savequeries, так как она влияет на производительность) сайта.
Чтобы внести изменения:
- Откройте файл
wp_config.php
через FTP-клиент. - Найдите опцию
wp_debug
. Измените её наdefine( 'WP_DEBUG', true );
. Если строка отсутствует, добавьте её в файл. - Аналогично отредактируйте или добавьте строку
define( 'SAVEQUERIES', true );
в файл. - Сохраните. Теперь вы готовы к отладке.
Подробнее: Кодекс

@justCallMeBiru — плагин Debug Bar не требует WP_DEBUG
и SAVEQUERIES
, хотя они улучшают его функциональность.

Я использую эту удобную функцию, которая отображает текущий шаблон только для супер-администраторов:
function show_template() {
if( is_super_admin() ){
global $template;
print_r($template);
}
}
add_action('wp_footer', 'show_template');
Надеюсь, это поможет. :)

Добавьте следующий код сразу после строки get_header в каждом соответствующем файле шаблона:
<!-- <?php echo basename( __FILE__ ); ?> -->
В вашем браузере > просмотрите исходный код, и имя шаблона будет отображаться как комментарий в вашем HTML-коде, например:
<!-- page.php -->

хахаха, зачем заморачиваться с этим, если ты собираешься помечать каждый файл — просто пометь его настоящим именем файла!

@Aurovrata это было давно. Сейчас есть гораздо лучшие решения. Но у меня был простой скрипт для вставки кода в начало всех файлов в папке, так что не требовалось жестко прописывать настоящие имена. Делалось за 1-2 секунды.

Вот решение:
HTML-список со всеми файлами шаблонов, используемыми на текущей целевой странице, включая все части шаблонов из плагинов, дочерней и/или родительской темы, всё в одной строке кода:
echo '<ul><li>'.implode('</li><li>', str_replace(str_replace('\\', '/', ABSPATH).'wp-content/', '', array_slice(str_replace('\\', '/', get_included_files()), (array_search(str_replace('\\', '/', ABSPATH).'wp-includes/template-loader.php', str_replace('\\', '/', get_included_files())) + 1)))).'</li></ul>';
Возможно, вам потребуется проверить, что ваш сервер не возвращает двойные слеши в путях. Поместите этот код после всех используемых файлов шаблонов, например, в footer.php, но до отрисовки панели администратора.
Если путь admin-bar stuff
отображается вверху или любой другой файл, замените имя файла template-loader.php
в этой строке на нужное для разделения. Часто: class-wp-admin-bar.php
Если вам нужен этот список в панели администратора, используйте правильный приоритет (наименьший), чтобы убедиться, что файлы не добавляются в конец списка. Например:
add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);
Приоритет -5
гарантирует, что функция выполнится первой. Ключевой момент — вызвать get_included_files()
в нужный момент, иначе потребуется дополнительная обработка массива!
Разберём по шагам:
Вы не сможете собрать все включённые файлы шаблонов без PHP backtrace. Суперглобальные переменные внутри template_include
не соберут их все. Другой способ — «расставить маркеры» в каждом файле шаблона, но если вам нужно сначала взаимодействовать с файлами, это усложнит задачу.
1) Нам нужно проверить все файлы, использованные текущим запросом WordPress. Их будет много! Не удивляйтесь, если до регистрации functions.php уже загружено 300 файлов.
$included_files = str_replace('\\', '/', get_included_files());
Мы используем нативную PHP-функцию get_included_files(), преобразуя обратные слеши в прямые для совместимости с путями WordPress.
2) Обрезаем массив с момента регистрации template-loader.php. После этого в get_included_files() должны остаться только файлы шаблонов.
/* Ключевая точка, нужно найти её позицию в массиве */
$path = str_replace('\\', '/', ABSPATH);
$key = $path.'wp-includes/template-loader.php';
$offset = array_search($key, $included_files);
/* Исключаем саму ключевую точку из нового массива */
$offset = ($offset + 1);
$output = array_slice($included_files, $offset);
3) Укорачиваем пути, нам не нужна часть до папки темы или плагина, так как шаблоны могут быть смешаны из плагинов, темы или дочерней темы.
$replacement = $path.'wp-content/';
$output = str_replace($replacement, '', $output);
4) Преобразуем массив в удобный HTML-список
$output = '<ul><li>'.implode('</li><li>', $output).'</li></ul>';
Возможно, потребуется доработка в части 3) — замена, если вы не хотите включать обязательные файлы плагинов. Они могут загружать class-файлы
поздно и «вмешиваться» в процесс вывода шаблонов.
Однако, я считаю разумным оставить их видимыми, так как идея в отслеживании загруженного, даже если это не «шаблон», который выводит контент на данном этапе.

Существует ещё один более простой плагин, разработанный специально для этой цели. Я склоняюсь к установке Debug Bar, так как другие его функции выглядят полезными, но этот плагин более базовый и предназначен именно для данной задачи: http://wordpress.org/extend/plugins/what-the-file/

Одна очень простая вещь, которую я делаю — это вставляю HTML-комментарий с указанием файла шаблона в каждом соответствующем файле темы. Например, в начале index.php у меня есть:
<!-- index -->
а в начале front-page.php:
<!-- front -->
Но очевидно, что это требует изменения темы. Я подозреваю, что можно добавить пользовательскую функцию в файл footer.php или header.php, которая будет указывать, какой файл используется. Указанный выше метод и схема иерархии шаблонов WordPress — это то, что я обычно использую.

Самый простой способ, который я нашёл, — это использовать функцию WordPress в теге body. Она добавит несколько классов в зависимости от того, какую страницу вы просматриваете (home для главной, page для страницы и т.д.).
Ознакомьтесь здесь: http://codex.wordpress.org/Function_Reference/body_class
Кроме того, это полезно для стилизации элементов с помощью CSS на этих страницах.
Как упомянул Дэвид Р., также полезно изучить Иерархию шаблонов (http://codex.wordpress.org/Template_Hierarchy).
