Czy jest gdzieś dokumentacja, która wyjaśnia, jaki jest cykl życia wtyczek?
Zaczynam nową wtyczkę w stylu OOP i właśnie dowiedziałem się, że moja główna klasa jest bardzo aktywna (dzięki Xdebug i Netbeans).
Zastanawiam się, dlaczego i denerwuje mnie to, ponieważ inicjuję obiekt Dropbox-API, i naprawdę nie sądziłem, że WordPress po prostu zainicjuje moją główną klasę.
Nie znalazłem nic związanego z cyklem życia wtyczek w Kodeksie ani w Google.
plugin-development
codex
RitonLaJoie
źródło
źródło
Odpowiedzi:
Co oznacza dla Ciebie „styl OOP”? Zawijasz wszystkie funkcje w instrukcję klasy? Więc robisz to źle. Tęsknisz za klasą jako przestrzenią nazw.
Co?
Wypróbuj i policz liczbę utworzonych plików. Jeśli spróbuję, dla każdego żądania strony zostanie utworzony jeden plik. Oznacza to tylko jedno wystąpienie klasy Foo dla każdego żądania strony.
Spróbujmy wezwania do działania
Jeśli zajrzę do mojego katalogu treści wp, znalazłem dwa pliki. Już nie. Jeden plik jest tworzony podczas tworzenia instancji klasy. Jeden jest tworzony po zakończeniu akcji.
OK, zróbmy kilka głupich rzeczy z naszą instancją. Usuń
add_action( 'plugins_loaded', .. )
i dodaj ten kod zamiast:Ile oczekujesz plików? Oczekuję dwóch. Jeden od konstruktora, drugi od metody.
Nowa instancja jest tworzona tylko wtedy, gdy
new
używany jest operator.Teraz liczę cztery pliki. Dwa z konstruktora i dwa z metody. Wynika to z faktu, że WordPress najpierw dołącza wtyczkę, a następnie wykonuje hak akcji
plugins_loaded
.Najlepszą praktyką jest używanie haka akcji
plugins_loaded
zamiast tworzenia instancji z funkcji, ponieważ jeśli plik wtyczki jest zawarty w dowolnym miejscu (np. W innym pliku wtyczki), nowe wystąpienie klasy jest tworzone za każdym razem, gdy plik jest dołączany. Hak akcjiplugins_loaded
jest wykonywany tylko raz dla każdego żądania strony.źródło
Może się zdarzyć, że przekażesz kopię swojej klasy do filtra lub akcji. Na przykład, jeśli chcesz bezpośrednio zmodyfikować zmienne klasy wewnątrz haka lub filtra, powinieneś również przekazać hak przez referencję
zamiast
Jak wspomniano w bainternet, możesz również użyć wzorca singletonu, aby upewnić się, że określony obiekt jest zaimplementowany tylko raz (kolejne wywołania zwracają odniesienie do tego obiektu).
Możesz również rozważyć ustawienie niektórych funkcji na statyczne (poprzez nadanie im słowa kluczowego static. Zwykle dzieje się to w przypadku funkcji pomocniczych, które nie wchodzą w interakcje z resztą klasy. Metody statyczne można wywoływać bez instancji klasy.
Możesz także przekazać funkcje statyczne do akcji / filtra:
Sprawdziłem również http://codex.wordpress.org/Plugin_API/Action_Reference i stwierdziłem, że wtyczki mogą być ładowane tylko w dwóch etapach żądania (muplugins_loaded i plugins_loaded).
źródło