Brian_Fegter
  • 0
Новичок

Область действия переменных темы WordPress

  • 0

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

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

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

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

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

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

    • 0
    • Кто-нибудь еще знает более интуитивно понятное решение, чем переопределять его как глобальное в каждом файле шаблона? Я использую этот метод при разработке своей темы, и он выглядит… неуместным.

      • 0
    • Классный чувак, спасибо! Для тех, кто готов, кто немного туп, как я: В вашем файле functions.php: В вашем, я не знаю, header.php: и ты золотой!

      • 0
    • Если это поможет прояснить: все файлы шаблонов в WordPress вызываются require() операторами, заключенными в функции: get_header(), get_footer(), и т. д.; которые сами являются обертками вокруг функции get_template_part() . Поскольку функции в PHP имеют доступ только к переменным, определенным внутри них или переданным по ссылке на них, если вы хотите использовать переменную из глобальной области видимости (или определить переменную и сделать ее доступной в глобальной области видимости), вы должны объявить об этом. сначала с глобальным ключевым словом.

      • 0
  2. Доминик (не знаю, как добавить примечание к своему ответу):

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

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

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

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

    Вам следует рассмотреть возможность использования $GLOBALS[‘categories’] вместо просто глобальных.

    Этому есть две причины:

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

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

    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’]); будет ВСЕГДА более понятным для вас, чем global $foo; /* групповой код */ something_using($foo); Не будь мелочным и глупым..

    • 0
  4. Это также работает:

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

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

    • 0

Оставить ответ

You must login to add an answer.