Область переменных темы WordPress

9

Мне нужно создать переменную, к которой можно получить доступ через файлы шаблона WordPress Theme (index.php, header.php и т. Д.). Я знаю, что определения функций находятся внутри functions.phpфайла шаблона (в пути вашей темы), но для переменных такого понятия не существует.

Например, мне постоянно нужно получать категории в моей теме, поэтому я хотел бы, чтобы это было доступно из любой точки моей темы:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

Таким образом, я могу просто получить доступ к выделенным данным без необходимости перераспределять их каждый раз, когда мне нужно получить свои категории.

К сожалению, добавление этого фрагмента кода в мой functions.phpфайл не работает, равно как и создание переменной global.

Гонсало Перес 龚燿禄
источник

Ответы:

5

Видимо globalделает свое дело. Проблема заключалась в том, что моя переменная $categoriesдолжна была пересмотрена с globalперед ним, в каждом шаблоне мне нужно , чтобы использовать его.


источник
2
Кто-нибудь еще знает о более интуитивном решении, чем необходимость переопределять его как глобальное в каждом файле шаблона? Я использую этот метод при разработке своей темы, и он выглядит ... не к месту.
1
Офигенно чувак, спасибо! Для тех, кто готов это немного толстый, как я: в вашем файле functions.php: <? Php $ test = "Я тест!"; ?> В вашем, я не знаю, header.php: <? Php global $ test; echo $ test; ?> а ты золотой!
Доминик
Если это помогает уточнить: все файлы шаблонов в WordPress вызываются require()заявления , которые обернуты в функции: get_header(), get_footer()и т.д.; которые сами являются обертками вокруг функции get_template_part(). Поскольку функции в PHP имеют доступ только к переменным, определенным в них или переданным по ссылке на них, если вы хотите использовать переменную из глобальной области (или определить переменную и сделать ее доступной в глобальной области), вы должны объявить ее сначала с глобальным ключевым словом.
золотые яблоки
1

Доминик (не знаю, как добавить примечание к его ответу):

определить только принимает скаляры, так что вы не могли сделать, define( CATS, get_categories() ); и даже не

$categories = get_categories();
define( CATS, $categories );

В противном случае define работает нормально, и это на самом деле безопаснее для скаляров (так как вы можете быть уверены, что константы не могут быть перезаписаны)


источник
1

Я знаю, что это действительно старый, но есть место для улучшения.

Вам следует рассмотреть возможность использования $ GLOBALS ['category'] вместо просто global.

Для этого есть две причины:

  1. Нам не нужно писать global $categories;каждый раз.
  2. Это кристально ясно, тогда мы используем глобальный, а затем нет.

Рассмотрим этот код:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Только если мы инициализируем глобальное состояние прямо перед использованием переменной, довольно сложно сказать, глобально это или нет. И не забудьте повторить это в любом из ваших шаблонных файлов.

Для этого можно использовать соглашения об именах, но, на мой взгляд, есть лучший способ.

Подумайте об использовании $GLOBALS['categories'].

Нам нужно только один раз инициализировать нашу переменную в functions.php, не думая global $categoriesснова. И мы видим, что это глобальный.

print_r ($GLOBALS['categories']);

Проблема производительности не является проблемой вообще в этой ситуации. Я процитирую Сару Големон ( ссылка ):

Что это значит для вашего использования массива $ GLOBALS? Это верно, глобальное ключевое слово технически быстрее. Теперь я хочу быть действительно ясным об одной вещи здесь. Незначительную скорость, предоставляемую использованием глобальных переменных в качестве локализованных [скомпилированных переменных], необходимо серьезно сопоставить с возможностью сопровождения просмотра вашего кода через пять лет и знания того, что $ foo происходит из глобальной области видимости. something_using ($ GLOBALS [ 'Foo']); ВСЕГДА будет яснее для вас, чем глобальный $ foo; / * код bunda * / что-то_using ($ foo); Не будь мудрым и глупым.

Keeprock
источник
0

Это также работает:

в functions.php добавить define('TEST', 'this is a test');
и в ваш header.php или что-то ещеecho TEST;

Есть ли какое-либо преимущество в производительности одного метода перед другим?

Dominic
источник