Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🚫 Jak selektywnie wyłączyć wtyczki WordPress na poszczególnych stronach i wpisach

🚫 Jak selektywnie wyłączyć wtyczki WordPress na poszczególnych stronach i wpisach

Każda wtyczka WordPress dodaje kod PHP wykonywany podczas ładowania strony, wczytuje skrypty i style, a czasem także dodatkowe zapytania do bazy danych. Im więcej wtyczek, tym cięższa strona. Problem nie leży jednak wyłącznie w ich liczbie: nawet jedna „gadatliwa" wtyczka, taka jak Contact Form 7, domyślnie ładuje swoje pliki .css i .js na każdej podstronie witryny, w tym na tych, gdzie formularza nie ma nawet w pobliżu.

Twórcy CF7 otwarcie przyznają: wtyczka podłącza zasoby wszędzie, ponieważ shortcode może pojawić się w dowolnym miejscu. I nie jest to logika wyłącznie CF7, tak działa większość wtyczek. Rezultat: strona główna bloga wczytuje skrypty slidera galerii, którego nigdy na niej nie było.

Dobra wiadomość: WordPress pozwala selektywnie wyłączać ładowanie wtyczek, tylko na tych stronach, gdzie są naprawdę potrzebne. Przeanalizujmy obie ścieżki: programistyczną (przez mu-plugin z filtrem option_active_plugins) i wtyczkową (Plugin Organizer, Perfmatters, Plugin Load Filter). Na koniec zmierzymy rezultat za pomocą przeglądarkowego monitora sieci.

💡 Szybki przegląd:

  • Wybieraj wtyczki według trzech kryteriów: reputacja twórcy, wydajność pod obciążeniem i rzeczywista potrzeba
  • Sposób programistyczny: piszemy snippet PHP, który przez get_option('active_plugins') pobiera listę aktywnych wtyczek i filtruje je według adresu URL strony
  • Mu-plugin: przenosimy filtr do /wp-content/mu-plugins/, aby działał PRZED wszystkimi zwykłymi wtyczkami, i wyłączamy niepotrzebne w locie
  • Sposób wtyczkowy: Plugin Organizer i Perfmatters dają wizualny interfejs do tych samych zadań, bez ani jednej linii kodu
  • Mierzymy efekt przez Chrome/Firefox DevTools: po filtracji żądania HTTP spadają, czas ładowania wyraźnie się skraca

Trzy zasady wyboru wtyczek

Zanim zaczniemy filtrować ładowanie, warto upewnić się, że wtyczki na stronie w ogóle zasługują na miejsce w wp_options. Trzy zasady, które oszczędzają nerwy i zasoby serwera.

Instaluj tylko sprawdzone wtyczki od twórców z historią. Otwórz stronę wtyczki na WordPress.org i sprawdź: liczbę aktywnych instalacji, ocenę, datę ostatniej aktualizacji oraz liczbę rozwiązanych zgłoszeń w pomocy technicznej. Wtyczka z ponad 100 000 instalacji, oceną 4.5+ i aktualizacją w ciągu ostatnich 3 miesięcy to bezpieczny wybór.

Strona wtyczki w katalogu WordPress

Preferuj skalowalne wtyczki. Dwie wtyczki o tej samej funkcji mogą w różny sposób wpływać na szybkość. Porównuj kandydatów za pomocą inspektora przeglądarki (zakładka Sieć) lub serwisów online, takich jak Google PageSpeed Insights, Pingdom i GTmetrix, mierz czas ładowania oraz liczbę żądań HTTP przed instalacją i po niej.

Nie trzymaj martwego balastu. Każda nieużywana wtyczka to zbędny kod PHP w każdym żądaniu. Okresowo przeglądaj listę aktywnych wtyczek i usuwaj te, bez których strona spokojnie funkcjonuje. Jeśli wtyczka „może się przydać za pół roku", dezaktywuj ją i usuń, a za pół roku zainstalujesz świeżą wersję.

Rzeczywisty przykład: Contact Form 7

Contact Form 7 to idealny obiekt testów. Dodaje on na każdą stronę:

  • style.css, style formularzy
  • scripts.js, logikę walidacji i wysyłania

