Poradnik optymalizacji

WordPress
rozdęcie autoloadu

Każde żądanie WordPress ładuje cały zestaw autoload z wp_options. Jeśli jest rozdęty, każda strona za to płaci.

Zaudytuj autoloadowane dane: dwa zapytania

Wklej to w phpMyAdmin, Adminer albo wp db query — pierwsze daje łączny rozmiar autoloadu w KB, drugie listuje 25 opcji, które go robią. Zmień prefiks wp_, jeśli twój jest inny.

-- Total autoloaded data (KB) + row count
SELECT ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS autoload_kb,
       COUNT(*) AS autoload_count
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto', 'auto-on');
-- Top 25 offenders, biggest first
SELECT option_name,
       ROUND(LENGTH(option_value) / 1024, 1) AS size_kb,
       autoload
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto', 'auto-on')
ORDER BY LENGTH(option_value) DESC
LIMIT 25;
Dlaczego lista IN (...) ma znaczenie

WordPress 6.6+ zapisuje 'auto' i 'auto-on' obok klasycznych 'yes' i 'on'. Każde zapytanie audytowe, które sprawdza tylko autoload = 'yes', zaniża prawdziwy rozmiar autoloadu — stąd tyle stron wygląda dobrze na papierze, a i tak ładuje rozdęty zestaw przy każdym żądaniu.

Autoloader WordPress kontra autoloadowane dane

„Autoloader” w WordPressie znaczy dwie niepowiązane rzeczy i wyszukiwanie zwraca obie. Warto trzydzieści sekund, żeby sprawdzić, która cię dotyczy.

Jak to ludzie nazywają Czym to naprawdę jest Czy spowalnia stronę?
Autoloader klas PHP
Composer, spl_autoload_register, PSR-4
Funkcja, która ładuje plik klasy PHP przy pierwszym użyciu, żebyś nie pisał require ręcznie. Prawie nigdy. To lookup w systemie plików, zwykle cache’owany przez OPcache.
Opcje autoloadowane
Kolumna autoload w wp_options
Wiersze, które WordPress wciąga do pamięci przy każdym żądaniu, zanim poleci twój kod. Tak. To ten, który cię kosztuje, i o nim jest reszta tej strony.

Jeśli trafiłeś tu, bo hosting oflagował „autoloaded data”, albo po alloptions w profilerze — chcesz ten drugi. Jeśli debugujesz fatal Class not found, chcesz pierwszy i ta strona nie pomoże: to problem Composer albo PSR-4.

Zwrot „plugin autoloader” jest niejednoznaczny tak samo. Wtyczka wozi autoloader Composer dla własnych klas i też zapisuje opcje autoloadowane. W zapytaniu poniżej widać tylko to drugie.

Czym są autoloadowane dane?

WordPress ma jedno zapytanie, które leci przy każdym załadowaniu strony, zanim wykona się kod motywu albo wtyczki:

SELECT option_name, option_value
FROM wp_options
WHERE autoload = 'yes'

To ładuje wszystkie opcje „autoloaded” do pamięci naraz. Rdzeń WordPress potrzebuje ok. 100KB tych danych. Problem w tym, że wtyczki to nadużywają.

Schemat

Wyłączasz wtyczkę. Jej dane zostają w wp_options z autoload='yes'. Instalujesz 30 wtyczek przez 2 lata. Teraz ładujesz 5MB danych przy każdym żądaniu—w większości po wtyczkach, których już nie używasz.

W przeciwieństwie do wolnych zapytań, które skaczą TTFB od czasu do czasu, rozdęcie autoloadu to stały podatek. Dokłada latencję do każdego żądania—z cache’em albo bez, frontend czy admin, AJAX czy załadowanie strony.

Zdrowy rozmiar autoloadu: progi dla wp_options

Traktuj łączny rozmiar autoloadu jak budżet, nie metrykę do chwalenia się. Odpal powyższe zapytanie audytowe, potem porównaj swoją liczbę z tą tabelą.

