Czy istnieje jakiś globalny plik functions.php, który działa dla dowolnego motywu?

11

Czy istnieje jakiś globalny rodzaj pliku functions.php, który działa dla dowolnego motywu?

Problem jest tutaj:

Kiedy zmieniam plik functions.php w dowolnym motywie, muszę zadbać o dwie zmiany: Najpierw muszę zająć się aktualizacjami tego motywu. Po drugie, muszę zająć się zmianą motywu strony.

Czy zamiast wprowadzania zmian w pliku functions.php w kompozycji, można wprowadzić zmiany w niektórych plikach funkcji.php, które są niezależne od jakiegokolwiek motywu?

Mert Nuhoglu
źródło
4
Czy nagroda jest naprawdę konieczna? Pytanie ma już dobre odpowiedzi
onetrickpony
Ponieważ @Mohit Bumb był tym, który dał a) nagrodę ib) był pierwszym, który zasugerował użycie wtyczki, powiedziałbym, że to on powinien otrzymać punkty rep (z powrotem). IMO bounty nie było konieczne (i myślę, że nie wiedział, że musiał faktycznie dać go z dala ).
kaiser

Odpowiedzi:

15

Różnica między motywem a kodem innym niż motyw jest raczej organizacyjna niż techniczna. Aktywny kod przyczynia się do powstania środowiska, bez względu na to, skąd jest ładowany.

Istnieje wiele miejsc, z których pobierany jest kod, które nie są częścią rdzenia WordPress:

  • wp-config.php plik konfiguracyjny
  • aktywny motyw (i jego element nadrzędny dla motywów podrzędnych)
  • aktywne wtyczki
  • musi używać wtyczek
  • drop-in (są nieco zaawansowane i służą bardzo konkretnym celom)

Typowym miejscem na własny kod, który nie powinien być częścią motywu, jest stworzenie wtyczki. Inne podejścia nie mają korzyści z ogólnego przypadku, ale utracili interfejs (zarządzanie przez obszar administratora) i techniczne (zdarzenia aktywacji / dezaktywacji / odinstalowania) wygody normalnej wtyczki.

Rarst
źródło
+1 zarówno tobie, jak i @kaiser. Uważam, że poprawna odpowiedź brzmi: 1) Utwórz motyw potomny, aby umieścić w nim niestandardową funkcjonalność functions.php, lub 2) utwórz niestandardową wtyczkę, aby pomieścić tę funkcjonalność, aby była przenośna między różnymi motywami.
Chip Bennett,
@Chip, ponieważ pytanie dotyczy zachowania kodu przy zmianie motywów Nie widzę motywu potomnego jako pasującego. Co zrobić, jeśli chcesz przejść na motyw będący motywem potomnym? Wtyczka jest najbardziej odpowiednia dla danych wymagań.
Rarst
dlatego głosowałem za wami oboje. :) Ale nadal możesz używać motywu potomnego podczas przełączania motywów; wystarczy odpowiednio zmienić Template:znacznik w motywie podrzędnym style.css.
Chip Bennett,
@Chip, nie dostałeś mojego punktu. Co jeśli chcę użyć motywu podrzędnego? Tworzę motyw potomny dla Twenty Eleven za pomocą mojego kodu. Następnie chcę przejść do motywu, który jest również motywem potomnym Twenty Eleven (lub innego rodzica). Nie mam innej ścieżki niż ręczne połączenie dwóch motywów potomnych. Następnie przy następnym zmienianiu motywu cofam scalanie. To bałagan.
Rarst
Używam do tego obowiązkowego. Uważam, że jest to szybki i prosty sposób na dodawanie funkcji, haczyków i skrótów dostępnych w różnych motywach
chiliNUT
6

Cóż, to jest prawdziwy problem i wiele osób staje przed nim, kiedy zmieniają temat, ale istnieją proste rozwiązania.

dodaj tę funkcję do nowej strony, nie działa .

Aby zrozumieć, która wtyczka jest przeznaczona do tego, czego nie przegap, nadaj jej nazwę, np .:

/*
Plugin Name: XYZ
*/
Mohit Bumb
źródło
3

Jako dodatek do odpowiedzi @MBTheDeveloper.

Inne opcje to:

  1. Utwórz motyw podrzędny dla bieżącego motywu i użyj z niego pliku functions.php (jest to „najlepsza praktyka”).
  2. Użyj includew pliku php funkcji motywów i załaduj plik custom-function.php, który zawiera niestandardowy kod.
kajzer
źródło
2

Nie wprowadzaj specyficznych dla witryny zmian w pliku functions.php kompozycji.

Zamiast tego utwórz wtyczkę specyficzną dla witryny. Lubię używać nazwy domeny witryny, np. „Ottopress.com”. Następnie włóż fragmenty kodu do tej wtyczki i pozostaw aktywne tylko w tej witrynie.

Alternatywnie, jeśli masz fragment powiązanych zmian, utwórz dla nich specjalną wtyczkę. Daje to opcję włączania / wyłączania powiązanych fragmentów kodu w razie potrzeby.

Otto
źródło
2

Niektóre wyjaśnienia

Najpierw musisz zrozumieć cel funkcji.php w kompozycji. Functions.php to po prostu plik wtyczki bez nazwy, który jeśli jest obecny, jest automatycznie ładowany przez Wordpress. Wordpress ładuje bieżący plik theme.php dla stron frontonu oraz stron back-endowych (admin).

Nie ma różnicy między wtyczką a funkcjami. Php z wyjątkiem tego, że wtyczki mają nazwę i można je aktywować / dezaktywować niezależnie od innych wtyczek i motywów. Funtions.php jest dołączony do bieżącego motywu, a jeśli przełączysz się na inny motyw, Wordpress użyje funkcji nowego motywu. Php, a nie starych funkcji .php z niestandardowymi modyfikacjami.

Aktualizacje motywów również zastępują funkcje.php i nie ma sposobu, aby tego uniknąć, nawet jeśli umieścisz niestandardowe modyfikacje w osobnych plikach kodu i umieścisz je w pliku fucntions.php, będziesz musiał dodać tę linię dołączania po każdej aktualizacji.

Zasadniczo typ kodu, który powinien przejść w functions.php:

  • funkcje używane w plikach szablonów kompozycji.
  • opcje motywu
  • paski boczne
  • menu nawigacyjne
  • formaty wpisów
  • publikować miniatury
  • dowolny kod związany tylko z bieżącym motywem.

Jak chcesz zachować niestandardowe modyfikacje, nawet jeśli zmienisz motywy. Ponieważ motyw potomny nie będzie działał w tym przypadku, ponieważ zmienisz motyw, a funkcje. Php motywu potomnego nie będą używane.

Rozwiązanie

Jedynym rozwiązaniem zalecanym przez @Otto jest utworzenie pliku wtyczki. Podejście, które możesz zastosować, aby utworzyć wtyczkę specyficzną dla witryny, polega na utworzeniu folderu z nazwą witryny w „wp-content / plugins” i utworzeniu w nim plików wtyczek.

Dlaczego pliki wtyczek? a nie pojedynczy plik wtyczki.

Zgrupuj funkcjonalność strony związanej z kodem w osobnych plikach wtyczek i nie zapomnij dodać nagłówka wtyczki do wszystkich plików wtyczek, aby były one rozpoznawane przez Wordpress jako osobne wtyczki. Będziesz wtedy mógł aktywować / dezaktywować różne funkcje / funkcjonalność swojej strony bez niszczenia wszystkiego.

Hameedullah Khan
źródło