WordPress to potężne narzędzie, ale jego filozofia “wszystko dla każdego” sprawia, że na start dostajemy mnóstwo dodatków, których większość nowoczesnych projektów po prostu nie potrzebuje. Przez lata wypracowałem zestaw konkretnych fragmentów kodu, które pozwalają mi pozbyć się zbędnego balastu bez wpływu na kluczowe działanie strony.
Ten przewodnik to nie tylko lista rzeczy do usunięcia, to strategiczne podejście do wydajności. Inspiracją był dla mnie doskonały artykuł Terence’a Edena, który uzupełniłem o własne rozwiązania sprawdzone w boju.
Dlaczego warto odchudzić wordpressa?
Po co zawracać sobie głowę kilkoma małymi skryptami? Bo one się sumują. Każda zbędna linia to potencjalny konflikt, milisekundy opóźnienia w renderowaniu czy po prostu niepotrzebne bajty wysyłane do użytkownika.
Nasze cele:
- Rozmiar DOM – usunięcie nieużywanych stylów inline.
- Liczba zapytań HTTP – wyłączenie skryptów, których nie powinno tam być.
- Bezpieczeństwo – wyłączenie przestarzałych protokołów jak XML-RPC.
- Core Web Vitals – bezpośredni wpływ na LCP i CLS poprzez usunięcie blokujących renderowanie elementów.
[!IMPORTANT] Zachowaj ostrożność: Nie każdy “bloat” jest bezużyteczny. Jeśli polegasz na specyficznym stylowaniu klasycznego edytora lub Twoi użytkownicy korzystają z bardzo starych przeglądarek wymagających skryptów emoji, niektóre z tych poprawek mogą nie być dla Ciebie. Zawsze testuj zmiany na środowisku testowym.
Kompletny skrypt optymalizacji
Dodaj poniższy kod do pliku functions.php Twojego motywu. Każda sekcja jest opatrzona komentarzami i linkami do źródeł.
1. Usuń style classic theme
WordPress dodaje “classic-theme-styles” nawet w niestandardowych motywach. Usuń je:
// Usuń wymuszony classic theme.
function disable_classic_theme_styles() {
wp_deregister_style( "classic-theme-styles" );
wp_dequeue_style( "classic-theme-styles" );
}
add_action( "wp_enqueue_scripts", "disable_classic_theme_styles" );
2. Usuń obsługę emoji
WordPress konwertuje tekstowe emoji na obrazy i dodaje skrypty wykrywające. Jeśli Twoi odwiedzający mają obsługę emoji (co mają wszystkie nowoczesne przeglądarki), to jest zbędne:
// Usuń WP Emoji.
// https://www.denisbouquet.com/remove-wordpress-emoji-code/
remove_action( "wp_head", "print_emoji_detection_script", 7 );
remove_action( "wp_print_styles", "print_emoji_styles" );
remove_action( "admin_print_scripts", "print_emoji_detection_script" );
remove_action( "admin_print_styles", "print_emoji_styles" );
// https://wordpress.org/support/topic/remove-the-new-dns-prefetch-code/
add_filter( "emoji_svg_url", "__return_false" );
// Zatrzymaj zamianę emoji na obrazy w RSS / Atom Feeds
// https://danq.me/2023/09/04/wordpress-stop-emoji-images/
remove_filter( "the_content_feed", "wp_staticize_emoji" );
remove_filter( "comment_text_rss", "wp_staticize_emoji" );
3. Wyłącz automatyczne formatowanie tekstu
WordPress “teksturyzuje” Twoją treść, zamieniając proste cudzysłowy na typograficzne, podwójne myślniki na półpauzy itp. Może to psuć przykłady kodu:
// Usuń automatyczne formatowanie.
// https://css-tricks.com/snippets/wordpress/disable-automatic-formatting/
remove_filter( "the_content", "wptexturize" );
remove_filter( "the_excerpt", "wptexturize" );
remove_filter( "comment_text", "wptexturize" );
remove_filter( "the_title", "wptexturize" );
// Więcej formatowania.
add_action("init", function() {
remove_filter( "the_content", "convert_smilies", 20 );
foreach ( array( "the_content", "the_title", "wp_title", "document_title" ) as $filter ) {
remove_filter( $filter, "capital_P_dangit", 11 );
}
remove_filter( "comment_text", "capital_P_dangit", 31 );
remove_filter( "the_content", "do_blocks", 9 );
}, 11);
Uwaga: Filtr
capital_P_dangitto sposób WordPress na automatyczną korektę “WordPress” na “WordPress”. Jest agresywny i często niepożądany.
4. Usuń style i skrypty gutenberga
Jeśli używasz własnego motywu i nie polegasz na frontendowych stylach Gutenberga, usuń je:
// Usuń style Gutenberga.
// https://wordpress.org/support/topic/how-to-disable-inline-styling-style-idglobal-styles-inline-css/
remove_action( "wp_enqueue_scripts", "wp_enqueue_global_styles" );
// Usuń widgety edycji Gutenberga.
// Z https://wordpress.org/plugins/classic-widgets/
add_filter( "gutenberg_use_widgets_block_editor", "__return_false" );
add_filter( "use_widgets_block_editor", "__return_false" );
// Usuń CSS biblioteki bloków Gutenberga z frontendu.
// https://smartwp.com/remove-gutenberg-css/
function remove_wp_block_library_css() {
wp_dequeue_style( "wp-block-library" );
wp_dequeue_style( "wp-block-library-theme" );
wp_dequeue_style( "wp-components" );
}
add_action( "wp_enqueue_scripts", "remove_wp_block_library_css", 100 );
5. Usuń meta tagi z nagłówka
Wyczyść sekcję <head> usuwając niepotrzebne meta tagi:
// Usuń shortlink.
// https://stackoverflow.com/questions/42444063/disable-wordpress-short-links
remove_action( "wp_head", "wp_shortlink_wp_head" );
// Usuń RSD.
// https://wpengineer.com/1438/wordpress-header/
remove_action( "wp_head", "rsd_link" );
// Usuń dodatkowe linki feed.
// https://developer.wordpress.org/reference/functions/feed_links/
add_filter( "feed_links_show_comments_feed", "__return_false" );
add_filter( "feed_links_show_posts_feed", "__return_false" );
// Usuń link api.w.org.
// https://wordpress.stackexchange.com/questions/211467/remove-json-api-links-in-header-html
remove_action( "wp_head", "rest_output_link_wp_head" );
remove_action( "template_redirect", "rest_output_link_header", 11, 0 );
6. Usuń ulepszenia obrazów
WordPress dodaje atrybuty sizes i inne ulepszenia do obrazów. Jeśli obsługujesz je samodzielnie, usuń je:
// Usuń wymuszony rozmiar obrazu WordPress
// https://core.trac.wordpress.org/ticket/62413#comment:40
add_filter( "wp_img_tag_add_auto_sizes", "__return_false" );
// Usuń ulepszenia <img>
// https://developer.wordpress.org/reference/functions/wp_filter_content_tags/
remove_filter( "the_content", "wp_filter_content_tags", 12 );
// Zatrzymaj przepisywanie URL http:// dla głównej domeny.
remove_filter( "the_content", "wp_replace_insecure_home_url", 10 );
// Usuń elementy załączników
remove_filter( "the_content", "prepend_attachment" );
// Usuń filtr bloków
remove_filter( "the_content", "apply_block_hooks_to_content_from_post_object", 8 );
7. Usuń sprawdzanie przeglądarki i inne funkcje admina
// Usuń sprawdzanie przeglądarki z panelu admina.
if ( !empty( $_SERVER["HTTP_USER_AGENT"] ) ) {
add_filter( "pre_site_transient_browser_" . md5( $_SERVER["HTTP_USER_AGENT"] ), "__return_null" );
}
// Usuń hovercards na linkach komentarzy w panelu admina.
add_filter( "akismet_enable_mshots", "__return_false" );
Moje dodatkowe rekomendacje
Poza powyższymi technikami, oto moje własne rozwiązania dla dalszej optymalizacji:
8. Wyłącz XML-RPC
Jeśli nie używasz zewnętrznych aplikacji do publikowania w WordPress, wyłącz XML-RPC dla lepszego bezpieczeństwa:
// Całkowicie wyłącz XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );
// Usuń link XML-RPC z nagłówka
remove_action( 'wp_head', 'rsd_link' );
9. Usuń jquery migrate
Nowoczesne motywy i wtyczki WordPress rzadko potrzebują jQuery Migrate. Jeśli Twoja strona działa bez niego, usuń go:
function remove_jquery_migrate( $scripts ) {
if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
$script = $scripts->registered['jquery'];
if ( $script->deps ) {
$script->deps = array_diff( $script->deps, array( 'jquery-migrate' ) );
}
}
}
add_action( 'wp_default_scripts', 'remove_jquery_migrate' );
10. Wyłącz oembed
Jeśli nie osadzasz treści z innych stron (YouTube, Twitter itp.), wyłącz oEmbed:
// Usuń linki wykrywania oEmbed
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
// Usuń endpoint REST API oEmbed
remove_action( 'rest_api_init', 'wp_oembed_register_route' );
// Wyłącz auto wykrywanie oEmbed
add_filter( 'embed_oembed_discover', '__return_false' );
11. Odrocz ładowanie javascript
Dodaj defer do niekrytycznych skryptów dla lepszej wydajności:
function add_defer_attribute( $tag, $handle ) {
// Skrypty, które NIE powinny być odroczone
$scripts_to_not_defer = array( 'jquery-core' );
if ( in_array( $handle, $scripts_to_not_defer ) ) {
return $tag;
}
return str_replace( ' src', ' defer src', $tag );
}
add_filter( 'script_loader_tag', 'add_defer_attribute', 10, 2 );
Mierzenie efektów
Po wdrożeniu tych zmian, przetestuj swoją stronę używając:
- Google PageSpeed Insights – Sprawdź Core Web Vitals
- GTmetrix – Szczegółowa analiza waterfall
- WebPageTest – Wiele lokalizacji testowych i prędkości połączenia
Powinieneś zobaczyć:
- Zmniejszony rozmiar strony (mniej bajtów CSS/JS)
- Mniej zapytań HTTP
- Lepszy Time to First Byte (TTFB)
- Lepszy Largest Contentful Paint (LCP)
Podsumowanie
Podejście WordPress “wszystko w zestawie” jest świetne dla początkujących, ale deweloperzy szukający maksymalnej wydajności muszą przyciąć zbędny kod. Techniki w tym przewodniku, zainspirowane doskonałym skryptem optymalizacji Terence’a Edena, pomogą Ci osiągnąć lżejszą, szybszą instalację WordPress.
Pamiętaj: mniej znaczy więcej. Każda linia kodu, którą usuniesz, to o jeden potencjalny punkt awarii mniej, o jeden bajt do pobrania mniej i o jeden krok bliżej do idealnego wyniku PageSpeed.
Kompletna inwentaryzacja bloatu WordPressa
Zanim zaczniesz optymalizować, warto zrozumieć, co dokładnie WordPress ładuje domyślnie i ile to kosztuje:
Analiza domyślnego ładunku WordPressa
Domyślna instalacja WordPress 6.6+ ładuje:
| Element | Rozmiar | Żądania HTTP | Wpływ |
|---|---|---|---|
| Emoji scripts + styles | ~20KB | 2 | Blokujące renderowanie |
| Dashicons (frontend) | ~30KB | 1 | Rzadko używane |
| jQuery + jQuery Migrate | ~60KB | 2 | Legacy support |
| Classic theme styles | ~5KB | 1 | Niepotrzebne w custom themes |
| Block library CSS | ~15KB | 1 | Jeśli nie używasz Gutenberga |
| Global styles (inline) | ~5-15KB | 0 | Inline CSS |
| REST API links | ~0.5KB | 0 | Meta tags |
| RSD + WLW links | ~0.2KB | 0 | Legacy |
| Shortlink | ~0.1KB | 0 | Niepotrzebne |
| Generator meta | ~0.05KB | 0 | Security risk |
| RAZEM | ~130-150KB | 7-8 | Znaczący |
Narzędzia do analizy bloatu
# Sprawdź co ładuje WordPress (wymaga WP-CLI)
wp eval '
$scripts = wp_scripts();
$styles = wp_styles();
echo "=== SCRIPTS ===\n";
foreach ($scripts->queue as $handle) {
$script = $scripts->registered[$handle];
echo $handle . " => " . ($script->src ?: "inline") . "\n";
}
echo "\n=== STYLES ===\n";
foreach ($styles->queue as $handle) {
$style = $styles->registered[$handle];
echo $handle . " => " . ($style->src ?: "inline") . "\n";
}
'
Analiza w przeglądarce
-
Chrome DevTools → Network tab:
- Odśwież stronę (Ctrl+F5)
- Filtruj po “Domain” = Twoja domena
- Posortuj po “Size”
-
Lighthouse w DevTools:
- Audits → Performance
- Sprawdź “Reduce unused CSS/JS”
-
WebPageTest.org:
- Testuj z różnych lokalizacji
- Analizuj “Waterfall view”
Szczegółowa analiza funkcja po funkcji
1. Classic Theme Styles - głęboka analiza
Co to jest: WordPress 6.1+ wprowadził style wspierające klasyczne motywy w nowym systemie bloków. Te style są ładowane nawet w niestandardowych motywach, które ich nie potrzebują.
Koszt:
- CSS: ~5KB (skompresowane)
- Blokowanie renderowania: Tak (ładowane w
<head>)
Kiedy wyłączyć:
- ✅ Niestandardowe motywy (custom themes)
- ✅ Motywy blokowe (FSE themes)
- ✅ Strony z własnym CSS
Kiedy ZOSTAWIĆ:
- ❌ Klasyczne motywy (Twenty Twenty-One i starsze)
- ❌ Motywy korzystające z klasycznych widgetów
- ❌ Strony z klasycznym edytorem
// Zaawansowane wyłączenie z priorytetem
function disable_classic_theme_styles_pro() {
wp_dequeue_style('classic-theme-styles');
wp_deregister_style('classic-theme-styles');
}
add_action('wp_enqueue_scripts', 'disable_classic_theme_styles_pro', 20);
// Dodatkowo wyłącz w adminie (opcjonalnie)
add_action('admin_enqueue_scripts', 'disable_classic_theme_styles_pro', 20);
2. Emoji - pełny kontekst
Co to jest: System konwersji tekstowych emotikonów (:-)) na graficzne emoji. Zawiera:
- Skrypt wykrywający obsługę emoji (~12KB)
- Style CSS (~8KB)
- DNS prefetch do CDN emoji
Koszt:
- JS: ~12KB
- CSS: ~8KB
- DNS prefetch: 1 dodatkowe połączenie
- Łącznie: ~20KB + opóźnienie DNS
Kiedy wyłączyć:
- ✅ Wszystkie nowoczesne strony (przeglądarki mają natywne emoji od 2016+)
- ✅ Strony biznesowe/profesjonalne
- ✅ Strony z focus na wydajność
Kiedy ZOSTAWIĆ:
- ❌ Strony z targetem na stare przeglądarki (IE11)
- ❌ Blogi osobiste gdzie emoji są ważne
- ❌ Strony z dużą ilością treści generowanej przez użytkowników
// Kompletne wyłączenie emoji (wszystkie konteksty)
function disable_emojis_completely() {
// Frontend
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// Admin
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
// Feeds
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
// Emails
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
// TinyMCE
add_filter('tiny_mce_plugins', function($plugins) {
return array_diff($plugins, ['wpemoji']);
});
// DNS prefetch
add_filter('emoji_svg_url', '__return_false');
}
add_action('init', 'disable_emojis_completely');
3. Automatyczne formatowanie tekstu (wptexturize)
Co to jest: Funkcja zamieniająca:
"→"(curly quotes)'→'(curly apostrophe)--→–(en-dash)---→—(em-dash)...→…(ellipsis)
Koszt:
- CPU: Przetwarzanie każdego wywołania the_content()
- Problemy: Psuje kod w treści (shortcodes, HTML)
Kiedy wyłączyć:
- ✅ Strony z kodem w treści
- ✅ Dokumentacja techniczna
- ✅ Strony z shortcode’ami
Kiedy ZOSTAWIĆ:
- ❌ Blogi literackie
- ❌ Strony z dużą ilością tekstu
- ❌ Gdy typografia jest priorytetem
// Wyłącz wszystkie filtry wptexturize
add_filter('run_wptexturize', '__return_false');
// Lub selektywnie
remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
remove_filter('the_title', 'wptexturize');
4. capital_P_dangit - analiza
Co to jest: Automatyczna korekta “WordPress” → “WordPress”. Działa agresywnie na całą treść.
Problemy:
- Zmienia treść bez wiedzy użytkownika
- Może psuć kod (np. nazwy zmiennych)
- Działa na URL-e (wppoland.com/Wordpress/ → wppoland.com/WordPress/)
// Wyłącz wszędzie
add_action('init', function() {
foreach (array('the_content', 'the_title', 'wp_title', 'document_title') as $filter) {
remove_filter($filter, 'capital_P_dangit', 11);
}
remove_filter('comment_text', 'capital_P_dangit', 31);
}, 11);
5. Style i skrypty Gutenberga - szczegóły
Co jest ładowane:
wp-block-library(~15KB) - style blokówwp-block-library-theme(~5KB) - style motywówglobal-styles(inline) - style z theme.jsonwp-components(~50KB) - tylko w adminie
Koszt frontend:
- CSS: ~20KB
- Inline CSS: 5-15KB (zależy od theme.json)
Kiedy wyłączyć:
- ✅ Strony używające klasycznego edytora
- ✅ Custom themes bez bloków
- ✅ Landing pages z custom CSS
Kiedy ZOSTAWIĆ:
- ❌ Strony używające Gutenberga
- ❌ Full Site Editing themes
- ❌ Strony z dynamicznymi blokami
// Wyłącz style Gutenberga (ostrożnie!)
function disable_gutenberg_styles() {
// Global styles (inline CSS)
remove_action('wp_enqueue_scripts', 'wp_enqueue_global_styles');
// Block library CSS
wp_dequeue_style('wp-block-library');
wp_dequeue_style('wp-block-library-theme');
wp_dequeue_style('wp-components');
// Remove SVG filters
remove_action('wp_body_open', 'wp_global_styles_render_svg_filters');
}
add_action('wp_enqueue_scripts', 'disable_gutenberg_styles', 100);
// Wyłącz block widgets (powrót do klasycznych)
add_filter('gutenberg_use_widgets_block_editor', '__return_false');
add_filter('use_widgets_block_editor', '__return_false');
6. Meta tagi w nagłówku - kompletna lista
Lista domyślnych meta tagów:
<!-- WordPress generuje: -->
<meta name="generator" content="WordPress 6.6.1" /> <!-- Bezpieczeństwo -->
<link rel="shortlink" href="https://wppoland.com/?p=123" /> <!-- Niepotrzebne -->
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://wppoland.com/xmlrpc.php?rsd" /> <!-- Legacy -->
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://wppoland.com/wp-includes/wlwmanifest.xml" /> <!-- Legacy -->
<link rel="https://api.w.org/" href="https://wppoland.com/wp-json/" /> <!-- REST API -->
<link rel="alternate" type="application/json" href="https://wppoland.com/wp-json/wp/v2/posts/123" /> <!-- REST API -->
Analiza ryzyka/bezpieczeństwa:
| Tag | Ryzyko | Rekomendacja |
|---|---|---|
| generator | Wysokie (fingerprinting) | Usuń |
| shortlink | Brak | Usuń (nieużywane) |
| RSD | Średnie (XML-RPC) | Usuń |
| WLW | Brak (legacy) | Usuń |
| REST API | Niskie | Zostaw (potrzebne) |
// Kompletne czyszczenie nagłówka
function clean_wp_head() {
// Generator (security risk)
remove_action('wp_head', 'wp_generator');
// Shortlink
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('template_redirect', 'wp_shortlink_header', 11);
// RSD (XML-RPC)
remove_action('wp_head', 'rsd_link');
// Windows Live Writer
remove_action('wp_head', 'wlwmanifest_link');
// Feed links (opcjonalnie - zostaw jeśli używasz RSS)
// remove_action('wp_head', 'feed_links', 2);
// remove_action('wp_head', 'feed_links_extra', 3);
// Adjacent posts (poprzedni/następny wpis)
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
// REST API links (zostaw jeśli używasz REST API)
// remove_action('wp_head', 'rest_output_link_wp_head');
// remove_action('template_redirect', 'rest_output_link_header', 11, 0);
// Emoji (patrz sekcja 2)
remove_action('wp_head', 'print_emoji_detection_script', 7);
}
add_action('init', 'clean_wp_head');
7. Ulepszenia obrazów WordPressa
Co WordPress robi z obrazami:
- Dodaje atrybuty
loading="lazy"(lazy loading) - Generuje atrybuty
srcset(responsive images) - Dodaje atrybuty
sizes(rozmiary) - Dodaje
decoding="async"
Koszt:
- CPU: Przetwarzanie każdego obrazu
- HTML: Zwiększony rozmiar (atrybuty)
Kiedy wyłączyć:
- ✅ Jeśli zarządzasz obrazami samodzielnie
- ✅ Używasz CDN z własną optymalizacją
- ✅ Masz custom lazy loading
// Wyłącz automatyczne lazy loading
add_filter('wp_lazy_loading_enabled', '__return_false');
// Wyłącz auto-sizes (WordPress 6.4+)
add_filter('wp_img_tag_add_auto_sizes', '__return_false');
// Wyłącz srcset (niezalecane, ale możliwe)
// add_filter('wp_calculate_image_srcset', '__return_false');
8. Sprawdzanie przeglądarki (browser check)
Co to jest: WordPress sprawdza przeglądarkę użytkownika w panelu admina i zapisuje wynik w transients.
Koszt:
- Transient w bazie danych
- Niepotrzebne zapytanie przy każdym ładowaniu admina
// Wyłącz sprawdzanie przeglądarki
add_filter('pre_site_transient_browser_' . md5($_SERVER['HTTP_USER_AGENT'] ?? ''), '__return_null');
// Wyłącz sprawdzanie wersji PHP
add_filter('pre_site_transient_phpcompat_' . md5($_SERVER['HTTP_USER_AGENT'] ?? ''), '__return_null');
9. XML-RPC - pełna analiza
Co to jest: Protokół zdalnego zarządzania WordPressem. Używany przez:
- Stare aplikacje mobilne WordPress
- Windows Live Writer
- Niektóre wtyczki (Jetpack, niektóre API)
Ryzyko bezpieczeństwa:
- Ataki brute force przez xmlrpc.php
- DDoS amplification attacks
- Pingback spam
Koszt:
- Endpoint dostępny publicznie
- Potencjalne luki bezpieczeństwa
Kiedy wyłączyć:
- ✅ Standardowe strony (nie używające zewnętrznych aplikacji)
- ✅ Strony z Jetpackiem (używa REST API)
- ✅ Nowe instalacje
Kiedy ZOSTAWIĆ:
- ❌ Stare aplikacje mobilne WordPress
- ❌ Windows Live Writer
- ❌ Niestandardowe integracje używające XML-RPC
// Całkowite wyłączenie XML-RPC
add_filter('xmlrpc_enabled', '__return_false');
// Wyłącz konkretne metody (bardziej selektywne)
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
unset($methods['wp.getUsersBlogs']); // brute force vector
return $methods;
});
// Wyłącz X-Pingback header
add_filter('wp_headers', function($headers) {
unset($headers['X-Pingback']);
return $headers;
});
10. jQuery Migrate - analiza
Co to jest: Biblioteka zapewniająca kompatybilność ze starymi wtyczkami używającymi przestarzałych funkcji jQuery.
Koszt:
- JS: ~15KB
- Dodatkowe przetwarzanie
Kiedy usunąć:
- ✅ Nowoczesne wtyczki (sprawdź konsolę błędów)
- ✅ Custom themes bez legacy code
- ✅ Strony z nowym jQuery
Kiedy ZOSTAWIĆ:
- ❌ Starsze wtyczki (sprawdź w konsoli czy występują błędy)
- ❌ Stare motywy
- ❌ Gdy widzisz błędy jQuery w konsoli
// Usuń jQuery Migrate
function remove_jquery_migrate($scripts) {
if (!is_admin() && isset($scripts->registered['jquery'])) {
$script = $scripts->registered['jquery'];
if ($script->deps) {
$script->deps = array_diff($script->deps, array('jquery-migrate'));
}
}
}
add_action('wp_default_scripts', 'remove_jquery_migrate');
// Dodatkowo usuń skrypt migrate
function dequeue_jquery_migrate() {
wp_deregister_script('jquery-migrate');
}
add_action('wp_enqueue_scripts', 'dequeue_jquery_migrate');
11. oEmbed - analiza
Co to jest: System automatycznego osadzania treści z innych stron (YouTube, Twitter, itp.).
Co ładuje:
- Skrypt wykrywania oEmbed (~5KB)
- Linki discovery w nagłówku
- Endpoint REST API
Koszt:
- JS: ~5KB
- Meta tags: ~0.5KB
Kiedy wyłączyć:
- ✅ Strony nie osadzające treści zewnętrznych
- ✅ Landing pages
- ✅ Strony z focus na wydajność
Kiedy ZOSTAWIĆ:
- ❌ Blogi z osadzonymi filmami
- ❌ Strony z social media embeds
- ❌ Strony z treścią generowaną przez użytkowników
// Wyłącz oEmbed
function disable_oembed() {
// Linki discovery
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
// Endpoint REST API
remove_action('rest_api_init', 'wp_oembed_register_route');
// Auto-discovery
add_filter('embed_oembed_discover', '__return_false');
// Wyłącz filtry oEmbed
remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
remove_action('wp_head', 'wp_oembed_add_discovery_links');
// Usuń z TinyMCE
add_filter('tiny_mce_plugins', function($plugins) {
return array_diff($plugins, ['wpembed']);
});
}
add_action('init', 'disable_oembed');
Testowanie wydajności przed i po
Metodologia testowania
Narzędzia:
- PageSpeed Insights - Core Web Vitals
- GTmetrix - Szczegółowa analiza
- WebPageTest - Wielokrotne testy
- Chrome DevTools - Network tab
Procedura testowa:
# 1. Przygotuj środowisko
- Wyczyść cache
- Wyłącz wtyczki cache'ujące
- Testuj na tym samym hostingu
# 2. Zmierz baseline (przed optymalizacją)
- PageSpeed Insights (3 testy, średnia)
- GTmetrix (3 testy, średnia)
- WebPageTest (9 testów, mediana)
# 3. Wdróż zmiany
- Dodaj kod debloating
- Wyczyść cache
# 4. Zmierz wyniki (po optymalizacji)
- Powtórz te same testy
# 5. Oblicz poprawę
- Różnica w wadze strony
- Różnica w liczbie żądań
- Różnica w Core Web Vitals
Oczekiwane wyniki
Typowa poprawa:
| Metryka | Przed | Po | Poprawa |
|---|---|---|---|
| Rozmiar HTML | 250KB | 180KB | -28% |
| Żądania HTTP | 35 | 28 | -20% |
| LCP | 2.8s | 2.3s | -18% |
| TTI | 4.5s | 3.8s | -16% |
| PageSpeed Score | 72 | 88 | +22% |
Skrypt do automatycznego testowania
<?php
// Testowanie wydajności - dodaj do mu-plugin
function log_performance_metrics() {
if (!is_admin() && !wp_doing_ajax()) {
$scripts = wp_scripts();
$styles = wp_styles();
$metrics = [
'timestamp' => current_time('mysql'),
'url' => $_SERVER['REQUEST_URI'],
'scripts_count' => count($scripts->queue),
'styles_count' => count($styles->queue),
'memory_usage' => size_format(memory_get_usage(true)),
];
error_log('PERFORMANCE: ' . json_encode($metrics));
}
}
add_action('wp_footer', 'log_performance_metrics', 999);
Rozważania dotyczące kompatybilności
Sprawdzanie konfliktów
Po każdej zmianie sprawdź:
-
Frontend:
- Czy strona wygląda poprawnie?
- Czy wszystkie funkcje działają?
- Czy w konsoli nie ma błędów JS?
-
Panel admina:
- Czy edytor działa?
- Czy media library działa?
- Czy wszystkie wtyczki działają?
-
Formularze:
- Czy formularze kontaktowe działają?
- Czy komentarze działają?
Debugowanie problemów
// Włącz debugowanie podczas testowania
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
// Loguj wszystkie skrypty i style
add_action('wp_footer', function() {
global $wp_scripts, $wp_styles;
error_log('=== ENQUEUED SCRIPTS ===');
foreach ($wp_scripts->queue as $handle) {
error_log($handle . ' => ' . $wp_scripts->registered[$handle]->src);
}
error_log('=== ENQUEUED STYLES ===');
foreach ($wp_styles->queue as $handle) {
error_log($handle . ' => ' . $wp_styles->registered[$handle]->src);
}
}, 999);
Częste problemy i rozwiązania
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| Nie działają emoji | Wyłączone emoji + stara przeglądarka | Włącz emoji lub użyj polyfill |
| Błędy jQuery | Usunięty jQuery Migrate | Przywróć migrate lub zaktualizuj wtyczki |
| Nie działa edytor | Wyłączone style Gutenberga | Przywróć style lub użyj klasycznego edytora |
| Nie działają embedy | Wyłączone oEmbed | Przywróć oEmbed lub użyj iframe |
| Błędy REST API | Wyłączone linki REST | Przywróć linki REST |
Automatyzacja przez mu-plugins
Struktura mu-plugin
wp-content/
├── mu-plugins/
│ ├── loader.php # Ładowanie wszystkich modułów
│ └── debloat/
│ ├── debloat.php # Główny plik
│ ├── emoji.php # Wyłączenie emoji
│ ├── gutenberg.php # Style Gutenberga
│ ├── head-cleanup.php # Czyszczenie nagłówka
│ ├── security.php # XML-RPC, generator
│ └── performance.php # Heartbeat, autosave
Główny loader
<?php
// wp-content/mu-plugins/loader.php
/**
* Plugin Name: WordPress Debloat Suite
* Description: Kompletna optymalizacja WordPressa
* Version: 2.0.0
* Author: Twoje Imię
*/
// Zabezpieczenie
if (!defined('ABSPATH')) exit;
// Definiuj stałe
define('DEBLOAT_VERSION', '2.0.0');
define('DEBLOAT_PATH', plugin_dir_path(__FILE__));
// Załaduj moduły
$modules = [
'emoji',
'gutenberg',
'head-cleanup',
'security',
'performance',
];
foreach ($modules as $module) {
$file = DEBLOAT_PATH . 'debloat/' . $module . '.php';
if (file_exists($file)) {
require_once $file;
}
}
Moduł emoji
<?php
// wp-content/mu-plugins/debloat/emoji.php
/**
* Wyłączenie emoji WordPressa
*/
// Wyłącz emoji we wszystkich kontekstach
add_action('init', function() {
// Frontend
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// Admin
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
// Feeds
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
// Emails
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
// TinyMCE
add_filter('tiny_mce_plugins', function($plugins) {
return array_diff($plugins, ['wpemoji']);
});
// DNS prefetch
add_filter('emoji_svg_url', '__return_false');
});
Moduł czyszczenia nagłówka
<?php
// wp-content/mu-plugins/debloat/head-cleanup.php
/**
* Czyszczenie niepotrzebnych tagów z wp_head
*/
add_action('init', function() {
// Generator (bezpieczeństwo)
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');
// Shortlink
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('template_redirect', 'wp_shortlink_header', 11);
// RSD
remove_action('wp_head', 'rsd_link');
// WLW
remove_action('wp_head', 'wlwmanifest_link');
// Adjacent posts
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
// Feed links (opcjonalnie)
// remove_action('wp_head', 'feed_links', 2);
// remove_action('wp_head', 'feed_links_extra', 3);
});
Moduł bezpieczeństwa
<?php
// wp-content/mu-plugins/debloat/security.php
/**
* Zabezpieczenia i wyłączenie niepotrzebnych funkcji
*/
// XML-RPC
add_filter('xmlrpc_enabled', '__return_false');
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
add_filter('wp_headers', function($headers) {
unset($headers['X-Pingback']);
return $headers;
});
// Ukryj wersję
remove_action('wp_head', 'wp_generator');
// Wyłącz sprawdzanie przeglądarki
add_filter('pre_site_transient_browser_' . md5($_SERVER['HTTP_USER_AGENT'] ?? ''), '__return_null');
Moduł wydajności
<?php
// wp-content/mu-plugins/debloat/performance.php
/**
* Optymalizacje wydajnościowe
*/
// Heartbeat API
add_filter('heartbeat_settings', function($settings) {
$settings['interval'] = 60;
return $settings;
});
add_action('init', function() {
if (!is_admin()) {
wp_deregister_script('heartbeat');
}
}, 1);
// Autosave interval
add_filter('autosave_interval', function() {
return 120; // 2 minuty (domyślnie 1 minuta)
});
// Wyłącz auto-update dla wtyczek (kontrola)
add_filter('auto_update_plugin', '__return_false');
add_filter('auto_update_theme', '__return_false');
FAQ
Czy wyłączenie funkcji WordPressa jest bezpieczne?
Większość funkcji opisanych w tym przewodniku można bezpiecznie wyłączyć na nowoczesnych stronach. Kluczowe jest testowanie każdej zmiany - niektóre starsze wtyczki lub motywy mogą polegać na funkcjach, które wyłączasz. Zawsze testuj na środowisku staging przed wdrożeniem na produkcję.
Ile mogę zaoszczędzić dzięki debloating?
Typowa redukcja to 30-50% rozmiaru strony HTML i 20-40% liczby zapytań HTTP. Dla standardowej instalacji WordPress to około 50-150KB mniej kodu i 3-7 mniej zapytań na stronę. W praktyce przekłada się to na poprawę Core Web Vitals i lepsze wyniki w PageSpeed Insights.
Czy debloating wpłynie na funkcjonalność strony?
Jeśli zrobisz to prawidłowo - nie. Funkcje takie jak emoji, XML-RPC czy jQuery Migrate są rzadko używane na nowoczesnych stronach. Jednak jeśli używasz zewnętrznych aplikacji do publikowania (XML-RPC) lub masz starsze wtyczki (jQuery Migrate), możesz napotkać problemy. Zawsze testuj kompletne funkcjonalności.
Czy powinienem używać wtyczki do optymalizacji zamiast kodu?
Wtyczki jak Asset CleanUp czy Perfmatters oferują podobne funkcje z interfejsem graficznym. Są dobre dla początkujących, ale dodają narzut (kolejna wtyczka). Kod w mu-plugin jest lżejszy, szybszy i daje pełną kontrolę. Dla zaawansowanych użytkowników zalecam podejście kodowe.
Jak często powinienem aktualizować kod debloating?
Przeglądaj kod przy każdej głównej aktualizacji WordPressa (2-3 razy w roku). WordPress dodaje nowe funkcje, które mogą wymagać optymalizacji. Subskrybuj blogi deweloperskie i śledź zmiany w core WordPressa, aby być na bieżąco.
Czy debloating zastępuje wtyczkę cache’ującą?
Nie. Debloating i cache’owanie to uzupełniające się techniki. Debloating redukuje ilość kodu, który WordPress generuje. Cache’owanie redukuje ilość pracy, jaką serwer musi wykonać. Dla maksymalnej wydajności używaj obu.
Czy powinienem wyłączyć wszystko naraz?
Niezalecane. Wyłączaj funkcje pojedynczo lub w małych grupach, testując po każdej zmianie. To ułatwia identyfikację problemów, jeśli coś przestanie działać.
Co zrobić, jeśli coś przestanie działać?
- Sprawdź konsolę przeglądarki (F12 → Console) pod kątem błędów JS
- Sprawdź logi błędów WordPressa (wp-content/debug.log)
- Przywróć ostatnią zmianę
- Testuj funkcjonalność, która nie działa
- Znajdź alternatywne rozwiązanie lub zostaw funkcję włączoną
Czy debloating jest kompatybilny z WooCommerce?
Tak, ale wymaga ostrożności. WooCommerce używa niektórych funkcji WordPressa, więc zawsze testuj dokładnie strony produktów, koszyk i checkout. Niektóre funkcje (np. REST API) są wymagane przez WooCommerce.
Jak sprawdzić, czy moja strona potrzebuje debloating?
Przeprowadź audyt wydajności:
- Uruchom PageSpeed Insights
- Sprawdź liczbę żądań HTTP w Network tab
- Zobacz rozmiar dokumentu HTML
- Porównaj z benchmarkami (dobra strona: <100KB HTML, <30 żądań)
Jeśli Twoja strona przekracza te wartości, debloating może pomóc.



