Gdzie umieszczać własny kod – w pliku functions.php czy we wtyczkach?


Podczas tworzenia serwisu opartego na WordPressie często (a właściwie prawie zawsze) zachodzi potrzeba zmodyfikowania sposobu działania jakiejś funkcji lub dodania nowej. Nasz własny kod możemy umieszczać w dwóch miejscach: w pliku functions.php naszego szablonu (lub pliku dołączanym do niego za pomocą include lub require) albo we wtyczce. Efekt końcowy w znacznej większości przypadków będzie taki sam, tak więc najczęściej nasze modyfikacje lądują w pliku functions.php – bo tak jest szybciej i wygodniej. Nie zawsze jednak jest to poprawne, a poświęcenie chwili na wybór odpowiedniego miejsca dla naszych zmian pozwoli nam zaoszczędzić sporo czasu w przyszłości.

Zanim bezmyślnie wkleimy znaleziony w Sieci kawałek kodu do pliku functions.php, powinniśmy odpowiedzieć sobie na jedno podstawowe pytanie: czy gdy kiedyś zdecydujemy się na zmianę szablonu na inny, to kod ten wciąż będzie potrzebny? Jeśli tak (bo na przykład modyfikuje kanał RSS, dodaje jakieś nowe znaczniki meta do nagłówka strony lub rejestruje nowe typy wpisów), to powinien on trafić do wtyczki (czyli w miejsce niezależne od szablonu). Jeśli nie (bo na przykład umieszcza pod każdym wpisem jakiś specjalny, dopasowany wizualnie do szablonu element, wyświetla odpowiednio sformatowaną listę tagów lub datę publikacji wpisów), to powinien znaleźć się w pliku functions.php szablonu.

Mówiąc krótko, powinniśmy ustalić, czy dana modyfikacja jest związana z szablonem. Jeśli nasz kod umieścimy w nieodpowiednim dla niego miejscu, to po zmianie szablonu okaże się, że albo będziemy musieli przenieść go do nowego motywu, albo do nowego szablonu trafią elementy, które nie powinny się w nim znaleźć. Tracimy w ten sposób czas, który moglibyśmy poświęcić na pożyteczniejsze rzeczy.

Oczywiście nie musimy tworzyć osobnej wtyczki dla każdej z naszych modyfikacji – wystarczy że stworzymy jedną, w której umieścimy wszystkie potrzebne w danym serwisie zmiany. Jeśli jednak czujemy, że dany kod może nam się przydać również na innych stronach, możemy (a nawet powinniśmy) umieścić go w osobnej wtyczce, dzięki czemu łatwiej będzie nam zastosować go gdzie indziej. Stworzenie własnej wtyczki nie jest trudne i nawet osoby nie mające pojęcia o programowaniu nie powinny mieć z tym większych problemów.

Warto również sprawdzić, czy nie istnieje już jakaś wtyczka rozwiązująca nasz problem. Nie ma sensu wymyślać koła od nowa, a skorzystanie z pochodzącej z oficjalnego repozytorium wtyczki jest z pewnością lepszym pomysłem niż używanie znalezionego „gdzieś w Sieci” kawałka kodu (szczególnie gdy nie jesteśmy w stanie zweryfikować jego poprawności).

Bezpośredni link

  • A jak zrobić wtyczkę która by się skłądała z kilku mini wtyczek, tak by każdą „funkcję” można wy włączyć i wyłączyć z poziomu panelu głównej wtyczki?

    • Jest to możliwe, ale to temat na dłuższy tekst, a nie na komentarz.

      • To chętnie poczekam na taki tekst, gdyż strona już w godzinę temu wylądował w RSS.

  • A co z przypadkiem, kiedy tworzymy dla klienta stronę jako całość i w ramach tego projektu musimy utworzyć nowy CPT, który będzie wykorzystywany tylko w jednym miejscu w skórce (miałem jedną taką sytuację) albo na potrzeby slidera (dedykowane rozwiązanie dla tej jednej konkretnej strony)? ;)

    • Zgodnie ze sztuką, definicje CPT i wszelkie funkcje związane z przetwarzaniem danych tego CPT (pobieranie, dodawanie, edycja itp.) powinny znaleźć się we wtyczce, a w motywie jedynie rzeczy odpowiedzialne za prezentację CPT (np. funkcje generujące kod HTML do wstawienia do szablonu i kod CSS). Powód jest prosty: jeśli klient zmieni kiedyś szablon, to wciąż będzie miał dostęp do CPT, bez konieczności przenoszenia całego kodu związanego z CPT do nowego motywu.

      Slidery z definicji powinny być tworzone w formie wtyczek – praktyka jednak jest zupełnie inna. ;)

      • Ale ten CPT właśnie jest tworzony tylko i wyłącznie pod ten konkretny szablon, jeśli klient zmieni szablon, to i tak z tego CPT nie skorzysta. :P

        • Dlaczego nie? Wciąż będzie on dostępny w panelu administracyjnym i klient będzie miał dostęp do danych (będzie mógł je podpiąć lub skopiować/przenieść do nowego szablonu). Jeśli tworzysz CPT pod konkretny szablon i zakładasz, że w innym szablonie nie będzie on potrzebny, to wydaje mi się, że robisz coś źle. ;)

          • Gdzie w innym szablonie ma być potrzebny dedykowany slider tworzony dla tej konkretnej strony na CPT? :D

          • Dobrze zrobiony slider można umieścić na każdej stronie, bez konieczności jej modyfikacji. Jak już napisałem, slidery powinny być umieszczane we wtyczkach.

            Jeśli jednak naprawdę tworzysz specjalny slider pod konkretny szablon, to oczywiście możesz go zawrzeć w szablonie.