Ambito delle variabili del tema WordPress


9

Devo creare una variabile a cui è possibile accedere attraverso i miei file di modello di temi WordPress (index.php, header.php ecc.). So che le definizioni delle funzioni vanno all'interno del functions.phpfile modello (nel percorso del tema), ma non esiste una cosa del genere per le variabili.

Ad esempio, devo costantemente recuperare le categorie nel mio tema, quindi vorrei averlo accessibile da qualsiasi parte del mio tema:

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

In questo modo posso semplicemente accedere ai dati allocati, senza doverlo riassegnare ogni volta che devo ottenere le mie categorie.

Sfortunatamente l'aggiunta di quel pezzo di codice nel mio functions.phpfile non funziona, né rende la variabile global.

Risposte:


5

Apparentemente globalfa il trucco. Il problema era che la mia variabile $categoriesavrebbe dovuto essere ridefinita con una globaldavanti, in ogni modello che avevo bisogno di usarla.


2
Qualcun altro conosce una soluzione più intuitiva rispetto alla necessità di ridefinirla come globale in ogni file modello? Uso questo metodo per sviluppare il mio tema e sembra ... fuori posto.

1
Fantastico amico, grazie! Per chiunque sia pronto, chi è un po 'grosso come me: nel tuo file Functions.php: <? Php $ test = "I'm a test!"; ?> Nel tuo, non lo so, header.php: <? Php global $ test; $ test; ?> e sei d'oro!
Dominic,

Se questo aiuta a chiarire: tutti i file dei modelli di WordPress sono chiamati da require()dichiarazioni che vengono avvolti in funzioni: get_header(), get_footer(), ecc; che a loro volta sono avvolgenti attorno alla funzione get_template_part(). Poiché le funzioni in PHP hanno accesso solo alle variabili definite al loro interno o passate in riferimento ad esse, se si desidera utilizzare una variabile dall'ambito globale (o definire una variabile e renderla accessibile nell'ambito globale) è necessario annunciarla prima con la parola chiave globale .
goldenapples,

1

Domenico (non so come aggiungere una nota alla sua risposta):

define accetta solo scalari, quindi non puoi farlo define( CATS, get_categories() ); e nemmeno

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

Altrimenti, definire funziona bene ed è in effetti più sicuro per gli scalari (poiché puoi essere sicuro che le costanti non possano essere sovrascritte)


1

So che questo è davvero vecchio, ma c'è un margine di miglioramento.

Dovresti considerare di usare $ GLOBALS ['categorie'] invece che semplicemente globali.

Ci sono due ragioni per questo:

  1. Non dobbiamo scrivere global $categories;ogni volta.
  2. È cristallino quindi stiamo usando globale e quindi no.

Considera questo codice:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Solo se inizializziamo lo stato globale prima di usare la variabile, è piuttosto difficile dire se è globale o no. E non dimenticare di ripeterlo in uno qualsiasi dei file modello che hai.

È possibile usare convenzioni di denominazione per questo, ma secondo me c'è un modo migliore.

Prendi in considerazione l'utilizzo $GLOBALS['categories'].

Dobbiamo solo inizializzare la nostra variabile una volta in Functions.php senza dover ripensarci global $categories. E possiamo vedere che è globale.

print_r ($GLOBALS['categories']);

Il problema delle prestazioni non è affatto un problema in questa situazione. Citerò Sara Golemon ( link ):

Cosa significa questo per l'utilizzo dell'array $ GLOBALS? Esatto, la parola chiave globale è tecnicamente più veloce. Ora, voglio essere molto chiaro su una cosa qui. La minore velocità offerta dall'uso dei globuli come [variabili compilate] localizzate deve essere seriamente valutata rispetto alla manutenibilità di guardare il codice in cinque anni e di sapere che $ foo proviene dall'ambito globale. something_using ($ GLOBALS [ 'foo']); sarà SEMPRE più chiaro per te rispetto al $ foo globale; / * codice buncha * / something_using ($ foo); Non essere pazzo e pazzo


0

Questo funziona anche:

in function.php aggiungi define('TEST', 'this is a test');
e nel tuo header.php o altroecho TEST;

C'è qualche vantaggio prestazionale in un metodo rispetto a un altro?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.