Complete guide to removing bloat from WordPress. Feature-by-feature analysis, performance testing before/after, compatibility considerations, and automation through mu-plugins. Reduce page weight by 30-50%.
PL

WordPress Debloat: Complete Optimization Guide 2026

5.00 /5 - (12 głosów )
Ostatnio zweryfikowano: 1 marca 2026
Doświadczenie: 5+ lat doświadczenia
Spis treści

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_dangit to 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:

  1. Google PageSpeed Insights – Sprawdź Core Web Vitals
  2. GTmetrix – Szczegółowa analiza waterfall
  3. 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:

ElementRozmiarŻądania HTTPWpływ
Emoji scripts + styles~20KB2Blokujące renderowanie
Dashicons (frontend)~30KB1Rzadko używane
jQuery + jQuery Migrate~60KB2Legacy support
Classic theme styles~5KB1Niepotrzebne w custom themes
Block library CSS~15KB1Jeśli nie używasz Gutenberga
Global styles (inline)~5-15KB0Inline CSS
REST API links~0.5KB0Meta tags
RSD + WLW links~0.2KB0Legacy
Shortlink~0.1KB0Niepotrzebne
Generator meta~0.05KB0Security risk
RAZEM~130-150KB7-8Znaczą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

  1. Chrome DevTools → Network tab:

    • Odśwież stronę (Ctrl+F5)
    • Filtruj po “Domain” = Twoja domena
    • Posortuj po “Size”
  2. Lighthouse w DevTools:

    • Audits → Performance
    • Sprawdź “Reduce unused CSS/JS”
  3. 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ów
  • wp-block-library-theme (~5KB) - style motywów
  • global-styles (inline) - style z theme.json
  • wp-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:

TagRyzykoRekomendacja
generatorWysokie (fingerprinting)Usuń
shortlinkBrakUsuń (nieużywane)
RSDŚrednie (XML-RPC)Usuń
WLWBrak (legacy)Usuń
REST APINiskieZostaw (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:

  1. PageSpeed Insights - Core Web Vitals
  2. GTmetrix - Szczegółowa analiza
  3. WebPageTest - Wielokrotne testy
  4. 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:

MetrykaPrzedPoPoprawa
Rozmiar HTML250KB180KB-28%
Żądania HTTP3528-20%
LCP2.8s2.3s-18%
TTI4.5s3.8s-16%
PageSpeed Score7288+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ź:

  1. Frontend:

    • Czy strona wygląda poprawnie?
    • Czy wszystkie funkcje działają?
    • Czy w konsoli nie ma błędów JS?
  2. Panel admina:

    • Czy edytor działa?
    • Czy media library działa?
    • Czy wszystkie wtyczki działają?
  3. 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

ProblemPrzyczynaRozwiązanie
Nie działają emojiWyłączone emoji + stara przeglądarkaWłącz emoji lub użyj polyfill
Błędy jQueryUsunięty jQuery MigratePrzywróć migrate lub zaktualizuj wtyczki
Nie działa edytorWyłączone style GutenbergaPrzywróć style lub użyj klasycznego edytora
Nie działają embedyWyłączone oEmbedPrzywróć oEmbed lub użyj iframe
Błędy REST APIWyłączone linki RESTPrzywróć 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ć?

  1. Sprawdź konsolę przeglądarki (F12 → Console) pod kątem błędów JS
  2. Sprawdź logi błędów WordPressa (wp-content/debug.log)
  3. Przywróć ostatnią zmianę
  4. Testuj funkcjonalność, która nie działa
  5. 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:

  1. Uruchom PageSpeed Insights
  2. Sprawdź liczbę żądań HTTP w Network tab
  3. Zobacz rozmiar dokumentu HTML
  4. Porównaj z benchmarkami (dobra strona: <100KB HTML, <30 żądań)

Jeśli Twoja strona przekracza te wartości, debloating może pomóc.

FAQ do artykułu

Często zadawane pytania

Najważniejsze odpowiedzi, które pomagają wdrożyć temat w praktyce.

SEO-ready GEO-ready AEO-ready 5 Q&A
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.

Potrzebujesz FAQ dopasowanego do branży i rynku? Przygotujemy wersję pod Twoje cele biznesowe.

Porozmawiajmy

Polecane artykuły