Portée des variables du thème WordPress

9

J'ai besoin de créer une variable accessible à travers mes fichiers de modèles WordPress Theme (index.php, header.php etc.). Je sais que les définitions de fonction vont à l'intérieur du functions.phpfichier de modèle (dans votre chemin d'accès au thème), mais il n'y a rien de tel pour les variables.

Par exemple, j'ai constamment besoin de récupérer des catégories dans mon thème, donc je voudrais que cela soit accessible de n'importe où dans mon thème:

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

De cette façon, je peux simplement accéder aux données allouées, sans avoir à les réallouer chaque fois que j'ai besoin d'obtenir mes catégories.

Malheureusement, l'ajout de ce morceau de code dans mon functions.phpfichier ne fonctionne pas, ni la création de la variable global.

Gonçalo Peres 龚燿禄
la source

Réponses:

5

Apparemment globalfait l'affaire. Le problème était que ma variable $categoriesaurait dû être redéfinie avec un globaldevant, dans chaque modèle dont j'avais besoin pour l'utiliser.


la source
2
Quelqu'un d'autre connaît-il une solution plus intuitive que d'avoir à la redéfinir comme globale dans chaque fichier de modèle? J'utilise cette méthode pour développer mon thème et ça a l'air ... hors de propos.
1
Mec génial, merci! Pour tous ceux qui sont prêts à le faire et qui sont un peu épais comme moi: Dans votre fichier functions.php: <? Php $ test = "I'm a test!"; ?> Dans votre, je ne sais pas, header.php: <? Php global $ test; echo $ test; ?> et vous êtes en or!
Dominic
Si cela aide à clarifier: tous les fichiers de modèle dans WordPress sont appelés par des require()déclarations qui sont enveloppées dans des fonctions: get_header(), get_footer(), etc; qui sont eux-mêmes des enveloppes autour de la fonction get_template_part(). Étant donné que les fonctions en PHP n'ont accès qu'aux variables définies en leur sein ou transmises par référence à celles-ci, si vous souhaitez utiliser une variable de la portée globale (ou définir une variable et la rendre accessible dans la portée globale), vous devez l'annoncer. avec le mot-clé global en premier.
goldenapples
1

Dominic (ne sait pas comment ajouter une note à sa réponse):

définir accepte uniquement les scalaires, donc vous ne pouvez pas le faire define( CATS, get_categories() ); et même pas

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

Sinon, définir fonctionne correctement, et c'est en fait plus sûr pour les scalaires (car vous pouvez être sûr que les constantes ne peuvent pas être écrasées)


la source
1

Je sais que celui-ci est vraiment ancien, mais il y a place à amélioration.

Vous devriez envisager d'utiliser $ GLOBALS ['categories'] au lieu de simplement global.

Il y a deux raisons à cela:

  1. Nous n'avons pas à écrire à global $categories;chaque fois.
  2. Il est clair que nous utilisons global et non.

Considérez ce code:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Ce n'est que si nous initialisons l'état global juste avant d'utiliser une variable, qu'il est assez difficile de dire s'il est global ou non. Et n'oubliez pas de le répéter dans l'un des fichiers de modèle que vous avez.

Il est possible d'utiliser des conventions de dénomination pour cela, mais il y a une meilleure façon, à mon avis.

Pensez à utiliser $GLOBALS['categories'].

Nous n'avons qu'à initialiser notre variable une fois dans functions.php sans avoir à y repenser global $categories. Et nous pouvons voir que c'est mondial.

print_r ($GLOBALS['categories']);

Le problème de performance n'est pas du tout un problème dans cette situation. Je vais citer Sara Golemon ( lien ):

Qu'est-ce que cela signifie pour votre utilisation du tableau $ GLOBALS? C'est vrai, le mot-clé global est techniquement plus rapide. Maintenant, je veux être vraiment clair sur une chose ici. La faible accessibilité à la vitesse donnée par l'utilisation de vos globaux comme [variables compilées] localisées doit être sérieusement mise en balance avec la maintenabilité de regarder votre code dans cinq ans et sachant que $ foo est venu de la portée mondiale. quelque chose_utilisant ($ GLOBALS ['foo']); sera TOUJOURS plus clair pour vous sur toute la ligne que global $ foo; / * code buncha * / something_using ($ foo); Ne soyez pas sage et livre insensé ..

Keeprock
la source
0

Cela fonctionne également:

dans functions.php ajouter define('TEST', 'this is a test');
et dans votre header.php ou autreecho TEST;

Y a-t-il un avantage de performance à une méthode par rapport à une autre?

Dominique
la source