Cała dokumentacja, którą napotkałem, omawia nadpisywanie funkcji wtykowych za pośrednictwem wtyczki.
Co jeśli zamiast tego zajmujesz się tworzeniem motywów?
Moje funkcje.php wymagają innego pliku, który przesłania get_user_by()
funkcję zdefiniowaną w pluggable.php
.
Jeśli if( function_exists() )
pominę połączenie, pojawia się błąd „Nie można ponownie ustalić ...”.
Jeśli dołączę if( function exists() )
wywołanie, nie otrzymam błędu, ale oczywiście moja funkcja zostanie zignorowana, ponieważ istnieje wersja wtykowa.
W oparciu o niesamowity post Dominica na temat kolejności uruchamiania WordPress , jasne pluggable.php
jest, że jest ładowany przed motywem functions.php
i tak dalej, więc wyjaśnia to błąd.
Pytanie brzmi: w jaki sposób można skorzystać z tej ładnej architektury wtykanej z poziomu motywu, bez uciekania się do pisania wtyczek, które następnie muszą zostać dołączone lub zainstalowane razem z motywem?
Dalsze uwagi : Wydaje się, że argumentem jest to, że motywy nie powinny próbować robić tego, co robią wtyczki. Ale ten argument ma ponad cztery lata (zgodnie z 4-cyfrowym numerem śledzenia). Chciałbym usłyszeć od niektórych ciężkich hitterów, czy ta filozofia nadal ma zastosowanie, biorąc pod uwagę złożoną topologię dzisiejszego krajobrazu rozwoju tematu. Chciałbym wierzyć, że ewoluowaliśmy od tego czasu.
Kontekst : Opracowuję jednorazowe rozwiązanie CMS dla klienta z dużą ilością niestandardowych metadanych, dostosowywanie zaplecza administratora, proces logowania / uwierzytelniania, działa. I oczywiście jest element projektu - tam właśnie pojawia się część tematyczna. Faktem jest, że po prostu nie są to komponenty wielokrotnego użytku - nigdy nie będą miały zastosowania do innego klienta, nigdy nie zostaną objęte GPL i będą dostępne na zasadzie open source, i są najbardziej z pewnością nie będzie dystrybuowany / instalowany w innych wdrożeniach WordPress. W najlepszym razie są pewne najlepsze praktyki, które wykorzystam w przyszłych projektach, ale będzie to ściśle praca referencyjna / kopiuj-wklej.
To nie brzmi jak przypadek użycia wtyczek. Motyw jest zainstalowany, być może jest to motyw podrzędny Twenty Eleven, może samodzielny, jego funkcje.php wywołuje w zestawie zawierającym wiele elementów, z których każdy obsługuje inny aspekt danego CMS. Następnie pliki szablonów motywu używają niestandardowych „znaczników szablonu” zdefiniowanych w dołączeniach. Nie chcę mieć plików motywów zależnych od aktywacji jakiejś wtyczki lub innej itp. Po prostu nie ma sensu budować złożoności systemu. Jasne, mogę umieścić go w folderze wtyczek, których należy używać, ale nadal jest to hack - w tej chwili wszystko , co ma związek z dostosowaniami dokonanymi dla tego projektu, jest zawarte wp-content/themes/my-theme/
. Nie chcę też rozważać szukania rzeczy w niektórych folderach wtyczek.
Nie zrozum mnie źle. Uwielbiam wtyczki, używam ich i piszę. I używam wtyczek w połączeniu z tego rodzaju wysoce niestandardowym opracowywaniem motywów, gdy wtyczka jest dostarczana przez firmę zewnętrzną i reprezentuje najlepsze praktyki daleko wykraczające poza to, co mógłbym wprowadzić w rozsądnym czasie. Ale kiedy muszę zmodyfikować podstawową funkcjonalność dla jednorazowego scenariusza, przechodzę do haków akcji, haków filtrów i chciałbym móc polegać na funkcjach wtykowych dla strony użytkownika i uwierzytelniania.
źródło
Odpowiedzi:
Jeśli budujesz to dla jednego klienta, powinieneś bezwzględnie skorzystać
mu-plugins
.W WordPress jest wiele rzeczy, których nie możesz zrobić
functions.php
. Funkcje wtykowe to jedna z nich, ale bardziej oczywiste jest to, że wiele haków (zarówno akcji, jak i filtrów) odpala się wcześniejfunctions.php
. W niektórych przypadkach haki te uruchamiają się nawet przed zwykłymi wtyczkami, co następnie wymaga użyciamu-plugins
wtyczki aktywowanej przez sieć. W jeszcze innych przypadkach nawet wtyczka mu jest za późno. Być może potrzebujesz czegośsunrise.php
. Lub nawet coś (stałego lub innego) wwp-config.php
.Wolę dodać kilka haczyków do funkcji wtykowych, niż ułatwić ich przesłonięcie. Prawdopodobnie nigdy więcej nie będziemy mieć innej funkcji wtykowej - są to wcześniejsze haki i prawie nigdy nie widziałem sytuacji, w której mieliby przewagę nad dobrym hakiem staromodnym (nowym?).
W dalszym ciągu zgadzam się, sześć lat później, z Andym Skeltonem: „Istnieje wiele różnic między plikiem funkcji motywu a wtyczką. Niech tak zostanie”.
Poza tym taka zmiana nigdy nie mogła się wydarzyć. Zniszczyłoby to wiele rzeczy. Niezliczone motywy wywołujące funkcje w ciele
functions.php
tego spowodowałyby błąd krytyczny, gdybypluggable.php
nie zostały jeszcze załadowane - jakcurrent_user_can()
, lubwp_create_nonce()
. Wszystkie zawiodą. I to też zepsuje wtyczki, które normalnie mogłyby zacząć wywoływać te funkcjeplugins_loaded
. (Po prostu wejdźpluggable.php
niżej,wp-settings.php
a założę się, że połowa rdzenia pęknie - a przynajmniej dostosuje.)Wreszcie istnieje nieunikniony pomysł, że kompozycja może zawierać osobny plik,
pluggable.php
który możemy załadować już w momencie ładowania wtyczek, a zatem może zastąpić funkcje wtykowe. Oprócz tego, że jest to zły pomysł (patrz pierwsze cztery akapity tego komentarza), nadal nie byłby kompatybilny, ponieważ aż do momentu przechwyceniasetup_theme
, można było przesłonić, który motyw ma zostać załadowany, filtrując wartości arkusza stylów i szablonów.Niestety, nie jest to możliwe do utrzymania, biorąc pod uwagę sposób, w jaki budowana jest WordPress. Dobrą rzeczą jest to, że istnieją niezliczone (lepsze) sposoby, aby to zrobić.
(Pierwotnie opublikowane tutaj: http://core.trac.wordpress.org/ticket/2479#comment:5 )
źródło
W kontekście jednorazowego projektu absolutnie właściwe jest umieszczenie kodu obowiązkowego w
mu-plugins
. Jeśli problemem jest „posiadanie tego wszystkiego na raz”, po prostu utwórz link symboliczny w katalogu katalogumu-plugins
rozwijanego, aby pojawił się podczas przeszukiwania katalogu motywów.źródło
Nie mogę wymyślić sposobu na osiągnięcie tego, zbyt wcześnie w sekwencji ładowania.
Najbliższym rozsądnym rozwiązaniem byłoby dodanie niestandardowego włączenia do
wp-config.php
(według kodu lub prośby użytkownika), ale porównanie z tą wtyczką pakietową byłoby prawdopodobnie bardziej sensowne.źródło