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 niestandardówych 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 niestandardówych 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ść że 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
/**
* Optymalizację 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');
Explore os nossos otimização de velocidade WordPress para levar o seu projeto mais longe.


