ATUALIZAÇÃO: Minha pergunta original foi resolvida, mas isso está se transformando em uma discussão válida sobre por que não usar variáveis globais, por isso estou atualizando a questão para refletir isso. A solução foi <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
como o @TomJNowell sugeriu.
ATUALIZAÇÃO 2: Agora eu faço exatamente o que eu queria. Mas ainda estou usando o escopo global e ficaria feliz em encontrar uma maneira melhor.
Estou tentando configurar um monte de variáveis globais para os links permanentes para categorias a serem usadas em vários lugares no meu tema. A principal razão para isso é o uso na navegação principal e em uma série de sub-navegações escolhidas com base em qual categoria a postagem atual se encontra. Esse não é um tema que lançarei para uso por outras pessoas, mas é construído para um propósito muito específico.
É assim que os estou criando atualmente (colei apenas algumas das variáveis).
function set_global_nav_var()
{
//proposal
global $prop;
// Get the ID of a given category
$category_id_prop = get_cat_ID( 'proposal' );
// Get the URL of this category
$category_link_prop = get_category_link( $category_id_prop );
$prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';
//Calvinball
global $cb;
// Get the ID of a given category
$category_id_cb = get_cat_ID( 'calvinball' );
// Get the URL of this category
$category_link_cb = get_category_link( $category_id_cb );
$cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );
Agora eu posso fazer <?php global $prop; echo $prop; ?>
int ele 4 lugares que vai e voltar todo o link para o código. Quando isso muda, só preciso mudar em um só lugar. Estou aberto a alternativas que não envolvem o escopo global.
Respostas:
Embora eu recomendo fortemente isso, e isso não acelera as coisas, seu uso está incorreto.
Ao tentar usar um global, você deve especificar a palavra-chave global primeiro. Você o especificou aqui ao definir seu valor, mas fora desse escopo, ele precisa ser redeclarado como uma variável de escopo global.
por exemplo, em functions.php:
No single.php, isso não funciona:
Porque $ hello é indefinido. No entanto, isso funcionará:
Claro que você não deve fazer nenhum. O WordPress já tenta armazenar essas coisas no cache de objetos. Você não verá nenhum aumento de velocidade fazendo isso (você pode ver uma pequena diminuição de velocidade), tudo o que obterá é complexidade adicional e a necessidade de digitar muitas declarações globais que não são necessárias.
Seria melhor usar dados estruturados, como objetos ou injeção de dependência ou, no seu caso, um conjunto de funções.
Por exemplo, aqui está um meio de fazer algo semelhante por meio de variáveis estáticas (ainda ruins pelas mesmas razões, mas um pouquinho menos e mais fáceis de digitar), por exemplo
Se você realmente deseja economizar tempo armazenando dados em algum lugar para reutilização, considere usar o
WP_Cache
sistema comwp_cache_get
etcfonte
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
como por sua sugestão. Obrigado!Não use variáveis globais , tão simples quanto isso.
Por que não usar globais
Porque o uso de globais torna mais difícil a manutenção do software a longo prazo.
O núcleo do WordPress tem muito a ver com o uso de globais. Ao tentar entender como as funções básicas funcionam
the_content
, você repentinamente percebe que a$more
variável não é local, mas global e precisa pesquisar todos os arquivos principais para entender quando é configurada como verdadeira.Então, o que pode ser feito ao tentar parar de copiar e colar várias linhas de código em vez de armazenar o resultado da primeira execução em um global? Existem várias abordagens, funcionais e OOP.
A função adoçante. É simplesmente um invólucro / macro para salvar a cópia / colar
Os benefícios são que agora existe uma documentação para o que o antigo global faz, e você tem um ponto óbvio para a depuração quando o valor retornado não é o esperado.
Depois de ter um adoçante, é fácil armazenar em cache o resultado, se necessário (faça-o apenas se você descobrir que essa função leva muito tempo para ser executada)
Isso fornece o mesmo comportamento de um global, mas com a vantagem de ter uma inicialização garantida toda vez que você o acessa.
Você pode ter padrões semelhantes com OOP. Acho que o OOP geralmente não agrega valor a plugins e temas, mas essa é uma discussão diferente
Este é um código desajeitado, mas se você tiver vários valores que gostaria de pré-calcular porque eles estão sempre sendo usados, esse pode ser um caminho a percorrer. Basicamente, este é um objeto que contém todos os seus globais de maneira organizada. Para evitar que uma instância desse objeto seja global (você deseja uma instância, caso contrário você recalcula os valores), convém usar um padrão singleton (algumas pessoas argumentam que é uma má idéia, YMMV)
Não gosto de acessar diretamente um atributo de objeto, portanto, no meu código, ele distorcerá um pouco mais
fonte
Sua pergunta está envolvida em como o php funciona.
Tome $ wpdb como exemplo
$ wpdb é uma variável global bem conhecida.
Você sabe quando será declarado e atribuído com valores?
Toda página carregada , sim, toda vez que você visita seu site wordpress.
Da mesma forma, você precisa garantir que as variáveis que deseja globalizar serão declaradas e atribuídas com os valores correspondentes a cada página carregada.
Embora eu não seja um designer de temas, posso dizer que o after_setup_theme é um gancho de uma vez. só será acionado quando o tema for ativado.
Se eu fosse você, usarei init ou outros ganchos. Não, se eu fosse você, não usarei variáveis globais ...
Eu realmente não sou bom em explicar as coisas. Portanto, você deve pegar um livro se quiser se aprofundar no PHP.
fonte
Você sempre pode usar um padrão singleton através de getters estáticos.
fonte