
🚫 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.

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 formularzyscripts.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ć:

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 6 add_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.

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

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):
1 add_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 4 if ( 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ępnearray_search( $myplugin, $plugins )szuka CF7 w tablicy aktywnych wtyczekunset( $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 4 if ( 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.

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

Ustawienia aktywacji filtra według typów stron:

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

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:

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

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.

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.cssitheme.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.

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):

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:

Wskaźniki: 104,21 KB, ładowanie 0,80 sekundy, 8 żądań.
Na koniec wyłączyliśmy wszystkie nieużywane wtyczki:

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_pluginszał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-CLIwp 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 przezoption_active_pluginsto 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 anistyle.css, aniscripts.jsz 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.



