Zakres zmiennych motywu WordPress

9

Muszę utworzyć zmienną, do której można uzyskać dostęp w plikach szablonów WordPress Theme (index.php, header.php itp.). Wiem, że definicje funkcji wchodzą do functions.phppliku szablonu (na ścieżce motywu), ale nie ma czegoś takiego w przypadku zmiennych.

Na przykład stale muszę pobierać kategorie w moim motywie, dlatego chciałbym, aby był dostępny z dowolnego miejsca w moim motywie:

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

W ten sposób mogę po prostu uzyskać dostęp do przydzielonych danych, bez konieczności ponownego przydzielania ich za każdym razem, gdy potrzebuję uzyskać moje kategorie.

Niestety dodanie tego fragmentu kodu do mojego functions.phppliku nie działa, podobnie jak tworzenie zmiennej global.

Gonçalo Peres 龚燿禄
źródło

Odpowiedzi:

5

Najwyraźniej załatwia globalsprawę. Problem polegał na tym, że moja zmienna $categoriespowinna zostać na nowo z globalprzed nim, w każdym szablonie potrzebowałem go używać.


źródło
2
Czy ktoś wie o bardziej intuicyjnym rozwiązaniu niż konieczność redefiniowania go jako globalnego w każdym pliku szablonu? Używam tej metody do rozwijania mojego motywu i wygląda on ... nie na miejscu.
1
Świetny koleś, dzięki! Dla każdego, kto jest gotowy tak gruby jak ja: W twoim pliku functions.php: <? Php $ test = "I'm a test!"; ?> W twoim, nie wiem, header.php: <? Php global $ test; test echa $; ?> i jesteś złoty!
Dominic
Jeśli to pomaga wyjaśnić: wszystkie pliki szablonu w WordPress nazywane są require()wypowiedzi, które są zapakowane w funkcji: get_header(), get_footer()itp; które same są opakowaniami wokół funkcji get_template_part(). Ponieważ funkcje w PHP mają dostęp tylko do zdefiniowanych w nich zmiennych lub przekazanych przez odniesienie do nich, jeśli chcesz użyć zmiennej z zakresu globalnego (lub zdefiniować zmienną i udostępnić ją w zakresie globalnym), musisz ją ogłosić najpierw z globalnym słowem kluczowym.
goldenapples
1

Dominic (nie wiem, jak dodać notatkę do swojej odpowiedzi):

Zdefiniuj akceptuje tylko skalary, więc nie możesz tego zrobić, define( CATS, get_categories() ); a nawet nie

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

W przeciwnym razie zdefiniowanie działa dobrze i jest w rzeczywistości bezpieczniejsze dla skalarów (ponieważ możesz być pewien, że stałych nie da się zastąpić)


źródło
1

Wiem, że ten jest naprawdę stary, ale istnieje pole do poprawy.

Powinieneś rozważyć użycie $ GLOBALS ['kategorie'] zamiast tylko globalnego.

Istnieją dwa powody:

  1. Nie musimy pisać global $categories;za każdym razem.
  2. To jasne, że używamy globalnych, a potem nie.

Rozważ ten kod:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Tylko jeśli zainicjujemy stan globalny tuż przed użyciem zmiennej, trudno jest stwierdzić, czy jest ona globalna, czy nie. I nie zapomnij powtórzyć go w jednym z plików szablonów, które masz.

Można do tego wykorzystać konwencje nazewnictwa, ale moim zdaniem istnieje lepszy sposób.

Rozważ użycie $GLOBALS['categories'].

Musimy zainicjować naszą zmienną tylko raz w functions.php, bez konieczności global $categoriesponownego myślenia . I widzimy, że jest globalny.

print_r ($GLOBALS['categories']);

W tej sytuacji problem z wydajnością wcale nie stanowi problemu. Zacytuję Sara Golemon ( link ):

Co to oznacza dla twojego korzystania z tablicy $ GLOBALS? Zgadza się, globalne słowo kluczowe jest technicznie szybsze. Teraz chcę jasno powiedzieć o jednej rzeczy tutaj. Niewielka afordancja prędkości, wynikająca z używania globali jako zlokalizowanych [skompilowanych zmiennych], musi zostać poważnie rozważona w stosunku do możliwości utrzymania twojego kodu w ciągu pięciu lat i świadomości, że $ foo pochodzi z globalnego zasięgu. something_using ($ GLOBALS ['foo']); ZAWSZE będą dla ciebie jaśniejsze niż globalne $ foo; / * kod pęczka * / coś_use ($ foo); Nie bądź głupi i głupiutki ...

Keeprock
źródło
0

Działa to również:

w functions.php add define('TEST', 'this is a test');
oraz w pliku header.php lub cokolwiek innegoecho TEST;

Czy istnieje jakaś przewaga wydajności jednej metody nad drugą?

Dominik
źródło