Мне нужно создать переменную, доступ к которой можно получить в файлах шаблонов темы WordPress (index.php, header.php и т. д.). Я знаю, что определения функций находятся внутри functions.php
файла шаблона (в пути к вашей теме), но для переменных такого нет.
Например, мне постоянно нужно получать категории в моей теме, поэтому я хотел бы, чтобы это было доступно из любого места в моей теме:
$categories = get_categories(); /* get_categories() is a wordpress function */
Таким образом, я могу просто получить доступ к выделенным данным, без необходимости перераспределять их каждый раз, когда мне нужно получить свои категории.
К сожалению, добавление этого фрагмента кода в мой functions.php
файл не работает, равно как и создание переменной global
.
Видимо
global
делает свое дело. Проблема заключалась в том, что моя переменная$categories
должна была быть переопределена с помощьюglobal
перед ней в каждом шаблоне, который мне нужно было использовать.Кто-нибудь еще знает более интуитивно понятное решение, чем переопределять его как глобальное в каждом файле шаблона? Я использую этот метод при разработке своей темы, и он выглядит… неуместным.
Классный чувак, спасибо! Для тех, кто готов, кто немного туп, как я: В вашем файле functions.php: В вашем, я не знаю, header.php: и ты золотой!
Если это поможет прояснить: все файлы шаблонов в WordPress вызываются
require()
операторами, заключенными в функции:get_header()
,get_footer()
, и т. д.; которые сами являются обертками вокруг функцииget_template_part()
. Поскольку функции в PHP имеют доступ только к переменным, определенным внутри них или переданным по ссылке на них, если вы хотите использовать переменную из глобальной области видимости (или определить переменную и сделать ее доступной в глобальной области видимости), вы должны объявить об этом. сначала с глобальным ключевым словом.Доминик (не знаю, как добавить примечание к своему ответу):
определить принимает только скаляры, так что вы не могли бы сделать
define( CATS, get_categories() );
и даже неВ противном случае определение работает нормально, и на самом деле это безопаснее для скаляров (поскольку вы можете быть уверены, что константы не могут быть перезаписаны)
Я знаю, что это действительно старый, но есть место для улучшения.
Вам следует рассмотреть возможность использования $GLOBALS[‘categories’] вместо просто глобальных.
Этому есть две причины:
global $categories;
каждый раз.Рассмотрим этот код:
Только если мы инициализируем глобальное состояние прямо перед использованием переменной, довольно сложно сказать, является оно глобальным или нет. И не забудьте повторить это в любом из файлов шаблонов, которые у вас есть.
Для этого можно использовать соглашения об именах, но, на мой взгляд, есть лучший способ.
Рассмотрите возможность использования
$GLOBALS['categories']
.Нам нужно только один раз инициализировать нашу переменную в functions.php без необходимости думать об этом
global $categories
снова. И мы видим, что он глобальный.print_r ($GLOBALS['categories']);
Проблема с производительностью вообще не проблема в этой ситуации. Процитирую Сару Големон ( ссылка ):
Это также работает:
в functions.php добавьте
define('TEST', 'this is a test');
и в ваш header.php или что-то еще
echo TEST;
Есть ли преимущество в производительности у одного метода над другим?