Otwórz kod źródłowy swojej strony (Ctrl+U w Windows, Cmd+Option+U na Macu) i przewiń do sekcji <head>. Między charset, viewportem a CSS motywu często stoi kilkanaście linii <link>, <meta> i <script>, o które nikt w redakcji nie prosił: kanały komentarzy, link wykrywania RSD, blok ustawień emoji, shortlink z ?p=123 i meta tag generatora z wersją rdzenia.
Te elementy pochodzą z wp_head(). Rdzeń podpina pod ten hook callbacki, a remove_action() wyjmuje z powrotem to, czego Twój projekt nie potrzebuje. Ten poradnik omawia każdy typowy element, bezpieczną listę do usunięcia sprawdzoną z plikiem wp-includes/default-filters.php w WordPress 7.1.3, rzeczy, których nie należy ruszać, różnicę między skryptem emoji a stylami emoji, shortlink kontra canonical, nagłówki na poziomie HTTP oraz wybór między mu-pluginem a plikiem functions.php motywu.
Celem jest mniej szumu w HTML i w panelu sieci. Usunięcie tych tagów samo w sobie nie poprawi wyniku Lighthouse, ale znów czyni dokument czytelnym i zamyka kilka drobnych wycieków informacji. Jeśli chodzi Ci o czas ładowania, zobacz audyt Core Web Vitals.
Co wp_head wypisuje w nagłówku WordPress
wp_head to hook akcji. Klasyczne motywy wywołują wp_head() w header.php, a motywy blokowe dostają to wywołanie z kanwy szablonu w rdzeniu. Rdzeń i wtyczki rejestrują na nim callbacki z priorytetami. Usunięcie callbacku usuwa tylko jego wynik, sam hook dalej się wykonuje.
Typowe callbacki rdzenia w <head> frontendu WordPress 7.1, z priorytetem z default-filters.php:
| Callback | Priorytet | Co wypisuje | Ocena |
|---|---|---|---|
feed_links | 2 | <link rel="alternate"> dla kanału wpisów i kanału komentarzy | Kanał wpisów często nadal przydatny, kanał komentarzy rzadko |
feed_links_extra | 3 | Kanały kategorii, tagów, autorów, wyszukiwań, komentarzy do wpisu | Głównie szum |
wp_oembed_add_discovery_links | 4 | Linki wykrywania oEmbed JSON i XML na widokach pojedynczych | Zostaw, jeśli inne strony osadzają Twoje wpisy |
print_emoji_detection_script | 7 | Planuje ustawienia emoji i loader (od 6.9 wypisywane w stopce) | Nowoczesne przeglądarki rysują emoji natywnie |
rsd_link | 10 | <link rel="EditURI"> do xmlrpc.php?rsd | Przestarzałe |
wp_generator | 10 | meta name="generator" z wersją rdzenia | Wyciek bez żadnej korzyści |
rel_canonical | 10 | Kanoniczny URL bieżącego widoku | Zostaw |
wp_shortlink_wp_head | 10 | <link rel="shortlink"> z ?p=ID | Canonical załatwia SEO |
rest_output_link_wp_head | 10 | Link wykrywania REST API | Zostaw, gdy działa edytor, aplikacje albo frontend headless |
wp_site_icon | 99 | Favicon i ikony dotykowe | Zostaw |
wp_custom_css_cb | 101 | Dodatkowy CSS z Customizera | Zostaw |
Dwóch wierszy, o których wciąż wspominają starsze fragmenty kodu, na tej liście już nie ma. wlwmanifest_link został oznaczony jako przestarzały w WordPress 6.3 i nie jest już podpinany, a adjacent_posts_rel_link_wp_head nie jest używany przez rdzeń od 5.6. Style emoji przeszły w 6.4 z print_emoji_styles do wp_enqueue_emoji_styles. Każdą z tych zmian omawiam niżej.
Tabela zastępuje zgadywanie. Przed pierwszym remove_action obejrzyj źródło strony na stagingu i porównaj je z tą listą.
Jak oczyścić nagłówek WordPress przez remove_action
Poniższa funkcja to rdzeń czyszczenia. Działa na init, więc usuwane callbacki są już zarejestrowane. Podany priorytet musi zgadzać się z pierwotną rejestracją: feed_links jest rejestrowany z 2, feed_links_extra z 3, skrypt wykrywania emoji z 7. remove_action() przyjmuje trzy parametry (hook, callback, priorytet), czwarty argument, który przekazuje wiele fragmentów kodu, jest ignorowany.
/**
* Czyszczenie sekcji head WordPressa.
* Usuwa przestarzałe linki, generator, zasoby emoji i shortlinki.
*/
function wppoland_cleanup_head() {
// RSS: główne i dodatkowe linki kanałów poza head.
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
// Really Simple Discovery (link EditURI).
remove_action( 'wp_head', 'rsd_link' );
// Meta tag generatora i generator w kanałach.
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );
// Emoji: skrypt wykrywania, style, konwersja w kanałach i mailach.
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'embed_head', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
// Shortlink w head HTML i w nagłówku HTTP Link.
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
}
add_action( 'init', 'wppoland_cleanup_head' );Uwagi do stosowania:
- Jeśli Twój główny kanał czytają narzędzia newsletterowe albo zewnętrzne agregatory, zostaw
feed_linksi wyłącz tylko niepotrzebne kanały filtrami opisanymi niżej w sekcji o RSS. rsd_linkmożna usunąć praktycznie na każdej publicznej stronie. Zdalne publikowanie przez XML-RPC to i tak osobny temat ryzyka.the_generatordziała też na XML kanałów. Pusty string usuwa numer wersji również tam.
Które linie remove_action nic nie robią w WordPress 7
Fragmenty kodu do czyszczenia kopiowane z forów zawierają linie, które nie pasują już do niczego w rdzeniu. Nie psują strony, bo remove_action() po prostu zwraca false, gdy callback nie jest zarejestrowany. Wprowadzają za to w błąd kolejnego developera, który myśli, że linia coś robi.
remove_action( 'wp_head', 'wlwmanifest_link' ): link do manifestu Windows Live Writer został oznaczony jako przestarzały w WordPress 6.3. Funkcja zgłasza teraz tylko komunikat o przestarzałości, a rdzeń jej nie podpina. Zostaw tę linię tylko wtedy, gdy nadal obsługujesz strony poniżej 6.3.remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10 ): funkcja wciąż istnieje, ale jej własny docblock mówi, że rdzeń nie używa jej od 5.6. Jeśli widziszrel="prev"irel="next"na pojedynczych wpisach, dodaje je motyw albo wtyczka.start_post_rel_link,index_rel_link,parent_post_rel_link: przestarzałe od WordPress 3.3. Żadna nowoczesna instalacja ich nie podpina.remove_filter( 'wp_resource_hints', 'wp_dependencies_emoji_styles' ): w rdzeniu nie ma takiej funkcji. DNS prefetch dos.w.org, który ta linia miała zatrzymać, został usunięty zwp_resource_hints()w WordPress 6.1.add_filter( 'rest_enabled', '__return_false' ): filtr jest przestarzały od 4.7. Rdzeń wskazuje w zamianrest_authentication_errors, a REST API nie da się już w ten sposób wyłączyć.
Usunięcie tych linii skraca plik i ułatwia przegląd kodu. Punktem odniesienia do porównań jest źródło default-filters.php w 7.1.3.
Których wpisów wp_head nie usuwać
Czyszczenie kończy się tam, gdzie rdzeń i edytor nadal muszą działać. Na liście rzeczy do zostawienia są cztery grupy.
Wykrywanie REST API
rest_output_link_wp_head zapisuje link do /wp-json/, a rest_output_link_header wysyła ten sam link jako nagłówek HTTP. Edytor blokowy, edytor witryny, wiele wtyczek formularzy i frontendy headless WordPress zależą od REST API. Usunięcie linku wykrywania nie psuje niczego od razu, ale klienty trudniej znajdują endpoint, a Ty rozwiązujesz problem, którego nie ma. Żeby zabezpieczyć REST API, ogranicz uwierzytelnianie i trasy zamiast ukrywać link.
CSS motywu i wtyczek
Arkusze stylów trafiają przez wp_enqueue_style i są wypisywane przez wp_print_styles z priorytetem 8. Całkowite opróżnienie wp_head albo wyłączenie wszystkich stylów niszczy układ strony. Czyszczenie dotyczy przestarzałych callbacków rdzenia, nie wp_enqueue_*. To samo dotyczy skryptów dodawanych przez motyw i wtyczki: wyrejestrowuj je tylko wtedy, gdy znasz zależność.
Canonical, Open Graph i meta tagi
rel_canonical zostaje. Bez canonical ryzykujesz sygnały zduplikowanej treści na wariantach z query stringami, paginacją albo parametrami śledzącymi. Open Graph i tagi społecznościowe z wtyczek SEO zostają nietknięte, o ile wtyczka ustawia je poprawnie.
Title, robots, ikony i własny CSS
_wp_render_title_tag i wp_robots działają z priorytetem 1 i wypisują <title> oraz meta robots. wp_site_icon wypisuje favicon z priorytetem 99, a wp_custom_css_cb wypisuje dodatkowy CSS z Customizera ze 101. Żaden z nich nie jest zbędnym balastem.
W skrócie: dodatkowe kanały, RSD, generator, zasoby emoji i shortlinki są kandydatami do usunięcia. REST, CSS, canonical, title, robots i ikony to infrastruktura.
Jak wyłączyć emoji w WordPress bez wtyczki
Wiele fragmentów kodu usuwa tylko skrypt wykrywania i zapomina o stylach albo odwrotnie. Rdzeń trzyma te dwie ścieżki osobno i obie zmieniły się w ostatnich wydaniach.
print_emoji_detection_script jest podpięty pod wp_head z priorytetem 7 oraz pod admin_print_scripts. Od WordPress 6.9 nie wypisuje już niczego inline w head. Planuje _print_emoji_detection_script na wp_print_footer_scripts, który wypisuje blok ustawień JSON (id="wp-emoji-settings") i loader emoji jako skrypt type="module" przed </body>. Loader sprawdza, czy przeglądarka rysuje emoji natywnie, i zapisuje wynik w sessionStorage. Dopiero gdy test się nie powiedzie, dodaje wp-emoji-release.min.js, który zamienia emoji na obrazki z s.w.org. W aktualnej przeglądarce kosztem są ustawienia inline i kod loadera (niezminifikowane źródło loadera ma około 13 KB), a nie pobranie pełnego polyfilla.
Style poszły inną drogą. print_emoji_styles został oznaczony jako przestarzały w 6.4 i zastąpiony przez wp_enqueue_emoji_styles, który dodaje styl inline pod uchwytem wp-emoji-styles. Dla zgodności wstecznej rdzeń nadal podpina print_emoji_styles pod wp_print_styles, a nowa funkcja kończy działanie od razu, jeśli ten hook został usunięty. Dlatego remove_action( 'wp_print_styles', 'print_emoji_styles' ) nadal działa w 7.1. Równoważna i bardziej bezpośrednia linia to remove_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' ).
Filtry wp_staticize_emoji (na the_content_feed i comment_text_rss) oraz wp_staticize_emoji_for_email (na wp_mail) zamieniają emoji na obrazki w kanałach i mailach. Na stronach redakcyjnych bez newsletterów pełnych emoji możesz usunąć także je. Jeśli Twoje maile z powiadomieniami opierają się na emoji, zostaw filtr maili i czyść tylko frontend.
Usuń też hooki panelu administracyjnego, inaczej zasoby emoji zostaną w kokpicie. Czyszczenie samego frontendu oszczędza bajty odwiedzającym, nie redaktorom.
Jak hostować obrazki emoji WordPress u siebie
Usunięcie to jedna z opcji. Jeśli chcesz zachować obsługę emoji dla starych przeglądarek, ale uniknąć żądań do domeny zewnętrznej, skieruj bazowe adresy obrazków na własny serwer. Rdzeń udostępnia do tego dwa filtry: emoji_url dla zestawu PNG i emoji_svg_url dla zestawu SVG. W WordPress 7.1 wartości domyślne to https://s.w.org/images/core/emoji/17.0.2/72x72/ i https://s.w.org/images/core/emoji/17.0.2/svg/.
add_filter( 'emoji_url', function () {
return content_url( '/emoji/17.0.2/72x72/' );
} );
add_filter( 'emoji_svg_url', function () {
return content_url( '/emoji/17.0.2/svg/' );
} );Segment wersji w ścieżce zmienia się, gdy rdzeń aktualizuje swój zestaw emoji, więc kopię hostowaną u siebie trzeba odświeżać przy głównych wydaniach. wp_staticize_emoji używa tego samego filtra emoji_url dla kanałów, więc jedna zmiana obejmuje oba miejsca.
Jak usunąć shortlink WordPress i zachować canonical
wp_shortlink_wp_head zapisuje <link rel="shortlink" href="https://example.com/?p=42" />. Dodatkowo wp_shortlink_header działa na template_redirect z priorytetem 11 i wysyła nagłówek HTTP Link: <...>; rel=shortlink. Oba są udogodnieniem dla starych narzędzi do udostępniania. Wyszukiwarki kierują się canonical, nie shortlinkiem.
rel_canonical wskazuje kanoniczny permalink. Shortlink i canonical nie przeczą sobie wprost, ale dwa sygnały URL dla tego samego zasobu dokładają szumu. Shortlink usunięty, canonical zostaje: to jasna preferencja dla ładnego permalinku.
Jeśli krótkie adresy URL obsługuje wtyczka przekierowań albo CDN, po czyszczeniu sprawdź raz nagłówki odpowiedzi w DevTools (Network, potem żądanie dokumentu, potem Response Headers). Nagłówek Link z rel=shortlink powinien zniknąć. Canonical w HTML pozostaje widoczny.
Jak usunąć X-Pingback i inne nagłówki HTTP WordPressa
<head> to tylko połowa tego, co dodaje WordPress. Trzy nagłówki odpowiedzi pochodzą z rdzenia.
X-Pingback: od WordPress 4.4WP::send_headers()dodaje go tylko na widokach pojedynczych wpisów, które przyjmują pingi. Wskazuje naxmlrpc.php.Link: <...>; rel=shortlink: wysyłany przezwp_shortlink_header, usuwany kodem do shortlinków opisanym wyżej.Link: <...>; rel="https://api.w.org/": wysyłany przezrest_output_link_header. Zostaw go z tych samych powodów co link REST w HTML.
Wszystkie nagłówki zebrane przez WP::send_headers() przechodzą przez filtr wp_headers (dostępny od 2.8), więc X-Pingback można usunąć właśnie tam:
add_filter( 'wp_headers', function ( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
} );Jeśli pingi przy wpisie są zamknięte, nagłówek w ogóle nie jest wysyłany. Rdzeń nie podpina tagu <link rel="pingback"> pod wp_head. Jeśli widzisz go w źródle, pochodzi z header.php motywu.
Czyszczenie nagłówka w mu-pluginie czy w functions.php
Oba miejsca działają. Pytanie operacyjne brzmi: co przetrwa.
functions.php w motywie potomnym jest szybki: SFTP albo edytor motywu, zapis, gotowe. Wada: zmiana motywu albo nowy motyw potomny kasuje logikę. Agencje, które wymieniają motywy klientów, tracą czyszczenie po cichu.
Mu-plugin w wp-content/mu-plugins/wppoland-clean-head.php ładuje się automatycznie, bez klikania aktywacji. Zmiana motywu niczego nie zmienia. Wdrożenie przez Git albo rsync zostaje proste, bo plik leży poza motywem. Utwórz folder raz i wersjonuj plik razem z resztą projektu.
Rekomendacja dla stron produkcyjnych: mu-plugin. Do jednorazowych eksperymentów na stagingu motyw potomny jest do przyjęcia, o ile później przeniesiesz funkcję. Unikaj edycji motywu nadrzędnego, bo aktualizacje go nadpisują.
Szkielet mu-pluginu:
<?php
/**
* Plugin Name: WPPoland Clean Head
* Description: Removes legacy wp_head artefacts.
* Author: wppoland.com
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
require_once __DIR__ . '/includes/cleanup-head.php';Właściwa funkcja wppoland_cleanup_head mieszka wtedy w includes/cleanup-head.php. Plik startowy zostaje krótki i łatwy do testowania. Przy każdym usunięciu dodaj komentarz, który mówi, dlaczego tam jest:
// Usunięcie wykrywania emoji: każda obsługiwana przeglądarka rysuje emoji natywnie.
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );Czyszczenie wp_head tylko na frontendzie lub dla headless
Niektóre usunięcia pasują tylko do określonych kontekstów. Poniższy przykład zostawia link REST, gdy własna stała oznacza stronę jako headless.
function wppoland_conditional_head_cleanup() {
// WPPOLAND_HEADLESS to stała projektu ustawiona w wp-config.php.
if ( ! defined( 'WPPOLAND_HEADLESS' ) || ! WPPOLAND_HEADLESS ) {
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
}
}
add_action( 'init', 'wppoland_conditional_head_cleanup' );Jak włączać i wyłączać poszczególne części czyszczenia
Na stronach, na których integracje różnią się między środowiskami, owiń każdą grupę usunięć stałą z wp-config.php. Grupa działa, chyba że jej stała jest zdefiniowana jako false:
/**
* Konfiguracja w wp-config.php, na przykład:
* define( 'WPPCLEANUP_FEED_LINKS', false );
*/
function wppoland_advanced_cleanup_head() {
if ( ! defined( 'WPPCLEANUP_FEED_LINKS' ) || WPPCLEANUP_FEED_LINKS ) {
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
}
if ( ! defined( 'WPPCLEANUP_RSD' ) || WPPCLEANUP_RSD ) {
remove_action( 'wp_head', 'rsd_link' );
}
if ( ! defined( 'WPPCLEANUP_GENERATOR' ) || WPPCLEANUP_GENERATOR ) {
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );
}
if ( ! defined( 'WPPCLEANUP_EMOJIS' ) || WPPCLEANUP_EMOJIS ) {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
}
if ( ! defined( 'WPPCLEANUP_SHORTLINKS' ) || WPPCLEANUP_SHORTLINKS ) {
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
}
}
add_action( 'init', 'wppoland_advanced_cleanup_head' );Staging może wtedy zachować kanały, a produkcja je usunąć, bez dwóch wersji pliku wtyczki.
Jak sprawdzić oczyszczony nagłówek w źródle strony
Po wdrożeniu otwórz publiczny URL w oknie prywatnym i sprawdź trzy warstwy.
- Źródło strony (
Ctrl+U): wyszukajEditURI,emoji,shortlink,generatorialternate. Od WordPress 6.9 ustawienia emoji stoją przed</body>, więc przeszukaj cały dokument, nie tylko head. Przestarzałych trafień ma nie być. Canonical, arkusze stylów i wymagane tagi wtyczek zostają. - DevTools Network: filtruj po
s.w.orgiwp-emoji. Po czyszczeniu emoji nie powinno pojawić się żadne żądanie. Porównaj żądania z head przed zmianą i po niej na tym samym adresie URL. - Nagłówki odpowiedzi: brak nagłówka
Linkzrel=shortlinki brakX-Pingback, jeśli go usunąłeś. Niektóre wtyczki bezpieczeństwa ustawiają własne nagłówki, tych to nie dotyczy.
Lista kontrolna do odbioru:
- Testuj staging i produkcję osobno, wyczyść object cache i cache stron.
- Sprawdź pojedynczy wpis, stronę archiwum i stronę główną (dodatkowe kanały zachowują się na każdej inaczej).
- Sprawdź osobno stronę produktu WooCommerce: wtyczki często dodają tam tagi, które nie pochodzą z tego fragmentu kodu.
- Otwórz raz edytor blokowy i zapisz wpis: REST API musi odpowiadać.
- Opcjonalnie uruchom PageSpeed Insights albo WebPageTest i porównaj bajty HTML oraz domeny zewnętrzne. Spodziewaj się mniej szumu, nie nowego wyniku.
Jeśli po czyszczeniu skrypt emoji nadal się pojawia, sprawdź, która wtyczka go ładuje. remove_action na hookach rdzenia nie zatrzyma wtyczki, która dodaje własną kopię, więc czytaj źródło zamiast ufać fragmentowi kodu.
Jak usunąć linki kanałów RSS z nagłówka WordPress
RSS nie umarł. Podcasty, importy newsletterów i narzędzia monitorujące nadal czytają /feed/. Kanały komentarzy i kanały poszczególnych taksonomii rzadko za to przynoszą ruch i zapełniają head na stronach archiwów.
Pragmatyczne poziomy:
- Tylko kanały komentarzy (
feed_links_show_comments_feedzwraca false). Główny kanał zostaje. - Dodatkowe kanały wyłączone (usuń
feed_links_extra). Kategorie i tagi tracą autowykrywanie w head, a adresy kanałów działają dalej dla każdego, kto je zna. - Wszystkie linki kanałów poza head (
feed_linksifeed_links_extra). Endpointy pozostają dostępne, znika tylko autowykrywanie.
Dla większości stron firmowych wystarczy poziom 1 albo 2. Poziom 3 tylko wtedy, gdy nikt nie subskrybuje kanału i robisz to celowo.
feed_links() nic nie wypisuje, jeśli motyw nie deklaruje add_theme_support( 'automatic-feed-links' ). Jeśli strona w ogóle nie pokazuje linków kanałów, sprawdź motyw, zanim dodasz kod usuwający.
Jak zostawić główny kanał i usunąć tylko część dodatkowych
Usunięcie feed_links_extra działa na zasadzie wszystko albo nic. Rdzeń oferuje dokładniejsze przełączniki. feed_links_show_posts_feed i feed_links_show_comments_feed istnieją od WordPress 4.4. WordPress 6.1 dodał po jednym filtrze na każdy typ dodatkowego kanału: feed_links_extra_show_post_comments_feed, feed_links_extra_show_post_type_archive_feed, feed_links_extra_show_category_feed, feed_links_extra_show_tag_feed, feed_links_extra_show_tax_feed, feed_links_extra_show_author_feed i feed_links_extra_show_search_feed. Od 6.7 feed_links_args filtruje separator i tytuły linków kanałów.
// Zostaw kanał wpisów i kanały kategorii, usuń resztę dodatkowych.
add_filter( 'feed_links_show_comments_feed', '__return_false' );
add_filter( 'feed_links_extra_show_tag_feed', '__return_false' );
add_filter( 'feed_links_extra_show_author_feed', '__return_false' );
add_filter( 'feed_links_extra_show_search_feed', '__return_false' );feed_links_extra_show_post_comments_feed przyjmuje jako wartość domyślną wartość feed_links_show_comments_feed, więc wyłączenie globalnego kanału komentarzy usuwa też link do kanału komentarzy pojedynczego wpisu, chyba że osobno zwrócisz dla niego true. Parametry wymienia wpis w dokumentacji dla feed_links_extra_show_category_feed.
Jak ukryć wersję WordPressa w źródle strony
wp_generator zapisuje wersję rdzenia w HTML. To nie jest włamanie, ale skanery traktują priorytetowo wersje ze znanymi CVE. Usuń meta tag i opróżnij the_generator. Wersja wycieka też w innych miejscach:
- Query stringi zasobów: style i skrypty rdzenia mają
?ver=z wersją rdzenia, na przykład przywp-emoji-release.min.js. - readme.html: plik leży w katalogu głównym WordPressa (
/readme.html), nie wwp-content, i każda aktualizacja rdzenia go przywraca. Zablokuj go na serwerze WWW, jeśli to dla Ciebie ważne. - Wtyczki: wiele wtyczek wypisuje własną wersję w komentarzach albo w adresach zasobów.
Samo czyszczenie nagłówka nie jest programem bezpieczeństwa, usuwa jeden sygnał. CVE, których szuka skaner, zamyka aktualizacja rdzenia i wtyczek.
Jak usunąć parametr ver z adresów CSS i JS
Filtry style_loader_src i script_loader_src dostają każdy URL dodanego zasobu, więc tam można usunąć argument ver:
function wppoland_remove_version_from_assets( $src ) {
if ( $src && strpos( $src, 'ver=' ) !== false ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
}
add_filter( 'style_loader_src', 'wppoland_remove_version_from_assets', 9999 );
add_filter( 'script_loader_src', 'wppoland_remove_version_from_assets', 9999 );Ten parametr unieważnia też cache przeglądarki i CDN po aktualizacji. Bez niego zmieniony plik może być serwowany z cache pod tym samym adresem URL, więc zostaw ten filtr tylko wtedy, gdy Twój deploy albo CDN obsługuje unieważnianie cache w inny sposób.
Czy rel prev i next nadal dają korzyści SEO
rel="prev" i rel="next" między pojedynczymi wpisami pomagały kiedyś przy seriach. Dla pojedynczych wpisów rdzeń nie wypisuje ich od 5.6, więc na aktualnej stronie pochodzą z motywu albo wtyczki SEO. Dla nowoczesnych crawlerów efekt jest pomijalny. Na stronach magazynowych z długimi łańcuchami artykułów możesz je zostawić, na stronach usługowych i w sklepach usuń je we wtyczce, która je dodaje. Więcej ważą linki wewnętrzne w treści i sensowne mapy witryny.
Czyszczenie nagłówka przy WP Rocket i cache stron
Autoptimize, FlyingPress, WP Rocket i podobne narzędzia zmieniają kolejność i łączenie zasobów. Twój fragment z remove_action powinien działać przed cache HTML, czyli w PHP, a nie jako późniejsza zamiana tekstu w optymalizatorze. Jeśli optymalizator ponownie wstrzykuje skrypty emoji albo dopuszcza domeny zewnętrzne, sprawdź jego ustawienia.
Object cache nie przechowuje wyniku wp_head w sposób, który unieważniałby remove_action. Cache stron owszem: stare kopie HTML zachowują dodatkowe tagi, dopóki cache nie zostanie opróżniony. Wyczyszczenie cache po wdrożeniu jest obowiązkowe.
Dlaczego remove_action w wp_head nie działa
Zły priorytet: remove_action( 'wp_head', 'feed_links' ) bez priorytetu 2 nie trafia w callback. Rdzeń rejestruje z priorytetem, a Twoje usunięcie musi mieć tę samą liczbę.
Za wczesny hook: jeśli wywołujesz remove_action na najwyższym poziomie pliku wtyczki, część callbacków nie jest jeszcze zarejestrowana. init albo wp_loaded są bezpieczniejsze niż kod na najwyższym poziomie.
Edytowany motyw nadrzędny: przychodzi aktualizacja, czyszczenie znika. Użyj motywu potomnego albo mu-pluginu.
REST usunięty z list kopiuj-wklej: edytor się psuje albo aplikacje headless nie znajdują /wp-json/. Listy z wątków forum z 2014 roku są ryzykowne bez sprawdzenia, porównaj je z tabelą w tym artykule.
Nieaktualne nazwy callbacków: linia celuje w funkcję, której rdzeń już nie podpina, jak w sekcji o liniach, które nic nie robią. Tag, który próbujesz usunąć, pochodzi wtedy z innego miejsca.
Testowany tylko frontend: panel administracyjny zachowuje zasoby emoji. Odwiedzający tego nie zauważą, redaktorzy na wolnych łączach owszem. Dołącz hooki panelu, jeśli zespół się zgadza.
Podsumowanie
wp_head zbiera wynik rdzenia, motywu i wtyczek. Przestarzałe elementy (RSD, dodatkowe kanały, generator, zasoby emoji, shortlink) można usunąć przez remove_action i kilka filtrów. Wykrywanie REST, dodawane CSS i JS, title, robots, ikony i canonical zostają. Traktuj skrypt emoji i style emoji osobno i pamiętaj, że od 6.9 skrypt jest wypisywany w stopce. Usuń shortlink w HTML i w nagłówku HTTP, zostaw canonical. W aktualnych wersjach usuń linie dla wlwmanifest_link i linków sąsiednich wpisów. Logika należy do mu-pluginu, nie do motywu nadrzędnego. Weryfikacja to przeszukanie źródła, panel sieci i nagłówki odpowiedzi plus wyczyszczenie cache.
Źródła z Developer Handbook: wp_head, remove_action, feed_links, feed_links_extra, print_emoji_detection_script, wp_enqueue_emoji_styles, wp_shortlink_wp_head, wp_shortlink_header, wp_generator, rsd_link, wlwmanifest_link, rel_canonical, wp_headers.
Potrzebujesz pomocy we wdrożeniu tego na stagingu i produkcji? Specjalista WordPress przejdzie wp_head razem z resztą krytycznej ścieżki renderowania.






