Alcance de variables del tema de WordPress

9

Necesito crear una variable a la que se pueda acceder a través de mis archivos de plantilla de tema de WordPress (index.php, header.php, etc.). Sé que las definiciones de funciones van dentro del functions.phparchivo de plantilla (en la ruta de su tema), pero las variables no existen.

Por ejemplo, constantemente necesito recuperar Categorías en mi Tema, por lo que me gustaría tener esto accesible desde cualquier parte de mi tema:

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

De esta manera, simplemente puedo acceder a los datos asignados, sin tener que reasignarlos cada vez que necesito obtener mis categorías.

Desafortunadamente, agregar ese fragmento de código en mi functions.phparchivo no funciona, tampoco lo hace la variable global.

Gonçalo Peres 龚燿禄
fuente

Respuestas:

5

Aparentemente globalhace el truco. El problema era que mi variable $categoriesdebería haber sido redefinida con un globalfrente, en cada plantilla que necesitaba usar.


fuente
2
¿Alguien más conoce una solución más intuitiva que tener que redefinirla como global en cada archivo de plantilla? Utilizo este método para desarrollar mi tema y parece ... fuera de lugar.
1
Impresionante amigo, gracias! Para cualquier persona lista que sea un poco gruesa como yo: en su archivo functions.php: <? Php $ test = "I'm a test!"; ?> En su, no sé, header.php: <? Php global $ test; echo $ prueba; ?> y eres dorado!
Dominic
Si esto ayuda a aclarar: todos los archivos de plantilla en WordPress son llamados por require()las declaraciones que se envuelven en funciones: get_header(), get_footer(), etc; que son envoltorios alrededor de la función get_template_part(). Como las funciones en PHP solo tienen acceso a las variables definidas dentro de ellas o pasadas por referencia a ellas, si desea utilizar una variable del ámbito global (o definir una variable y hacerla accesible en el ámbito global) debe anunciarla. con la palabra clave global primero.
goldenapples
1

Dominic (no sé cómo agregar una nota a su respuesta):

define solo acepta escalares, por lo que no podría hacerlo define( CATS, get_categories() ); y ni siquiera

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

De lo contrario, define funciona bien, y de hecho es más seguro para los escalares (ya que puede estar seguro de que las constantes no se pueden sobrescribir)


fuente
1

Sé que este es realmente viejo, pero hay un margen de mejora.

Debería considerar usar $ GLOBALS ['categorías'] en lugar de solo global.

Hay dos razones para esto:

  1. No tenemos que escribir todo el tiempo global $categories;.
  2. Está claro como el cristal que estamos usando global y luego no.

Considera este código:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Solo si inicializamos el estado global justo antes de usar la variable, es bastante difícil saber si es global o no. Y no olvide repetirlo en cualquiera de los archivos de plantilla que tenga.

Es posible usar convenciones de nomenclatura para eso, pero hay una mejor manera, en mi opinión.

Considera usar $GLOBALS['categories'].

Solo tenemos que inicializar nuestra variable una vez en functions.php sin tener que pensar de global $categoriesnuevo. Y podemos ver que es global.

print_r ($GLOBALS['categories']);

El problema de rendimiento no es un problema en absoluto en esta situación. Citaré a Sara Golemon ( enlace ):

¿Qué significa eso para su uso de la matriz $ GLOBALS? Así es, la palabra clave global es técnicamente más rápida. Ahora, quiero ser realmente claro sobre una cosa aquí. La capacidad de velocidad menor dada al utilizar sus globales como [variables compiladas] localizadas debe sopesarse seriamente con la facilidad de mantenimiento de mirar su código en cinco años y saber que $ foo provino del alcance global. something_using ($ GLOBALS ['foo']); SIEMPRE será más claro para usted en el futuro que $ global foo; / * código buncha * / something_using ($ foo); No seas centavo y tonto.

Keeprock
fuente
0

Esto también funciona:

en functions.php add define('TEST', 'this is a test');
y en su header.php o lo que seaecho TEST;

¿Hay alguna ventaja de rendimiento para un método sobre otro?

Dominic
fuente