<300KB
Zdrowy
300–800KB
Warto sprawdzić
>800KB
Wymagana akcja
Rozmiar autoloadu Werdykt Co robić
Poniżej 300 KB W porządku Nic. Sam rdzeń WordPress potrzebuje ok. 100 KB — jesteś w normie. Sprawdź ponownie po dużych instalacjach wtyczek albo migracji.
300–800 KB Obserwuj Odpal zapytanie top-25. Zobacz, które wtyczki trzymają największe wiersze, i wyłącz autoload na sierotach i starych cache’ach, zanim urosną.
800 KB–1 MB Działaj Przekroczyłeś próg, który flaguje większość hostingów zarządzanych. Zaplanuj czyszczenie w tym tygodniu. Lepiej autoload='no' niż kasowanie wierszy.
Powyżej 1 MB Pilne WordPress cache’uje cały zestaw autoload jako jeden klucz alloptions. Wiele setupów Redis/Memcached ogranicza jedną wartość do ~1 MB, więc za duży zestaw może cicho nie wejść do cache — albo wyjść jako przerywane 502 pod obciążeniem.

Strony z ponad 3MB autoloadowanych danych to norma. Widzieliśmy strony z 10MB+ —to 10MB z MySQL do PHP przy każdym żądaniu, zanim WordPress w ogóle zacznie budować stronę.

Ostrzeżenie WP Engine „Autoloaded Data”: co robić

WP Engine flaguje autoloadowane dane po przekroczeniu 800 KB i wszystko poniżej traktuje jako normę. To jeden z niewielu hostingów, które pokazują to jako ostrzeżenie w panelu, stąd większość ludzi spotyka problem u nich. Fizyka nie zależy od hosta — każde żądanie wciąga cały zestaw do PHP, u kogokolwiek jesteś.

Ostrzeżenie podaje liczbę i nic więcej. Oto co z nią zrobić.

  1. Najpierw zmierz sam. Odpal zapytanie audytowe z góry tej strony. Panele hostingów próbkują według harmonogramu, więc liczba może mieć kilka godzin, a niektóre panele wciąż sprawdzają autoload = 'yes', co zaniża wynik na WordPress 6.6+, bo rdzeń zapisuje też 'on', 'auto' i 'auto-on'. Panel mówiący „w normie” to nie dowód.
  2. Znajdź sprawców, nie sumę. Suma to objaw. Wypisz top 25 wierszy po LENGTH(option_value) i zwykle znajdziesz trzy–cztery wiersze, które niosą większość wagi.
  3. Każdą pozycję sprawdź z listą „nie ruszaj” niżej na stronie, zanim cokolwiek zmienisz. Część dużych opcji autoload ma prawo być duża.
  4. Wyłącz autoload, nie kasuj. wp option set-autoload OPTION_NAME off zostawia dane i da się cofnąć. Kasowanie wierszy to sposób, żeby zepsuć ustawienia wtyczki.
  5. Zmierz ponownie i daj panelowi dogonić. Ostrzeżenie znika przy następnym sprawdzeniu WP Engine, nie od razu.

Jedno zastrzeżenie specyficzne dla hostingów zarządzanych na memcached: powyżej ok. 1 MB blob autoloadu może przekroczyć limit na klucz, więc cicho nie wejdzie do cache i każde żądanie wraca do bazy. To gorsze, niż sugeruje ostrzeżenie, i wychodzi jako losowe 502 w wp-admin, a nie jako wolna strona.

Zejście poniżej 800 KB ręcznie to parę godzin ostrożnej roboty. Autoloader Optimizer WP Multitool robi ten sam audyt, kategoryzuje każdy wiersz i odwraca bezpieczne z przywracaniem jednym kliknięciem.

Co powoduje rozdęcie autoloadu WordPress

1. Pozostałości po wyłączonych wtyczkach

Większość wtyczek nie sprząta po sobie. Dodają opcje przy aktywacji i zostawiają je na zawsze—nawet po wyłączeniu i usunięciu. Znajdź je:

SELECT option_name, LENGTH(option_value) AS size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 20;

Szukaj nazw opcji po wtyczkach, których już nie używasz. Te bezpiecznie ustawisz na autoload='no' albo skasujesz całkiem.

2. Serializowane tablice, które rosną

Część wtyczek trzyma rosnące dane w jednej opcji: logi, snapshoty analityki, harmonogramy cron. Jeden option_value to bywa 500KB+ serializowanego PHP.

3. Wygasłe transjenty

Transjenty to tymczasowe wartości cache w wp_options. Bez zewnętrznego object cache wygasłe transjenty się zbierają. WordPress czyści je leniwie—przy następnym odczycie. Te stare transjenty potrafią też wyjść jako wolne zapytania, gdy tabela urośnie.

