publikacja: 9 stycznia 2012, autor: , komentarzy 21 https://wpninja.pl/artykuly/kiedy-warto-zastapic-plik-functions-php-wtyczka-funkcjonalna-i-jak-to-zrobic/

Kiedy warto zastąpić plik functions.php wtyczką funkcjonalną i jak to zrobić?

Kiedy warto zastąpić plik functions.php wtyczką funkcjonalną i jak to zrobić?

Funkcjonalności WordPressa możemy rozszerzyć na dwa sposoby - instalując wtyczkę lub dodając kod do pliku functions.php. Drugie podejście ma niestety jedną, zasadniczą wadę - nasze modyfikacje zostaną utracone, gdy zmienimy szablon na inny. Można temu zapobiec, tworząc własną wtyczkę funkcjonalną.

Plik functions.php a wtyczka funkcjonalna

Wprawdzie plik functions.php nie jest konieczny do działania szablonu, ale w praktyce trudno zleźć skórkę, która by go nie zawierała. Plik ten funkcjonuje tak jak wtyczka, a dla działania kodu nie ma znaczenia czy znajduje się w nim czy we wtyczce. Różnica polega na tym, że plik functions.php jest związany bezpośrednio z szablonem, w którym się znajduje, w związku z czym uruchamiany jest tylko, gdy dany szablon jest aktywny. Wtyczka natomiast działa jeśli tylko jest włączona, niezależnie od tego, z jakiego szablonu akurat korzystamy.

Celem tego artykułu nie jest przekonanie Ciebie, że nie potrzebujesz już pliku functions.php. Tak naprawdę zarówno wtyczka funkcjonalna jak i plik functions.php mają swoją rację bytu. Chcę Cię jednak zachęcić do oddzielenia kodu związanego z wyglądem szablonu od kodu odpowiedzialnego za funkcjonalność bloga. Dzięki temu unikniesz problemów i oszczędzisz sobie pracy przy zmianie lub aktualizacji szablonu.

Co powinno się znaleźć we wtyczce funkcjonalnej a co w pliku functions.php?

Aby zdecydować, gdzie powinien trafić dany fragment kodu, odpowiedz sobie na jedno pytanie. Czy dany kod dodaje do Twojego bloga funkcjonalność, którą chciałbś zachować również przy zmianie szablonu? Jeśli tak, to kod powinien trafić do wtyczki, a jeśli nie, do pliku functions.php.

Przykładowo, do wtyczki należało by przenieść kod związany z:

Co pozostawić w pliku functions.php?

  • definicje rozmiarów miniatur,
  • definicje obszarów sidebar,
  • definicje menu,

oraz wszystko to, co związane jest z wyglądem i poprawnym wyświetlaniem danego szablonu.

Jak stworzyć własną wtyczkę funkcjonalną?

Wbrew pozorom nie jest to nic trudnego i nawet osoby ze znikomą znajomością PHP powinny dać sobie z tym radę. Cała praca zasadniczo polega na kopiowaniu kodu pomiędzy plikiem functions.php a plikiem wtyczki.

Utwórz nowy plik php i wklej na początek poniższy fragment, dzięki któremu WordPress rozpozna go jako wtyczkę. Plik możesz nazwać dowolnie, ale najlepiej aby nazwa nie była całkiem przypadkowa, przykładowo nazwabloga-functions-plugin.php.

<?php
/*
Plugin Name: Wtyczka funkcjonalna bloga MojBlog.pl
Description: Funkcjonalność bloga, niezwiązana z wyglądem.
Version: 0.1
License: GPL
Author: Imię i nazwisko
Author URI: http://mojblog.pl
*/
?>

Teraz wystarczy, że skopiujesz do pliku wtyczki cały kod odpowiedzialny za dodatkową funkcjonalność na Twoim blogu.

Przykładowo, załóżmy że w pliku functions.php masz zdefiniowany:

Zakładając, że zależy nam na zachowaniu tej funkcjonalności również przy zmianie szablonu, całe fragmenty kodu przenosimy do pliku nowo utworzonej wtyczki:

<?php
/*
Plugin Name: Wtyczka funkcjonalna bloga MojBlog.pl
Description: Funkcjonalność bloga, niezwiązana z wyglądem.
Version: 0.1
License: GPL
Author: Imię i nazwisko
Author URI: http://mojblog.pl
*/
 
/**
* własny domyślny awatar
*/
 
add_filter('avatar_defaults', 'custom_avatar');
 
