Escopo de variáveis ​​do tema WordPress

9

Eu preciso criar uma variável que possa ser acessada nos meus arquivos de modelo de tema do WordPress (index.php, header.php etc.). Eu sei que as definições de função estão dentro do functions.phparquivo de modelo (no caminho do seu tema), mas não existe tal coisa para variáveis.

Por exemplo, eu constantemente preciso recuperar Categorias no meu Tema, então eu gostaria de ter isso acessível de qualquer lugar no meu tema:

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

Dessa forma, eu posso simplesmente acessar os dados alocados, sem precisar realocá-los toda vez que precisar obter minhas categorias.

Infelizmente, adicionar esse pedaço de código no meu functions.phparquivo não funciona, nem criar a variável global.

Gonçalo Peres 龚燿禄
fonte

Respostas:

5

Aparentemente, globalfaz o truque. O problema era que minha variável $categoriesdeveria ter sido redefinida com um globalna frente, em cada modelo que eu precisava usá-la.


fonte
2
Alguém mais conhece uma solução mais intuitiva do que ter que redefini-la como global em todos os arquivos de modelo? Eu uso esse método no desenvolvimento do meu tema e ele parece ... fora de lugar.
11
Cara incrível, obrigado! Para qualquer pessoa pronta, que seja um pouco grossa como eu: No seu arquivo functions.php: <? Php $ test = "Eu sou um teste!"; ?> No seu, não sei, header.php: <? Php global $ test; eco $ test; ?> e você é de ouro!
Dominic
Se isso ajuda a esclarecer: todos os arquivos de modelo em WordPress são chamados por require()declarações que estão envolvidos em funções: get_header(), get_footer(), etc; que são invólucros em torno da função get_template_part(). Como as funções no PHP têm acesso apenas às variáveis ​​definidas nelas ou passadas por referência a elas, se você deseja usar uma variável do escopo global (ou definir uma variável e torná-la acessível no escopo global), você deve anunciar com a palavra-chave global primeiro.
goldenapples
1

Dominic (não sabe como adicionar uma nota à sua resposta):

define apenas aceita escalares, então você não poderia fazer define( CATS, get_categories() ); e nem mesmo

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

Caso contrário, definir funciona bem e é de fato mais seguro para escalares (como você pode ter certeza de que as constantes não podem ser substituídas)


fonte
1

Eu sei que este é realmente velho, mas há um espaço para melhorias.

Você deve considerar usar $ GLOBALS ['categorias'] em vez de apenas global.

Há duas razões para isso:

  1. Não precisamos escrever global $categories;sempre.
  2. É claro que estamos usando global e depois não.

Considere este código:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Somente se inicializarmos o estado global antes de usar a variável, é muito difícil saber se é global ou não. E não se esqueça de repeti-lo em qualquer um dos arquivos de modelo que você possui.

É possível usar convenções de nomenclatura para isso, mas há uma maneira melhor, na minha opinião.

Considere usar $GLOBALS['categories'].

Só precisamos inicializar nossa variável uma vez em functions.php sem precisar pensar global $categoriesnovamente. E podemos ver que é global.

print_r ($GLOBALS['categories']);

Problema de desempenho não é um problema nesta situação. Vou citar Sara Golemon ( link ):

O que isso significa para o uso da matriz $ GLOBALS? É isso mesmo, a palavra-chave global é tecnicamente mais rápida. Agora, quero ser muito claro sobre uma coisa aqui. A menor disponibilidade de velocidade oferecida pelo uso de seus globais como variáveis ​​[compiladas localizadas] precisa ser seriamente ponderada em relação à capacidade de manutenção de analisar seu código em cinco anos e saber que $ foo veio do escopo global. algo_utilizando ($ GLOBALS ['foo']); SEMPRE será mais claro para você abaixo da linha do que $ foo global; / * código buncha * / something_using ($ foo); Não seja um tostão nem um tolo.

Keeprock
fonte
0

Isso também funciona:

em functions.php add define('TEST', 'this is a test');
e no seu header.php ou o que quer que sejaecho TEST;

Existe alguma vantagem de desempenho em um método em relação a outro?

Dominic
fonte