Nawet jeśli na stronie nie ma shortcodu [contact-form-7], oba pliki sumiennie się ładują. Na zrzucie ekranu poniżej panel Sieć w Chrome DevTools, który nie pozwoli skłamać:

Panel Network z zasobami wtyczki Contact Form 7

Rozwiązanie: albo poprawić logikę ładowania wewnątrz wtyczki (co przepadnie przy aktualizacji), albo selektywnie wyłączać wtyczkę dla wszystkich stron oprócz tej potrzebnej. Druga ścieżka jest pewniejsza i nią się zajmiemy.

Krok 1. Pobieramy listę aktywnych wtyczek przez PHP

Zanim zaczniemy filtrować, trzeba zrozumieć, gdzie WordPress przechowuje listę aktywnych wtyczek. Wszystkie znajdują się w tabeli wp_options, w wierszu z kluczem active_plugins. Tablicę można pobrać jedną funkcją get_option.

Dodaj ten kod do wtyczki Code Snippets lub do własnego pliku wtyczki (nie zapomnij o nagłówku wtyczki na początku):

1<?php
2/**
3 * Plugin Name: Active Plugins Lister
4 */
5
6add_shortcode( 'activeplugins', function() {
7 $active_plugins = get_option( 'active_plugins' );
8 $plugins = "";
9 if ( count( $active_plugins ) > 0 ) {
10 $plugins = "<ul>";
11 foreach ( $active_plugins as $plugin ) {
12 $plugins .= "<li>" . $plugin . "</li>";
13 }
14 $plugins .= "</ul>";
15 }
16 return $plugins;
17} );

Proszę zapisać plik jako active-plugins.php i przesłać go do /wp-content/plugins/. Proszę utworzyć stronę testową, wstawić shortcode [activeplugins] i otrzymać numerowaną listę wszystkich aktywnych wtyczek w formacie папка/файл.php.

Tabela wp_options z aktywnymi wtyczkami

Oto jak wygląda wynik po wstawieniu shortcode'u na stronę:

Lista aktywnych wtyczek przez shortcode

Krok 2. Filtr option_active_plugins, główne narzędzie

Teraz główne narzędzie, filtr option_active_plugins. Należy on do rodziny filtrów option_$option_name i uruchamia się za każdym razem, gdy WordPress pobiera wartość opcji z bazy danych. Ponieważ aktywne wtyczki są przechowywane właśnie jako opcja active_plugins, filtr ten pozwala w locie podmienić tablicę: usunąć niepotrzebne wtyczki lub, przeciwnie, dodać nową.

Oto minimalny przykład, programowo aktywujemy Advanced Custom Fields (pod warunkiem, że wtyczka jest już zainstalowana):

1add_filter( 'option_active_plugins', function( $plugins ) {
2 $myplugin = "advanced-custom-fields/acf.php";
3 if ( ! in_array( $myplugin, $plugins ) ) {
4 $plugins[] = $myplugin;
5 }
6 return $plugins;
7} );

Ten kod doda ACF do listy aktywnych wtyczek na każdej stronie. Niezbyt praktyczne, ale zasada jest jasna: tablicę $plugins można modyfikować dowolnie.

Ważny niuans: filtr musi zadziałać wcześniej niż zwykłe wtyczki, w przeciwnym razie WordPress zdąży odczytać niefiltrowaną listę. Służą do tego mu-wtyczki.

Krok 3. Tworzymy mu-wtyczkę do selektywnego wyłączania

Wtyczki Must-use znajdują się w katalogu /wp-content/mu-plugins/ i są wykonywane przed wszystkimi zwykłymi wtyczkami. To dokładnie to, czego potrzeba: nasz filtr przejmie kontrolę jako pierwszy.

Jest jedna subtelność: tagi warunkowe WordPressa (is_page(), is_single() i inne) w mu-wtyczce nie działają, zapytanie nie zostało jeszcze przetworzone i wszystkie zwrócą false. Trzeba analizować URL ręcznie za pomocą $_SERVER['REQUEST_URI'].

Oto gotowa mu-wtyczka, która wyłącza Contact Form 7 na wszystkich stronach oprócz /contact/:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugin = "contact-form-7/wp-contact-form-7.php";
10 $k = array_search( $myplugin, $plugins );
11
12 if ( false !== $k && false === $is_contact_page ) {
13 unset( $plugins[ $k ] );
14 }
15
16 return $plugins;
17 } );
18}