function custom_avatar ($avatars) {
   $custom_avatar_url = get_bloginfo('template_url').'/img/nazwa-pliku.gif';
   $custom_avatar_title = "Nazwa awatara";
   $avatars[$custom_avatar_url] = $custom_avatar_title;
   return $avatars;
}
 
/**
* własny przycisk w wizualnym edytorze
*/
 
add_shortcode('css_button', 'generate_css_button');
 
function generate_css_button($atts, $content = null){
   $result = extract(shortcode_atts(array(
   'to' => '#'
   ), $atts));
   return "<a class='css_button_blue' href='$to'>$content</a>";
}
?>

W ten sam sposób należy postąpić z pozostałym kodem z pliku functions.php kierując się wspomnianą wcześniej zasadą.

Instalacja wtyczki funkcjonalnej

Kiedy już uporasz się z kopiowaniem kodu do pliku wtyczki, pozostaje Ci tylko instalacja.
Tutaj masz dwie opcje.

  • Metoda 1. Katalog wp-content/plugins

    Jest to standardowa procedura, która polega na umieszczeniu pliku wtyczki w katalogu wp-content/plugins, a następnie aktywacji z poziomu panelu administracyjnego.

    Wtyczka umieszczona w katalogu wp-content/plugins

    Wtyczka umieszczona w katalogu wp-content/plugins

    Zapewne do tej pory właśnie w ten sposób postępowałeś ze wszystkimi wtyczkami. Jest jednak jeszcze jeden sposób, o którym warto wspomnieć.

  • Metoda 2. Katalog wp-content/mu-plugins

    Osoby które miały okazję pracować z Wordpress w wersji MU (Multi User), zapewne pamiętają katalog mu-plugins, do którego wgrywało się wtyczki, aby automatycznie były aktywne na wszystkich blogach w ramach sieci.

    Jednak nazwa tego katalogu – mu-plugins to skrót od „must use”, a nie „multi user”, jak mogłoby się wydawać. W związku z tym również w pojedynczej instalacji WordPress (od wersji 2.8) można utworzyć taki katalog w folderze wp-content, a w rezultacie wrzucone do niego wtyczki będą działać, bez konieczności aktywacji.

    To rozwiązanie ma również tę zaletę, że eliminuje ryzyko przypadkowego wyłączenia wtyczki, która jest kluczowa dla działania bloga.

    Wracając do naszej wtyczki funkcjonalnej – jeśli nie masz katalogu mu-plugins w swojej instalacji, wystarczy że utworzysz go ręcznie w folderze wp-content, a następne skopiujesz tam plik wtyczki. Jeśli teraz wejdziesz do panelu administracyjnego, oto co powinieneś zobaczyć w sekcji „Wtyczki”:

    Wtyczka umieszczona w katalogu wp-content/mu-plugins

    Wtyczka umieszczona w katalogu wp-content/mu-plugins

    Tak jak wspominałam, w tym wypadku nie ma konieczności aktywacji wtyczki. Oznacza to jednak również, że nie ma możliwości jej wyłączenia – aby przestała działać, trzeba ją fizycznie usunąć z katalogu.

    Warto również wiedzieć, że do katalogu mu-pugins można wrzucać jedynie pojedyncze pliki (tak jak w naszym przypadku, gdzie cała wtyczka znajduje się w jednym pliku).

    Więcej informacji na temat roli katalogu mu-plugins znajdziesz w oficjalnej dokumentacji.

Co dalej?

Opisaną w artykule metodę można zgeneralizować i zamiast jednej wtyczki funkcjonalnej stworzyć ich kilka, wydzielając poszczególne funkcje. Na pewno warto o tym pomyśleć, gdy dodajemy funkcjonalność, z której korzystamy często również na innych stronach.

Przykładowo, jeśli w nowo tworzonych serwisach powtarzamy ten sam standardowy zestaw modyfikacji panelu administracyjnego (np. ukrywanie widgetów w kokpice, ukrywanie powiadomień o aktualizacji, modyfikacje tekstu w stopce itd.), warto zastanowić się, czy nie zasługuje on na odrębną wtyczkę.

Postępując w ten sposób, można znacznie przyspieszyć i ułatwić sobie pracę nad kolejnymi projektami.

Podsumowanie

Jednym z powodów, dla którego rozszerzanie funkcjonalności bloga poprzez dodawanie kodu do pliku functions.php jest tak popularne, jest prostota tego rozwiązania. Mam jednak nadzieję, że po przeczytaniu tego artykułu, będziesz świadomie decydował, gdzie powinien trafić określony fragment kodu.

