Mam zmienną w header.php, taką jak:
$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);
Kiedy to zrobię:
var_dump($page_extra_title);
Zawsze NULL
wychodzę poza head.php (var_dump działa poprawnie tylko w header.php). Wklejam tę samą zmienną wszędzie, gdzie jej potrzebuję (page.php, post.php, footer.php itp.), Ale jest to szaleństwo i sprawia, że wszystko jest prawie niemożliwe do utrzymania.
Zastanawiam się, jaki jest najlepszy sposób przekazania zmiennej przez wszystkie pliki w moim motywie? Chyba użycie funkcji.php razem z „get_post_meta” może nie być najlepszym pomysłem? :)
global
, prawda? Ale nie ma o tym dobrych powodów. Poza tym trzeba też „wywoływać”global
zmienne, używając słowa kluczowego, aby je udostępnić. W zależności od przypadku przypadki użycia mogą być rozwiązaniem. W przeciwnym razie - jak wspomniano - myślę, że funkcja lub klasa, która wykonuje dla ciebie pracę, jest właściwą drogą.Odpowiedzi:
Podstawowe oddzielne struktury danych
Aby przekazywać dane, zwykle używasz modelu (to jest „M” w „MVC”). Spójrzmy na bardzo prosty interfejs danych. Interfejsy są po prostu używane jako „Przepisy” dla naszych bloków konstrukcyjnych:
Powyżej znajduje się to, co przekazujemy: wspólny identyfikator i „etykieta”.
Wyświetlanie danych poprzez łączenie atomów
Następnie potrzebujemy trochę widoku, który negocjuje między naszym modelem a ... naszym szablonem.
Zasadniczo mówi interfejs
Wreszcie musimy wdrożyć powyższe i zbudować rzeczywisty Widok . Jak widać, konstruktor mówi, że obowiązkową cechą naszego widoku jest szablon i że możemy go renderować. W celu łatwego programowania sprawdzamy nawet, czy plik szablonu rzeczywiście jest obecny, dzięki czemu możemy ułatwić życie innym programistom (i naszym), i zauważmy to.
W drugim kroku w funkcji renderowania używamy zamknięcia do zbudowania faktycznego opakowania szablonu i
bindTo()
modelu do szablonu.Rozdzielanie widoku i renderowania
Oznacza to, że możemy użyć bardzo prostego szablonu, takiego jak poniższy
do renderowania naszych treści. Łącząc elementy, uzyskamy coś wokół następujących linii (w naszym Kontrolerze, Mediatorze itp.):
Co zyskaliśmy?
W ten sposób możemy
Łączenie OOP PHP z WP API
Oczywiście jest to prawie niemożliwe stosując podstawową funkcjonalność Skórki jak
get_header()
,get_footer()
itp, prawda? Źle. Po prostu zadzwoń do swoich klas w dowolnym szablonie lub części szablonu, którą chcesz. Renderuj, przekształć dane, rób co chcesz. Jeśli jesteś naprawdę miły, po prostu dodaj własny zestaw niestandardowych filtrów i poproś negocjatora, aby zadbał o to, co zostanie renderowane przez który kontroler na której trasie / szablon warunkowy zostanie załadowany.Wniosek?
Możesz bezproblemowo pracować z takimi rzeczami jak powyżej w WP i nadal trzymać się podstawowego interfejsu API oraz ponownie wykorzystywać kod i dane bez wywoływania pojedynczego globalnego lub bałaganu i zanieczyszczania globalnej przestrzeni nazw.
źródło
Jest to alternatywne podejście do odpowiedzi @kaiser , które uważam za całkiem w porządku (+1 ode mnie), ale wymaga dodatkowej pracy do użycia z podstawowymi funkcjami WP i samo w sobie jest zintegrowane z hierarchią szablonów.
Podejście, które chcę udostępnić, opiera się na jednej klasie (jest to wersja uproszczona z czegoś, nad czym pracuję), który zajmuje się renderowaniem danych dla szablonów.
Ma kilka interesujących funkcji (IMO):
$this
słowa kluczowego: daje to możliwość uniknięcia powiadomień podczas produkcji w przypadku niezdefiniowanych zmiennychEngine
Class(Dostępne tutaj jako Gist .)
Jak używać
Jedyne, czego potrzeba, to wywołanie
Engine::init()
metody, prawdopodobnie po'template_redirect'
podniesieniu słuchawki. Można to zrobić w temaciefunctions.php
lub z wtyczki.To wszystko.
Twoje istniejące szablony będą działać zgodnie z oczekiwaniami. Ale teraz masz możliwość dostępu do niestandardowych danych szablonu.
Niestandardowe dane szablonu
Do przekazywania niestandardowych danych do szablonów służą dwa filtry:
'gm_template_data'
'gm_template_data_{$type}'
Pierwszy jest uruchamiany dla wszystkich szablonów, drugi jest specyficzny dla szablonu, w rzeczywistości część dymamiczna
{$type}
jest baząame pliku szablonu bez rozszerzenia pliku.Np. Filtr
'gm_template_data_single'
może służyć do przekazywania danych dosingle.php
szablonu.Oddzwanianie dołączone do tych haków musi zwrócić tablicę , w której kluczami są nazwy zmiennych.
Na przykład możesz przekazywać metadane jako dane szablonu, więc:
A następnie w szablonie możesz po prostu użyć:
Tryb debugowania
Gdy obie stałe
WP_DEBUG
iWP_DEBUG_DISPLAY
są prawdziwe, klasa działa w trybie debugowania. Oznacza to, że jeśli zmienna nie jest zdefiniowana, generowany jest wyjątek.Gdy klasa nie znajduje się w trybie debugowania (prawdopodobnie w środowisku produkcyjnym), dostęp do niezdefiniowanej zmiennej spowoduje wyświetlenie pustego ciągu.
Modele danych
Dobrym i łatwym w utrzymaniu sposobem organizacji danych jest użycie klas modeli.
Mogą to być bardzo proste klasy, które zwracają dane przy użyciu tych samych filtrów opisanych powyżej. Nie ma konkretnego interfejsu do naśladowania, mogą być zorganizowane zgodnie z twoimi preferencjami.
Belowe, jest tylko przykład, ale możesz to zrobić na swój własny sposób.
__invoke()
Metoda (to działa, gdy klasa jest używana jak callback) zwraca ciąg być stosowane do<title>
tagu szablonu.Dzięki temu, że drugim przekazywanym argumentem
'gm_template_data'
jest nazwa szablonu, metoda zwraca niestandardowy tytuł strony głównej.Mając powyższy kod, można wtedy użyć czegoś takiego
w
<head>
sekcji strony.Częściowe
WordPress posiada funkcje podobne
get_header()
lubget_template_part()
które mogą być wykorzystane do załadowania partials w głównym szablonie.Te funkcje, podobnie jak wszystkie inne funkcje WordPress, mogą być używane w szablonach podczas korzystania z
Engine
klasy.Jedyny problem polega na tym, że w częściach załadowanych przy użyciu podstawowych funkcji WordPress nie można użyć zaawansowanej funkcji uzyskiwania niestandardowych danych szablonu
$this
.Z tego powodu
Engine
klasa ma metodę,partial()
która pozwala na załadowanie częściowego (w sposób w pełni zgodny z motywem potomnym) i nadal jest w stanie używać częściowo niestandardowych danych szablonu.Użycie jest dość proste.
Zakładając, że istnieje plik o nazwie
partials/content.php
wewnątrz folderu motywu (lub motywu potomnego), można go dołączyć, używając:Wewnątrz tej częściowej będzie można uzyskać dostęp do wszystkich danych motywu nadrzędnego w ten sam sposób.
W przeciwieństwie do funkcji WordPress,
Engine::partial()
metoda pozwala przekazywać określone dane do częściowych, po prostu przekazując tablicę danych jako drugi argument.Domyślnie częściowe mają dostęp do danych dostępnych w motywie nadrzędnym i do przekazywanych danych wyjaśniających.
Jeśli jakaś zmienna jawnie przekazana do częściowej ma taką samą nazwę nadrzędnej zmiennej motywu, wówczas zmienna jawnie przekazana wygrywa.
Jednak możliwe jest również włączenie częściowego w trybie izolowanym , tj. Częściowy nie ma dostępu do danych motywu nadrzędnego. Aby to zrobić, wystarczy przekazać
true
trzeci argument dopartial()
:Wniosek
Nawet jeśli dość prosta,
Engine
klasa jest dość kompletna, ale z pewnością można ją jeszcze ulepszyć. Np. Nie ma możliwości sprawdzenia, czy zmienna jest zdefiniowana, czy nie.Dzięki 100% kompatybilności z funkcjami WordPress i hierarchią szablonów możesz bez problemu zintegrować go z istniejącym i zewnętrznym kodem.
Należy jednak pamiętać, że jest tylko częściowo testowany, więc możliwe są problemy, których jeszcze nie odkryłem.
Pięć punktów w części „Co zyskaliśmy?” w odpowiedzi @kaiser :
są również ważne dla mojej klasy.
źródło
Prosta odpowiedź, nigdzie nie przesyłaj zmiennych, ponieważ śmierdzi używaniem zmiennych globalnych, które są złe.
Z twojego przykładu wydaje się, że próbujesz dokonać wczesnej optymalizacji, jeszcze jednego zła;)
Użyj wordpress API, aby uzyskać dane przechowywane w DB i nie próbuj przechytrzyć i zoptymalizować jego użycie, ponieważ API robi więcej niż tylko pobieranie wartości i aktywuje filtry i akcje. Usuwając wywołanie API, usuwasz zdolność innych programistów do zmiany zachowania twojego kodu bez modyfikacji.
źródło
Chociaż odpowiedź Kaiser jest technicznie poprawna, wątpię, by była dla ciebie najlepszą odpowiedzią.
Jeśli tworzysz własny motyw, myślę, że to naprawdę najlepszy sposób na skonfigurowanie jakiegoś frameworka za pomocą klas (a może także przestrzeni nazw i interfejsów, chociaż może to być trochę za dużo dla motywu WP).
Z drugiej strony, jeśli tylko poszerzasz / dostosowujesz istniejący motyw i potrzebujesz tylko przekazać jedną lub kilka zmiennych, myślę, że powinieneś się trzymać
global
. Ponieważheader.php
jest zawarty w funkcji, zmienne zadeklarowane w tym pliku są użyteczne tylko w tym pliku. Poglobal
udostępnieniu ich w całym projekcie WP:W
header.php
:W
single.php
(na przykład):źródło
$wp_theme_vars_page_extra_title
lub$wp_theme_vars['page_extra_title']
na przykład. To było tylko wyjaśnienie, dlaczego globalny miałby tutaj działać. OP poprosił o sposób przepuszczenia zmiennej przez wszystkie pliki, używającglobal
jest na to sposób.but it is really bad practice diving into the global scope
Chciałbym, żeby ktoś powiedział to deweloperom WP. Naprawdę nie rozumiem sensu używania przestrzeni nazw, abstrakcji danych, wzorców projektowych, testów jednostkowych i innych najlepszych praktyk / technik programistycznych w kodzie napisanym dla Wordpress, gdy rdzeń Wordpress jest zaśmiecony złymi praktykami kodowania, takimi jak zmienne glabal (np. Widżety kod).Łatwym rozwiązaniem jest napisanie funkcji, aby uzyskać dodatkowy tytuł. Używam zmiennej statycznej, aby zachować wywołania bazy danych tylko do jednego. Umieść to w swojej funkcji.php.
Poza header.php, wywołaj funkcję, aby uzyskać wartość:
źródło