SELECT COUNT(*) FROM wp_options
WHERE option_name LIKE '_transient_%'
AND autoload = 'yes';

4. Źle skonfigurowane wtyczki

Wtyczki, które trzymają ustawienia per użytkownik, duże JSON-y albo cache odpowiedzi API w opcjach autoload. Dane mogą być potrzebne, ale nie muszą ładować się przy każdym żądaniu.

Jak audytować autoloadowane dane w wp_options

  1. Sprawdź łączny rozmiar autoloadu — Odpal powyższe zapytanie SQL. Powyżej 1MB trzeba badać od razu.
  2. Znajdź największych sprawców — Posortuj opcje autoload po LENGTH(option_value). Top 10 zwykle to 80%+ rozdęcia.
  3. Wykryj osierocone dane — Zestaw nazwy opcji z aktywnymi wtyczkami. Opcje po wyłączonych wtyczkach można ruszać.
  4. Testuj przed zmianą — Ustaw autoload='no' po jednej opcji. Sprawdź, czy strona działa. Część opcji naprawdę musi być w autoload (ustawienia rdzenia, aktywny motyw/wtyczki).
  5. Wyczyść wygasłe transjenty — Usuń transjenty po timeoutcie. To zawsze bezpieczne.

Czego NIE wyłączać

Przełączenie autoload da się cofnąć. Kasowanie wierszy nie. Ale część opcji musi zostać w autoload, dopóki właściciel jest aktywny, inaczej WordPress i wtyczki padają wcześnie w bootstrapie — i nie będzie błędu, tylko cicha degradacja. Traktuj to jako checklistę przed zmianą hurtową.

Zostaw w autoload (gdy w użyciu) Zwykle bezpiecznie ustawić autoload='no'
cron — cała mapa zdarzeń WP-Cron;
active_plugins, template, stylesheet;
siteurl, home, blogname, blogdescription;
user_roles, permalink_structure, rewrite_rules;
theme_mods_{active-theme} dla żyjącego motywu;
ustawienia runtime aktywnych wtyczek — konfiguracja sklepu WooCommerce, Yoast wpseo_*, reguły firewalla
Osierocone wiersze po usuniętych wtyczkach (prefiks nie pasuje do niczego zainstalowanego);
stare _transient_* i _site_transient_* — cache z definicji;
pozostałości po sprawdzaniu aktualizacji: _site_transient_update_plugins, _site_transient_update_themes, _site_transient_update_core;
księgowość kolejek i telemetrii: action_scheduler_*, wc_tracks_*;
za duże bloby CSS/assetów page builderów (_elementor_* i Divi regularnie w top-25)

Zasada: jeśli wtyczka jest aktywna, a opcja to konfiguracja czytana przy każdym żądaniu, zostaw autoload. Jeśli wtyczki nie ma, albo wartość to cache, log albo blob kolejki — najpierw wyłącz autoload i kasuj dopiero, gdy nic tego wiersza nie czyta.

Typowi sprawcy autoloadu: czy bezpiecznie wyłączyć?

Dwadzieścia prefiksów, które widuję w kółko, i co z każdym robię. „Ostrożnie” znaczy, że zależy, czy wtyczka jeszcze działa — to sprawdź najpierw.

