Eu tenho uma variável no header.php, como:
$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);
Uma vez que eu faço:
var_dump($page_extra_title);
Eu sempre NULL
saio do header.php (o var_dump funciona corretamente apenas no header.php). Eu tenho colado a mesma variável em todos os lugares que eu preciso (page.php, post.php, footer.php etc.), mas é loucura e torna tudo quase impossível de manter.
Gostaria de saber qual é a melhor maneira de passar uma variável através de todos os arquivos no meu tema? Eu acho que usar o functions.php junto com "get_post_meta" pode não ser a melhor idéia? :)
global
, certo? Mas está fora de questão por boas razões. Além de você ter que "chamar"global
variáveis também, usando a palavra-chave para torná-las disponíveis. Dependendo das sessões de casos de uso, pode ser uma solução. Caso contrário - como mencionado -, acho que uma função ou classe para fazer o trabalho para você é o caminho a percorrer.Respostas:
Estruturas de dados separadas básicas
Para passar dados, você normalmente utiliza um Modelo (esse é o "M" em "MVC"). Vejamos uma interface muito simples para dados. As interfaces são usadas apenas como "Receitas" para nossos blocos de construção:
Acima é o que passamos: Um ID comum e um "Label".
Exibindo dados combinando peças atômicas
Em seguida, precisamos de uma visão que negocie entre nosso modelo e ... nosso modelo.
Basicamente, a interface diz
Finalmente, precisamos implementar acima e criar a visualização atual . Como você pode ver, o construtor diz que a coisa obrigatória para nossa visão é um modelo e que podemos renderizá-lo. Para facilitar o desenvolvimento, verificamos se o arquivo do modelo está realmente presente, para facilitar a vida de outros desenvolvedores (e também a nossa) muito mais e observamos isso.
Em uma segunda etapa na função render, usamos um Closure para criar o wrapper de modelo real e
bindTo()
o Model para o modelo.Separando a vista e a renderização
Isso significa que podemos usar um modelo muito simples como o seguinte
para renderizar nosso conteúdo. Juntando as peças, obteríamos algo em torno das seguintes linhas (em nosso Controller, Mediador, etc.):
O que ganhamos?
Desta forma, podemos
Combinando OOP PHP com a API WP
Claro que isto é praticamente impossível usando a funcionalidade básica theming como
get_header()
,get_footer()
, etc., certo? Errado. Basta ligar para suas aulas em qualquer modelo ou parte do modelo que você desejar. Renderize, transforme os dados, faça o que quiser. Se você é realmente legal, basta adicionar seu próprio grupo de filtros personalizados e ter um negociador para cuidar do que é renderizado por qual controlador em qual rota / modelo condicional é carregado.Conclusão?
Você pode trabalhar com coisas como acima no WP sem nenhum problema e ainda manter a API básica e reutilizar códigos e dados sem chamar uma única global ou desarrumar e poluir o espaço de nome global.
fonte
Esta é uma abordagem alternativa ao @kaiser resposta do , que achei muito boa (+1 de mim), mas requer trabalho adicional para ser usado com as principais funções do WP e, por si só, é pouco integrado à hierarquia de modelos.
A abordagem que quero compartilhar é baseada em uma única classe (é uma versão simplificada de algo em que estou trabalhando) que cuida da renderização de dados para modelos.
Possui alguns recursos interessantes (IMO):
$this
palavra-chave: isso permite evitar avisos de produção no caso de variáveis indefinidasA
Engine
classe(Disponível como Gist aqui.)
Como usar
A única coisa necessária é chamar o
Engine::init()
método, provavelmente no'template_redirect'
gancho. Isso pode ser feito no temafunctions.php
ou em um plugin.Isso é tudo.
Seus modelos existentes funcionarão conforme o esperado. Mas agora você tem a possibilidade de acessar dados de modelo personalizados.
Dados do modelo personalizado
Para passar dados personalizados para modelos, existem dois filtros:
'gm_template_data'
'gm_template_data_{$type}'
O primeiro é acionado para todos os modelos, o segundo é específico do modelo; na verdade, a parte dinâmica
{$type}
é o nome base do arquivo de modelo sem extensão de arquivo.Por exemplo, o filtro
'gm_template_data_single'
pode ser usado para passar dados para osingle.php
modelo.Os retornos de chamada anexados a esses ganchos precisam retornar uma matriz , onde as chaves são os nomes das variáveis.
Por exemplo, você pode transmitir metadados como os dados do modelo gostam:
E então, dentro do modelo, você pode simplesmente usar:
Modo de depuração
Quando as constantes
WP_DEBUG
eWP_DEBUG_DISPLAY
são verdadeiras, a classe funciona no modo de depuração. Isso significa que, se uma variável não for definida, uma exceção será lançada.Quando a classe não está no modo de depuração (provavelmente em produção), acessar uma variável indefinida produzirá uma sequência vazia.
Modelos de dados
Uma maneira agradável e sustentável de organizar seus dados é usar classes de modelo.
Eles podem ser classes muito simples, que retornam dados usando os mesmos filtros descritos acima. Não existe uma interface específica a seguir, eles podem ser organizados de acordo com a sua preferência.
Abaixo, há apenas um exemplo, mas você é livre para fazer à sua maneira.
O
__invoke()
método (que é executado quando uma classe é usada como um retorno de chamada) retorna uma string a ser usada para a<title>
tag do modelo.Graças ao fato de o segundo argumento passado
'gm_template_data'
ser o nome do modelo, o método retorna um título personalizado para a página inicial.Tendo o código acima, é possível usar algo como
na
<head>
seção da página.Parciais
O WordPress possui funções como
get_header()
ouget_template_part()
que podem ser usadas para carregar parciais no modelo principal.Essas funções, assim como todas as outras funções do WordPress, podem ser usadas em modelos ao usar a
Engine
classe.O único problema é que, dentro das parciais carregadas usando as principais funções do WordPress, não é possível usar o recurso avançado de obter dados de modelo personalizados
$this
.Por esse motivo, a
Engine
classe possui um métodopartial()
que permite carregar um parcial (de maneira totalmente compatível com o tema filho) e ainda poder usar em parciais os dados do modelo personalizado.O uso é bem simples.
Supondo que exista um arquivo nomeado
partials/content.php
dentro da pasta theme (ou tema filho), ele pode ser incluído usando:Dentro dessa parcial será possível acessar todos os dados do tema pai da mesma maneira.
Diferentemente das funções do WordPress, o
Engine::partial()
método permite passar dados específicos para parciais, simplesmente passando uma matriz de dados como segundo argumento.Por padrão, os parciais têm acesso aos dados disponíveis no tema pai e aos dados transmitidos explicitamente.
Se alguma variável passada explicitamente para parcial tiver o mesmo nome de uma variável de tema pai, a variável passada explicitamente vencerá.
No entanto, também é possível incluir uma parcial no modo isolado , ou seja, a parcial não tem acesso aos dados do tema pai. Para fazer isso, basta passar
true
como terceiro argumento parapartial()
:Conclusão
Mesmo se bem simples, a
Engine
classe é bastante completa, mas certamente pode ser melhorada ainda mais. Por exemplo, não há como verificar se uma variável está definida ou não.Graças à sua compatibilidade 100% com os recursos do WordPress e a hierarquia de modelos, você pode integrá-lo ao código existente e de terceiros sem problemas.
No entanto, observe que é apenas parcialmente testado, portanto, é possível que haja problemas que ainda não descobri.
Os cinco pontos em "O que ganhamos?" na resposta @kaiser :
também são válidos para a minha turma.
fonte
Resposta simples, não passe variáveis em lugar algum, pois fede ao uso de variáveis globais que são más.
Do seu exemplo, parece que você está tentando fazer uma otimização precoce, mais um mal;)
Use a API do wordpress para obter dados armazenados no banco de dados e não tente enganar e otimizar seu uso, pois a API faz mais do que apenas recuperar valores e ativar filtros e ações. Ao remover a chamada da API, você remove a capacidade de outros desenvolvedores de alterar o comportamento do seu código sem modificá-lo.
fonte
Embora a resposta do kaiser seja tecnicamente correta, duvido que seja a melhor resposta para você.
Se você está criando seu próprio tema, acho que é realmente a melhor maneira de configurar algum tipo de estrutura usando classes (e talvez espaços para nome e interfaces também, embora isso possa ser um pouco demais para um tema WP).
Por outro lado, se você está apenas estendendo / ajustando um tema existente e precisa passar apenas uma ou algumas variáveis, acho que você deve continuar
global
. Comoheader.php
está incluído em uma função, as variáveis que você declara nesse arquivo são utilizáveis apenas nesse arquivo. Comglobal
você torná-los acessíveis em todo o projeto WP:Em
header.php
:Na
single.php
(por exemplo):fonte
$wp_theme_vars_page_extra_title
ou$wp_theme_vars['page_extra_title']
por exemplo. Era apenas uma explicação do porquê o global funcionaria aqui. O OP pediu uma maneira de passar uma variável por todos os arquivos, usandoglobal
é uma maneira de fazer isso.but it is really bad practice diving into the global scope
Eu gostaria que alguém dissesse isso aos desenvolvedores principais do WP. Realmente não entendo o uso de espaços para nome, abstração de dados, padrões de design, teste de unidade e outras práticas / técnicas de programação em código escrito para o Wordpress quando o núcleo do Wordpress está repleto de práticas de codificação ruins, como variáveis glabal (por exemplo, os widgets código).Uma solução fácil é escrever uma função para obter o título extra. Eu uso uma variável estática para manter as chamadas do banco de dados em apenas uma. Coloque isso em seu functions.php.
Fora do header.php, chame a função para obter o valor:
fonte