С чем сравнивает функция is_page_template()?
Просматривая документацию WordPress, сказано, что is_page_template()
сравнивает с "именем шаблона", если оно предоставлено.
У меня есть шаблон, хранящийся в page-homepage.php
под названием Homepage
:
/*
* Template Name: Homepage
* Description: Шаблон для отображения главной страницы
*/
И у меня есть код, который я хочу выполнить в functions.php, когда использую этот шаблон:
if (is_page_template('Homepage')) {
...
Но он не срабатывает, когда я нахожусь на странице, использующей этот шаблон.
Когда я смотрю на код, который WordPress выполняет для is_page_template()
, похоже, что он фактически проверяет имя файла, а не имя шаблона...?
function is_page_template( $template = '' ) {
$page_template = get_page_template_slug( get_queried_object_id() );
if ( $template == $page_template )
return true;
В моем случае кажется, что $page_template
имеет значение page-homepage.php
-- а не имя шаблона, как предполагает документация...?
Я делаю что-то неправильно?

Ваше условие должно быть написано следующим образом:
if (is_page_template('path/file.php')) {
// Выполнить действия
}
Я считаю, что путаница возникает из-за двух факторов:
- В документации неоднозначно используется термин "name". Указание "имя файла" сделало бы документацию гораздо понятнее.
- Код функции
is_page_template()
использует в своей основе функциюget_page_template_slug()
. Эта функция фактически возвращает имя файла, а не слаг шаблона. https://codex.wordpress.org/Function_Reference/get_page_template_slug
При указании аргумента для функции is_page_template()
(как в примере выше), путь к файлу указывается относительно корня темы.
Эта функция не будет работать внутри цикла.
ПРИМЕЧАНИЕ: Важная проблема, на которую стоит обратить внимание. Функция is_page_template()
вернет пустое значение/ложь, если страница использует шаблон по умолчанию из иерархии. Если пользовательский шаблон не назначен, необходимо использовать другой метод, например basename(get_page_template())
. Подробнее см. ответ Jacob здесь: https://wordpress.stackexchange.com/a/328427/45202
ПРИМЕЧАНИЕ 2: Это замечание о "шаблоне по умолчанию" также включает шаблоны, использующие слаг страницы или другие соглашения об именовании (например, page-mypage-slug.php), как показал мой собственный опыт.

Добавлены дополнительные разъяснения и детали о том, почему это может вызывать путаницу.

Вау. Двойная путаница. Я могу понять, что документация может быть немного неоднозначной (хотя это действительно нужно исправить), но я очень удивлен, что get_page_template_slug()
на самом деле не возвращает slug!

Согласен. Это еще раз подтверждает, что "называние вещей" — одна из самых сложных задач при написании кода.

В этом ответе приведено "лучшее практическое" решение. Однако, если ваша страница использует "шаблон по умолчанию" (но на самом деле это Шаблон Страницы), этот ответ может вас заинтересовать.

Думаю, лучше всего сказать, что функция проверяет имя ФАЙЛА, и в вашем случае это будет page-homepage.php. Итак:
if (is_page_template('page-homepage.php')) {
...
Ещё стоит учесть, находится ли файл шаблона в другой папке внутри темы. подробнее
И ещё один момент: Template Name: Homepage
— это обычно то, что используется для идентификации шаблона при создании страницы или записи.

Как отмечается в другом ответе - также учитывается путь. page-templates/page-homepage.php
отличается от шаблона в корне темы.

Интересно и то, чего я не знал, просто чтобы уточнить: я могу хранить шаблоны страниц вне папки темы или дочерней темы?