Przeanalizujmy linijka po linijce:

  • parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) wyodrębnia ścieżkę zapytania (na przykład /blog/kak-otkljuchit-plaginy/)
  • strpos( $request_uri, '/wp-admin/' ) sprawdza, czy jesteśmy w panelu administracyjnym; jeśli tak, filtr nie jest stosowany, aby strony ustawień wtyczek pozostały dostępne
  • array_search( $myplugin, $plugins ) szuka CF7 w tablicy aktywnych wtyczek
  • unset( $plugins[ $k ] ) usuwa wtyczkę z listy, jeśli NIE jesteśmy na stronie kontaktowej

Proszę zapisać plik, przesłać go do /wp-content/mu-plugins/ i wyczyścić pamięć podręczną. Teraz shortcode [activeplugins] powinien pokazywać Contact Form 7 tylko na stronie /contact/.

Oto jak ta sama zasada wygląda dla kilku wtyczek jednocześnie. Zamiast array_search z jedną wtyczką, tablica i array_diff:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugins = array(
10 "contact-form-7/wp-contact-form-7.php",
11 "code-snippets/code-snippets.php",
12 "query-monitor/query-monitor.php",
13 "autoptimize/autoptimize.php"
14 );
15
16 if ( false === $is_contact_page ) {
17 $plugins = array_diff( $plugins, $myplugins );
18 }
19
20 return $plugins;
21 } );
22}

Funkcja array_diff zwraca wartości z pierwszej tablicy, których nie ma w drugiej, dokładnie to, czego potrzeba do masowego wyłączania.

Rezultat widać od razu w panelu Network: plik script.js z Contact Form 7 znika z listy zasobów na wszystkich stronach oprócz strony kontaktowej.

Lista zasobów strony bez skryptu Contact Form 7

Podejście programistyczne jest elastyczne, ale wymaga edycji kodu przy każdej nowej wtyczce. Dla tych, którzy wolą interfejs wizualny, istnieją gotowe wtyczki filtrujące.

Sposób z użyciem wtyczek: filtrowanie bez kodu

Plugin Load Filter

Plugin Load Filter, bezpłatne narzędzie do filtrowania wtyczek według kilku warunków. Obsługuje:

  • filtrowanie według typu posta (wpisy, strony, niestandardowe typy)
  • filtrowanie według formatu wpisu
  • wyjątki dla modułów Jetpack
  • filtrowanie URL dla zapytań REST API, Heartbeat, AJAX i AMP
Interfejs filtra ładowania Plugin Load Filter

Ustawienia aktywacji filtra według typów stron:

Ustawienia stron dla filtra ładowania wtyczek

Po aktywacji administrator konfiguruje, na których stronach stosować filtr, za pomocą zakładki „Filter Activation by Page Type". Minimalistycznie i bez zbędnych komplikacji.

Plugin Organizer

Plugin Organizer, weteran wśród wtyczek filtrujących, z oceną 5 gwiazdek. Daje pełną kontrolę nad ładowaniem:

  • selektywne wyłączanie wtyczek według URL strony
  • wyłączanie według ról użytkowników
  • grupy wtyczek (włączanie/wyłączanie całego zestawu naraz)
  • zmiana kolejności ładowania wtyczek
Strona ustawień globalnych Plugin Organizer

Na stronie „Global Plugins" można przez przeciąganie globalnie wyłączyć wtyczkę dla całej witryny i punktowo włączyć ją z powrotem na poszczególnych stronach za pomocą metaboksu w edytorze posta. Na zrzucie ekranu poniżej wtyczka Contact Form 7 jest globalnie wyłączona:

Contact Form 7 globalnie wyłączony w Plugin Organizer

A tutaj ten sam metaboks na stronie edycji kontaktów, który nadpisuje ustawienia globalne:

Metaboks Plugin Organizer na stronie kontaktowej

Plugin Organizer pokazuje również informacje debugowania: które wtyczki faktycznie załadowały się na każdej stronie i dlaczego. Dokumentacja jest dostępna na stronie dewelopera.

