Plik functions.php to specjalny plik PHP traktowany przez WordPress jak wbudowana w motyw wtyczka. Ładuje się automatycznie przy każdym uruchomieniu strony — o ile dany motyw jest aktywny.
Jak działa functions.php
WordPress wczytuje ten plik na wczesnym etapie inicjalizacji strony, po załadowaniu wtyczek, ale przed wyrenderowaniem szablonów. Kod zawarty w functions.php może rejestrować hooki, definiować funkcje pomocnicze i modyfikować działanie WordPressa lub aktywnego motywu.
Plik jest powiązany z konkretnym motywem — jeśli zmienisz motyw, kod w functions.php poprzedniego motywu przestaje działać.
Co zwykle umieszcza się w functions.php
Plik ten jest właściwym miejscem na kod ściśle powiązany z wyglądem i funkcjami aktywnego motywu:
- rejestrowanie nawigacji przez
register_nav_menus() - deklarowanie obsługi miniaturek wpisów przez
add_theme_support('post-thumbnails') - rejestrowanie obszarów widżetów przez
register_sidebar() - kolejkowanie stylów i skryptów przez
wp_enqueue_scripts - definiowanie niestandardowych rozmiarów obrazów przez
add_image_size()
Dobrze jest też tu rejestrować hooki specyficzne dla motywu — filtry i akcje, które mają sens tylko przy konkretnym layoucie.
Kiedy functions.php to nieodpowiednie miejsce
Plik functions.php nie jest właściwą lokalizacją dla kodu, który powinien działać niezależnie od motywu.
Integracje z zewnętrznymi API. Jeśli kod łączy stronę z CRM, systemem mailowym czy zewnętrznym serwisem, powinien być we wtyczce. Przy zmianie motywu taka integracja nie powinna znikać.
Niestandardowe typy treści i taksonomie. CPT zarejestrowany w functions.php przestaje być dostępny po zmianie motywu, bo nowy motyw nie rejestruje już tego typu treści. Sama zawartość zwykle zostaje w bazie danych, ale może zniknąć z panelu i frontu do czasu ponownego zarejestrowania CPT. Dlatego typy treści i taksonomie lepiej umieszczać w dedykowanej wtyczce.
Rozbudowana logika biznesowa. Im więcej kodu trafia do jednego pliku, tym trudniej go utrzymać i debugować. Duże projekty często dzielą funkcje na osobne pliki, includowane z functions.php.
Szybkość kodu zależy od jego jakości, nie od lokalizacji. Ten sam kod w functions.php i w dedykowanej wtyczce wykonuje się z takim samym narzutem dla interpretera PHP.
Child theme — bezpieczna modyfikacja
Zmiany w pliku functions.php motywu głównego (parent theme) przepadają przy aktualizacji motywu przez jego dewelopera.
Rozwiązaniem jest motyw potomny (child theme). WordPress ładuje plik functions.php motywu potomnego tuż przed plikiem nadrzędnego — oba działają jednocześnie, nie zamiast siebie. Kod w child theme przeżywa aktualizacje motywu głównego.
Jeśli nie chcesz tworzyć child theme, wtyczki zarządzające fragmentami kodu (np. Code Snippets) pozwalają umieszczać kod przez panel admina, bez ruszania pliku functions.php. Więcej o motywach: Motyw w WordPress.
Unikalne nazwy funkcji
PHP zgłosi błąd krytyczny, jeśli zadeklarujesz funkcję o nazwie już istniejącej — w rdzeniu WordPressa, innej wtyczce lub motywie.
Dlatego funkcje w functions.php powinny mieć unikalny prefiks, np. mojafirma_get_menu() zamiast get_menu(). Alternatywą są przestrzenie nazw PHP (namespaces), dostępne od PHP 5.3, które grupują kod i chronią przed kolizjami.
Warto też owijać funkcje w sprawdzenie if ( ! function_exists('nazwa') ) — zabezpiecza to przed błędem przy aktywnych motywach, które mogą deklarować tę samą funkcję.
Stałe w wp-config.php a functions.php
Plik functions.php nie jest właściwym miejscem na stałe konfiguracyjne WordPressa takie jak WP_DEBUG czy WP_MEMORY_LIMIT. Te stałe definiuje się w pliku wp-config.php, który jest wczytywany wcześniej. Więcej o stałych: Stałe systemowe WordPress.