Opcja / prefiks Źródło Bezpiecznie wyłączyć autoload?
_transient_* / _site_transient_*Rdzeń WordPress + dowolna wtyczka (transjenty)Tak — transjenty to cache z definicji; przy object cache nie powinny w ogóle siedzieć w wp_options.
action_scheduler_*Action Scheduler (WooCommerce i inne)Tak — księgowość kolejki, ładowana na żądanie, gdy scheduler leci.
wc_tracks_*WooCommerce (telemetria)Tak — eventy śledzenia użycia, nic po stronie użytkownika od nich nie zależy.
woocommerce_* (settings)Rdzeń WooCommerceNie — waluta, podatki i checkout, które Woo czyta przy każdym żądaniu.
elementor_*Elementor (ustawienia)Ostrożnie — ustawienia runtime są potrzebne, gdy aktywny; bezpiecznie dopiero po wyłączeniu Elementor.
_elementor_*Elementor (dane wewnętrzne / cache)Ostrożnie — część to cache CSS/assetów (bezpieczne), część stan runtime; audytuj wiersz po wierszu.
jetpack_* / _jetpack_*JetpackOstrożnie — tokeny połączenia i stan sync; zły przełącznik może zerwać połączenie z WordPress.com.
wpseo_* / wordpress_seo_*Yoast SEONie, gdy aktywny — tytuły, meta i ustawienia indexable ładują się przy każdym żądaniu frontu. Tak, jeśli Yoast został usunięty.
aioseo_*All in One SEOOstrożnie — ustawienia rdzenia zostają, gdy aktywny, ale AIOSEO słynie z za dużych opcji cache/logów, które można przełączyć.
rank_math_*Rank MathOstrożnie — ustawienia runtime Nie, bloby analityki/cache Tak; ten sam podział co AIOSEO.
wpforms_*WPFormsOstrożnie — ustawienia są potrzebne, gdy aktywny; challenge, powiadomienia i logi są bezpieczne.
wf* / wflogsWordfenceOstrożnie — konfiguracja firewalla jest czytana przy każdym żądaniu, gdy aktywny; wiersze-logi i sieroty po usunięciu to twarde Tak.
redirection_*RedirectionOstrożnie — wtyczka potrzebuje ustawień wcześnie, żeby robić przekierowania; przełączaj tylko, gdy wtyczki nie ma.
et_*Divi (Elegant Themes)Ostrożnie — ustawienia aktywnego motywu Nie; jeśli odszedłeś od Divi, wszystko et_* to martwy ciężar — Tak.
edd_*Easy Digital DownloadsOstrożnie — ustawienia sklepu potrzebne, gdy aktywny; pozostałości trackingu i sesji są bezpieczne.
learndash_*LearnDashOstrożnie — ustawienia kursów i runtime, gdy aktywny; bezpiecznie tylko po usunięciu LearnDash.
tribe_events_*The Events CalendarOstrożnie — znany z dużych wpisów cache w autoload (często bezpieczne), ale ustawienia rdzenia to runtime.
fs_accountsFreemius SDK (dołączany do wielu wtyczek)Ostrożnie — jeden wiersz współdzielony przez każdą wtyczkę na Freemius; licencjonowanie pada, jeśli przełączysz, gdy któraś jest aktywna.
rewrite_rulesRdzeń WordPressOstrożnie — często największa pojedyncza opcja, ale WordPress potrzebuje jej do routingu URL. Nigdy nie kasuj; jeśli jest ogromna, znajdź wtyczkę, która ją rozdyma.
cronRdzeń WordPressNie — tu mieszka cały harmonogram WP-Cron; wyłączenie autoload psuje zaplanowane zadania.

Jak naprawić rozdęcie autoloadu w WordPress

Wyłącz autoload dla konkretnych opcji

UPDATE wp_options SET autoload = 'no'
WHERE option_name = 'old_plugin_settings';

Wyczyść wygasłe transjenty

DELETE FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP();

Usuń osierocone dane wtyczek

-- Only after confirming the plugin is gone:
DELETE FROM wp_options
WHERE option_name LIKE 'removed_plugin_%';

Problem ręcznych poprawek: nie zostają poprawione. Wtyczki dalej dokładają dane. Transjenty wracają. Nowe wtyczki niosą nowe opcje autoload. Musiałbyś audytować co miesiąc, żeby to trzymać.

Dlaczego rozdęcie autoloadu wciąż rośnie

Rozdęcie autoloadu jest postępujące. Rośnie powoli, po 50KB, niewidoczne, aż strona jest wyraźnie wolniejsza i nie wiesz czemu.

  1. Nowa wtyczka zainstalowana → 200KB opcji konfiguracji w autoload
  2. Wtyczka wyłączona → dane zostają, dalej w autoload
  3. Pudło cache transjenta → nowy transjent zapisany z autoload
  4. Aktualizacja wtyczki → migracja dokłada nowe wiersze autoload

Jeśli widzisz też wolny kokpit administracyjny WordPress, rozdęcie autoloadu często jest ukrytą przyczyną. Potrzebujesz narzędzia, które ciągle monitoruje rozmiar autoloadu i mówi dokładnie które opcje marnują pamięć—zanim to stanie się problemem wydajności.

Zautomatyzuj czyszczenie autoloadu

Autoloader Optimizer WP Multitool monitoruje tabelę wp_options, znajduje rozdęte i osierocone dane autoload i pokazuje, co bezpiecznie posprzątać.

Weź WP Multitool Jak działa Autoloader Optimizer