Jak zastąpić funkcję wtykową w motywie?

10

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.phpjest, że jest ładowany przed motywem functions.phpi 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 nieto 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.

Tom Auger
źródło
Na odrobinę ponownie otworzyłem core.trac.wordpress.org/ticket/2479
Tom Auger,
Aby odrobina, bilet został ponownie zamknięty, z dobrym wyjaśnieniem, dlaczego.
Tom Auger,

Odpowiedzi:

10

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śniej functions.php. W niektórych przypadkach haki te uruchamiają się nawet przed zwykłymi wtyczkami, co następnie wymaga użycia mu-pluginswtyczki 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) w wp-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.phptego spowodowałyby błąd krytyczny, gdyby pluggable.phpnie zostały jeszcze załadowane - jak current_user_can(), lub wp_create_nonce(). Wszystkie zawiodą. I to też zepsuje wtyczki, które normalnie mogłyby zacząć wywoływać te funkcje plugins_loaded. (Po prostu wejdź pluggable.phpniżej, wp-settings.phpa założę się, że połowa rdzenia pęknie - a przynajmniej dostosuje.)

Wreszcie istnieje nieunikniony pomysł, że kompozycja może zawierać osobny plik, pluggable.phpktó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 przechwycenia setup_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 )

Andrew Nacin
źródło
Dziękujemy za poświęcenie czasu na przesłanie odpowiedzi tutaj. Teraz, kiedy to wyjaśniłeś, widzę rzeczy po swojemu. Ma sens. Dzięki!
Tom Auger,
5

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 katalogu mu-pluginsrozwijanego, aby pojawił się podczas przeszukiwania katalogu motywów.

Mark Jaquith
źródło
Mark, dziękuję za sugestię dotyczącą dowiązania symbolicznego. Chociaż migracja nie pomaga, może być bardzo wygodna podczas programowania.
Tom Auger,
0

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.

Rarst
źródło
Tak, opowiedz mi o tym.
Tom Auger,