Komentarze

  1. Marcin 5 lat temu:

    Naprawdę niezły pomysł :) Może się przydać do przygotowania własnego frameworka.

    odpowiedz
  2. snjasmin 5 lat temu:

    zgadzam się ^^ bardzo fajny pomysł
    …. ten wordpress … jak dotąd same zalety :)

    odpowiedz
  3. Zacol 5 lat temu:

    Dobry artykuł, chociaż na razie raczej nie wykorzystam tej wiedzy ;)

    odpowiedz
  4. Hubalus 5 lat temu:

    Ciekawy artykuł. Szczerze powiem, że tego właśnie szukałem. Gratulacje

    odpowiedz
  5. nd_macias 5 lat temu:

    Artykuł chyba inspirowany wystąpieniem na zeszłorocznym WrodCampie, bodajże Vokiela albo Marcina Wolaka – których z nich poruszył ten temat. W każdym razie bardzo fajny temat. Sporo czasu można zaoiszczędzić.

    odpowiedz
  6. Grimek 5 lat temu:

    Bardzo ciekawe, dobry pomysł :] Jak dotąd widzę same zalety korzystania z wordpressa, wiele funkcji i świetnie działa.

    A co do posta:
    Dobra robota!

    odpowiedz
  7. c0lin 5 lat temu:

    Świetny pomysł, lecz jestem początkujący i mam pewne pytanie.. Otóż czy mógłbym jakoś dodać kod CSS do wtyczki, tak, żeby nie musieć wyciągać tego kodu z motywu za każdym razem? Jeśli znacie jakiś inny sposób, by zmienić przypisany kod CSS dla danego id, które nie występuje w kodzie wtyczki, to proszę o pomoc!

    odpowiedz
    1. Szymon Skulimowski 5 lat temu:

      Chętnie pomogę, ale prawdę mówiąc nie za bardzo wiem o co chodzi. Czy mógłbyś opisać to jakimś konkretnym przykładzie?

      odpowiedz
    2. c0lin 5 lat temu:

      W sumie to już tego nie potrzebuję i poradziłem sobie, ale w dość dziwaczny sposób, więc może znajdzie się lepsze rozwiązanie.

      Chodzi mi o to, że tworząc nowy widget nie mogę przypisać mu danego wyglądu, lecz jedynie wygląd tego co znajdzie się w miejscu zapisanym w motywie. Przykładowo u mnie wyglądało to tak, że tytuł stale był u góry widgetu, później była pozioma kreska która oddzielała tytuł od reszty widgetu, a pod nią znajdował się właściwy kod, który umieściłem przy tworzeniu widgetu w „function widget{KOD}”. Niestety takie dodawanie widgetów ogranicza bardzo modyfikacje wyglądu, bo nie mamy w kodzie zapisanego całego kodu, który wyświetli się na stronie, tylko kawałka, bo tak jest stworzony motyw – a tego ruszać nie mam zamiaru. Zauważyłem tylko, że id jest przypisywane dla każdego widgetu, i jest to unikatowe id, które posiada tylko ten jeden element. Niestety to nie zbyt przyszłościowa metoda zmieniania wyglądu widgetu, bo np. sprzedając coś takiego bądź rozpowszechniając użytkownik musi dodać kilka linijek kodu do style.css w swoim motywie. Jak temu zaradzić? Czy da się jakoś zmienić to, żebym mógł w pluginie wszystko zapisać, i nie ruszać już motywów? Bardzo by mi na tym zależało…

      odpowiedz
    3. Szymon Skulimowski 5 lat temu:

      Widget możesz ostylować po klasie.

      odpowiedz
  8. Tomasz Gąsior 5 lat temu:

    Bardzo ładnie opisane. Szczerze mówiąc, bardziej od informacji o wtyczkach funkcjonalnych zaciekawiły mnie wtyczki wymuszone. :)
    „Nie” z czasownikami razem z innymi częściami mowy – osobno, nawet jeśli dane słowo kojarzy się z czasownikiem, więc piszemy „niezwiązana”.

    odpowiedz
    1. Szymon Skulimowski 5 lat temu:

      Dzięki za uwagę, błąd został poprawiony.

      odpowiedz
  9. mamonia38 5 lat temu:

    Bardzo ciekawy artykuł, dobry pomysł. Informacje bardzo mi się przydały.

    odpowiedz
  10. Jan 5 lat temu:

    Poszukuję kodu, który utworzy nowe pola w w Kategorii wpisów. Chodzi mi konkretnie o nadanie dodatkowego tytułu oraz dodatkowego opisu. Który będzie się pojawiał podczas wyświetlania archiwum kategorii na blogu. Czyli będzie temat plus opis dodatkowy a następnie wyświetlają się tematy a archiwum. To właśnie można by utworzyć w takiej dodatkowej wtyczce.

    odpowiedz
    1. Szymon Skulimowski 5 lat temu:

      Tak, to dobry przykład. A odnośnie tej funkcji to możesz sprawdzić poniższą wtyczkę: http://wordpress.org/plugins/wp-category-meta/

      odpowiedz
    2. Jan 5 lat temu:

      Niestety ta wtyczka nie chce u mnie działać wszystko ładnie się tworzy tylko nie widać wpisów. I nie wiem jak wyciągnąć te dane jaką funkcją.
      poradziłem sobie z tym problemem trochę inaczej oto efekt:
      http://fajnybiznes.pl/oferta-oriflame/

      A teraz jak to zrobiłem:
      1. Zainstalowałem wtyczkę. Taxonomy TinyMCE, która dała możliwość formatowania teksu. Wobec tego można już normalnie pisać nic nie wyrzuca.
      2. W pliku archive.php umieściłem kod przez pętlą: echo category_description( $category );

      śmiga wszystko jak należy. Mam nadzieję, że komuś się to przyda :)

      odpowiedz
    3. Szymon Skulimowski 5 lat temu:

      Świetnie. Dzięki za informację.

      odpowiedz
  11. Ania 4 lata temu:

    Witam,
    A jak najprościej zmienić coś w czyjejś wtyczce?
    Używam jakieś wtyczki A, są tam shortcody, ale potrzebuje shortcoda innego niż oferuje autor wtyczki. Znalazłam w plikach wtyczki A miejsca, gdzie autor tworzy swoje shortcody. Na ich podstawie stworzyłam swojego, również tam. Wszystko działa, jak należy. Ale chciałabym moją zmianę umieścić poza folderem wtyczki. Tak, żeby w przyszłości możliwa była aktualizacja wtyczki bez niszczenia mojego kodu.
    Będę wdzięczna za wskazówkę.

    odpowiedz
    1. Paweł Knapek 3 lata temu:

      Aniu, trudno jednoznacznie odpowiedzieć na to pytanie.
      Wszystko zależy od samej wtyczki (jej kodu) – nie napisałaś niestety o jaką wtyczkę chodzi ani jakiej konkretnie modyfikacji dokonałaś.
      -Odpowiem więc bardziej ogólnie…
      Zasada jest prosta, nie modyfikuj plików bezpośrednio jeżeli nie jest to konieczne.
      We wtyczki ingeruj z zewnątrz, własnym kodem w pliku functions.php lub w formie własnej wtyczki.
      Jeżeli to możliwe, korzystaj z akcji i filtrów:
      http://codex.wordpress.org/Plugin_API/Action_Reference/
      http://codex.wordpress.org/Plugin_API/Filter_Reference
      W przypadku OOP możesz korzystać np. z klasy rozszerzonej extends.

      Warto dodać, że w przypadku tworzenia kodu zaleznego przydają się m.in. funkcje:
      http://codex.wordpress.org/Function_Reference/is_plugin_active
      http://pl1.php.net/function_exists
      http://us1.php.net/manual/pl/function.class-exists.php

      Wspominasz coś o szorcie, a może jest możliwość samodzielnego zdefiniowania takiego szorta? >> http://codex.wordpress.org/Shortcode_API

      Kod samej wtyczki modyfikujesz jedynie w ostateczności, gdy nie ma innej możliwości ingerencji – jednak musisz się wówczas liczyć z tym, ze po jej aktualizacji modyfikacje zostaną utracone i będzie trzeba je ponownie nanieść.

      odpowiedz

Dodaj własny komentarz

Odnośniki z innych stron

Lista innych stron, które w jakiś sposób odnoszą się do opublikowanej tutaj treści:

  1. Stronicowanie wpisów w WordPressie – Łukasz Natkaniec

    […] skórki bloga, funkcja paginator() nie będzie dostępna. Można ten problem ominąć tworząc własną wtyczkę, jednak nadal trzeba będzie wstawić wywołanie funkcji w odpowiednich szablonach nowej skórki. […]

  2. Dodawanie kolumny do ekranu zarządzania wpisami w Wordpress | WebTuts

    […] * Cały kod podany w artykule powinien się znaleźć w pliku functions.php, jednak w tym konkretnym przypadku polecam umieszczenie go w specjalnej wtyczce funkcjonalnej (co to jest wtyczka funkcjonalna i jak ją stworzyć przeczytasz w moim artykule na blogu WP Ninja). […]