Perfmatters

Perfmatters, premiumowe narzędzie od zespołu deweloperów Kinsta. Jego główną funkcją jest Script Manager, gdzie wszystkie skrypty i style są pogrupowane według nazwy wtyczki lub motywu.

Menedżer skryptów Perfmatters

Można wyłączyć wtyczkę całkowicie lub selektywnie usunąć poszczególne pliki CSS/JS w jej obrębie. Dla witryn o złożonej strukturze adresów URL dostępne jest wyłączanie skryptów za pomocą wyrażeń regularnych.

Trzy scenariusze, w których Perfmatters daje natychmiastową korzyść:

  • Wtyczki mediów społecznościowych (przyciski „Udostępnij"), wyłączane wszędzie poza wpisami na blogu
  • Contact Form 7, wyłączany wszędzie poza stroną z formularzem
  • Style edytora blokowego Gutenberga (block-library/style.min.css i theme.min.css), usuwane w witrynach korzystających z klasycznego edytora

W niezależnym teście na woorkup.com wyłączenie zbędnych skryptów za pomocą Perfmatters skróciło całkowity czas ładowania o 20,2%, liczbę żądań HTTP na stronie głównej z 46 do 30, a rozmiar strony z 506,3 KB do 451,6 KB.

Wyniki testu prędkości z Perfmatters

Perfmatters jest płatną wtyczką i jest to uzasadnione w przypadku witryn, gdzie szybkość bezpośrednio wpływa na konwersję. W przypadku niewielkiego bloga wystarczy Plugin Organizer lub programowy mu-plugin.

Mierzymy wynik za pomocą monitora sieci w przeglądarce

Optymalizacja bez pomiaru to wróżenie. Narzędzia DevTools w przeglądarce dają dokładny obraz „przed i po" bez zewnętrznych serwisów. Sprawdzi się każda nowoczesna przeglądarka:

Na testowej instalacji WordPress z 18 aktywnymi wtyczkami zmierzyliśmy szybkość strony przed filtrowaniem (pusta pamięć podręczna, Firefox Network Monitor):

Analiza wydajności Firefox przed optymalizacją

Wynik: 255,19 KB, ładowanie 1,24 sekundy, 12 żądań.

Po zainstalowaniu Plugin Organizer i globalnym wyłączeniu Contact Form 7 wykres kołowy uległ zmianie:

Analiza wydajności Firefox po wyłączeniu CF7

Wskaźniki: 104,21 KB, ładowanie 0,80 sekundy, 8 żądań.

Na koniec wyłączyliśmy wszystkie nieużywane wtyczki:

Analiza wydajności Firefox po pełnej optymalizacji

Wynik końcowy: 101,98 KB, ładowanie 0,46 sekundy, 8 żądań.

Porównajmy skrajne punkty: rozmiar zasobów zmniejszył się ponad dwukrotnie (z 255 do 102 KB), czas ładowania z 1,24 do 0,46 sekundy, żądania HTTP z 12 do 8. Liczby mówią same za siebie: selektywne wyłączanie wtyczek daje odczuwalny wzrost szybkości nawet na niewielkiej witrynie, a spadek TTFB i LCP bezpośrednio wpływa na pozycje w wynikach wyszukiwania.

⁉️🤔 Najczęściej zadawane pytania

Czy koniecznie trzeba używać mu-plugin, czy można zostawić kod w zwykłej wtyczce?

Można i w zwykłej, ale wtedy kolejność ładowania może wszystko zepsuć. Jeśli Pana/Pani filtr option_active_plugins załaduje się po tym, jak WordPress odczytał już listę aktywnych wtyczek, nie zadziała. Mu-plugin to jedyny sposób, by mieć pewność, że filtr przejmie kontrolę przed wszystkimi innymi wtyczkami. W zwykłej wtyczce zależy Pan/Pani od kolejności alfabetycznej lub haków, które mogą się zmienić po aktualizacji dowolnej innej wtyczki.

Co zrobić, jeśli nie mogę utworzyć folderu mu-plugins na hostingu?

Folder /wp-content/mu-plugins/ można utworzyć przez FTP, menedżer plików hostingu lub poleceniem WP-CLI wp scaffold mu-plugin. Jeśli w ogóle nie ma Pan/Pani dostępu do systemu plików, proszę użyć Plugin Organizer: robi to samo, ale przez własny mechanizm filtrowania i nie wymaga edycji plików serwerowych. Większość hostingów udostępnia dostęp do wp-content przez menedżer plików w panelu sterowania. Uprawnienia do folderu: 0755.

Czy wyłączenie wtyczki przez filtr wpłynie na jej ustawienia?

Nie, ustawienia wtyczki są przechowywane w bazie danych (tabela wp_options) i nie są naruszane. Po prostu nie pozwala Pan/Pani WordPressowi załadować kodu wtyczki podczas przetwarzania konkretnego żądania. Wszystkie ustawienia pozostaną na swoim miejscu, a przy następnym żądaniu, gdzie wtyczka nie jest odfiltrowana, załaduje się z pełną funkcjonalnością. Wyłączenie przez option_active_plugins to właśnie blokowanie ładowania kodu w locie, a nie dezaktywacja. W panelu administracyjnym wtyczka pozostaje aktywna, jej ustawienia nie są ruszane, zaplanowane zadania (WP-Cron) nadal działają.

Jak sprawdzić, czy filtr naprawdę działa?

Najbardziej obrazowy sposób to panel Network w Chrome DevTools (F12 → Network). Proszę otworzyć go na stronie, gdzie wtyczka ma być wyłączona, odświeżyć z wciśniętym klawiszem Ctrl (pusta pamięć podręczna) i wpisać w wyszukiwarkę nazwę wtyczki lub jej plik CSS/JS. Jeśli nie ma żądań, filtr działa. Wtyczki takie jak Query Monitor również pokazują listę załadowanych komponentów i czas ich wykonania. Dla Contact Form 7 proszę wpisać w wyszukiwarce Network contact-form-7, jeśli filtr zadziałał, nie zobaczy Pan/Pani ani style.css, ani scripts.js z CF7 na liście załadowanych zasobów.

Czy jest sens wyłączać wtyczki na zupełnie małej witrynie, gdzie jest ich 5-7 sztuk?

Jeśli wszystkie 5 wtyczek jest naprawdę potrzebnych na każdej stronie, to nie. Ale nawet na małej witrynie często wisi para wtyczek, które działają tylko na jednej stronie: formularz kontaktowy, galeria w portfolio, slider na stronie głównej. Wyłączenie takiej pary na pozostałych stronach zauważalnie zmniejsza liczbę żądań HTTP i przyspiesza ładowanie, jak widzieliśmy wyżej na instalacji testowej, nawet jedna odfiltrowana wtyczka odcina dziesiątki milisekund. Dla witryny z odwiedzalnością od 1000 osób na dobę te milisekundy składają się na odczuwalną różnicę zarówno dla użytkownika, jak i dla Core Web Vitals.

Kod, wtyczka czy Perfmatters: co wybrać do swojego zadania

Jeśli na witrynie jest 5 wtyczek i wszystkie są naprawdę potrzebne na każdej stronie, ta instrukcja nie jest dla Pana/Pani. Ale typowa witryna WordPress ciągnie 15-25 aktywnych wtyczek, z których na konkretnej stronie pracuje najwyżej 5-7. Reszta po prostu marnuje czas serwera i spowalnia ładowanie.

Programowy mu-plugin to bezpłatny, lekki i w pełni kontrolowany sposób, ale wymaga uwagi przy każdej nowej wtyczce. Plugin Organizer to złoty środek: interfejs wizualny, elastyczność i bezpłatność. Perfmatters to wybór dla projektów komercyjnych, gdzie każda dziesiąta sekundy ładowania przekłada się na pieniądze.

Jeśli nagromadził Pan/Pani więcej wtyczek, niż potrzeba, proszę zacząć od przeglądu i wyczyszczenia nieużywanych, a następnie przejąć kontrolę nad ładowaniem tych, które pozostały. Proszę wybrać swój sposób według poziomu komfortu i obciążenia witryny, a zobaczy Pan/Pani różnicę w pierwszym pomiarze Network. Niech Pan/Pani nie czeka, aż wtyczki zjedzą Pana/Pani TTFB.