С чем сравнивает функция is_page_template()?

8 сент. 2016 г., 20:56:13
Просмотры: 50.4K
Голосов: 17

Просматривая документацию 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 -- а не имя шаблона, как предполагает документация...?

Я делаю что-то неправильно?

1
Комментарии

Хорошее замечание насчёт документации.

birgire birgire
8 сент. 2016 г. 21:32:22
Все ответы на вопрос 2
6
22

Ваше условие должно быть написано следующим образом:

if (is_page_template('path/file.php')) { 
    // Выполнить действия
}

Я считаю, что путаница возникает из-за двух факторов:

  1. В документации неоднозначно используется термин "name". Указание "имя файла" сделало бы документацию гораздо понятнее.
  2. Код функции 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), как показал мой собственный опыт.

8 сент. 2016 г. 21:24:08
Комментарии

Было бы неплохо пояснить, что означает path в данном контексте.

birgire birgire
8 сент. 2016 г. 21:35:11

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

jdm2112 jdm2112
8 сент. 2016 г. 21:45:17

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

Django Reinhardt Django Reinhardt
9 сент. 2016 г. 12:09:19

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

jdm2112 jdm2112
9 сент. 2016 г. 17:38:55

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

rinogo rinogo
10 авг. 2018 г. 02:12:42

Спасибо, @rinogo. Добавил примечание выше, так как лично снова столкнулся с этой проблемой.

jdm2112 jdm2112
12 мая 2020 г. 00:53:12
Показать остальные 1 комментариев
3

Думаю, лучше всего сказать, что функция проверяет имя ФАЙЛА, и в вашем случае это будет page-homepage.php. Итак:

if (is_page_template('page-homepage.php')) { 
  ...

Ещё стоит учесть, находится ли файл шаблона в другой папке внутри темы. подробнее

И ещё один момент: Template Name: Homepage — это обычно то, что используется для идентификации шаблона при создании страницы или записи.

8 сент. 2016 г. 21:26:36
Комментарии

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

Howdy_McGee Howdy_McGee
8 сент. 2016 г. 21:31:39

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

Malisa Malisa
8 сент. 2016 г. 21:36:30

Для справки: это также работает в среде разработки Sage

Fred K Fred K
13 мая 2022 г. 11:49:05