
Dodaj w pliku functions.php swojego motywu filtr na parse_query, który zamienia każde zapytanie wyszukiwania w 404, filtr get_search_form zwracający pusty ciąg, a następnie usuń widżet i blok wyszukiwania. Kompletny kod, przetestowany na WordPressie 7.1, znajdziesz w artykule; żadna wtyczka nie jest potrzebna.
Wizytówka na pięć podstron, one-page, portfolio: wyszukiwarka WordPressa nie przydaje się tam do niczego, a jej formularz zaśmieca motyw. Gorzej, strona wyników istnieje nawet bez formularza, pod adresem /?s=mot, i pokazuje pustą stronę albo listę treści, których wcale nie chciałeś eksponować. Oto jak całkowicie wyłączyć wyszukiwanie w WordPressie, bez wtyczki, z gotowym fragmentem do functions.php.
Dlaczego warto wyłączyć wyszukiwanie
- Na małej witrynie jest zbędna: wszystko jest dostępne z menu jednym kliknięciem.
- Generuje bezwartościowe strony wyników, o które roboty mogą pytać dowolnym słowem, co marnuje zasoby serwera i tworzy pasożytnicze adresy URL.
- Formularz narzucony przez motyw często nie pasuje do projektu graficznego.
Kompletny kod do functions.php
Do umieszczenia w pliku functions.php motywu potomnego (albo w małej własnej wtyczce, żeby przetrwał zmianę motywu). Każdy blok zamyka inne drzwi.
<?php
/**
* Wyłącza wyszukiwarkę WordPressa po stronie publicznej.
*/
// 1. Każde wyszukiwanie przez adres URL (/?s=mot lub /search/mot/) staje się stroną 404.
add_action( 'parse_query', function ( WP_Query $query ) {
if ( is_admin() || ! $query->is_main_query() || ! $query->is_search() ) {
return;
}
$query->is_search = false;
$query->set_404();
status_header( 404 );
nocache_headers();
} );
// 2. Formularz wyszukiwania motywu nie jest już wyświetlany.
add_filter( 'get_search_form', '__return_empty_string' );
// 3. Klasyczny widżet wyszukiwania zostaje usunięty.
add_action( 'widgets_init', function () {
unregister_widget( 'WP_Widget_Search' );
}, 11 );
// 4. Blok „Wyszukiwanie” znika z menu wstawiania w edytorze.
add_filter( 'allowed_block_types_all', function ( $allowed ) {
if ( ! is_array( $allowed ) ) {
$registry = WP_Block_Type_Registry::get_instance();
$allowed = array_keys( $registry->get_all_registered() );
}
return array_values( array_diff( $allowed, [ 'core/search' ] ) );
} );
// 5. Punkt końcowy REST wyszukiwania jest zamknięty.
add_filter( 'rest_endpoints', function ( array $endpoints ) {
unset( $endpoints['/wp/v2/search'], $endpoints['/wp/v2/search/(?P<id>[\d]+)'] );
return $endpoints;
} );Co robi każdy blok:
- Zapytanie. Na
parse_query, jeśli główne zapytanie jest wyszukiwaniem po stronie publicznej, zostaje zamienione w 404 przezset_404()i odpowiedni kod HTTP.is_admin()zostawia wyszukiwarkę kokpitu nietkniętą;is_main_query()chroni zapytania poboczne rozszerzeń. - Formularz.
get_search_form()to funkcja, którą motywy wywołują, żeby wyświetlić formularz; filtr każe jej zwracać pusty ciąg. - Widżet motywów klasycznych.
- Blok motywów opartych na blokach. Filtr dostaje albo
true(wszystkie bloki dozwolone), albo listę: w pierwszym przypadku odtwarzamy pełną listę, zanim usuniemy z niejcore/search. - API REST.
/wp-json/wp/v2/search?search=motzwraca teraz błądrest_no_routezamiast listy wyników.
Sprawdzenie
Wystarczą trzy zapytania, w przeglądarce albo przez curl:
curl -s -o /dev/null -w "%{http_code}\n" "https://exemple.fr/?s=test"
# 404
curl -s "https://exemple.fr/wp-json/wp/v2/search?search=test" | head -c 120
# {"code":"rest_no_route","message":"Nie znaleziono trasy pasującej do adresu URL i metody żądania."…
curl -s "https://exemple.fr/" | grep -c 'role="search"'
# 0: brak formularza na stronie (jeśli motyw korzysta z get_search_form)W kokpicie wyszukiwanie wpisów, stron i mediów musi nadal działać.
Jeśli motyw wyświetla własny formularz
Niektóre motywy wpisują formularz wprost w swoje szablony (header.php, searchform.php), z pominięciem get_search_form(). Filtr nie ma wtedy żadnego wpływu na wyświetlanie. Dwie opcje: nadpisać dany szablon w motywie potomnym albo tymczasowo ukryć formularz w CSS:
.search-form,
form[role="search"] {
display: none;
}CSS tylko ukrywa: blokada /?s= przez pierwszy blok PHP pozostaje niezbędna.
Wariant: przekierowanie ?s= w .htaccess
Jeśli wolisz nie serwować 404, tylko odesłać na stronę główną, reguła Apache zrobi to jeszcze zanim WordPress się uruchomi. Jest ograniczona do katalogu głównego witryny, żeby nie ruszyć wyszukiwarki kokpitu (wp-admin/edit.php?s=…).
# Umieścić przed blokiem # BEGIN WordPress
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)s= [NC]
RewriteRule ^$ /? [R=301,L]Końcowy ? opróżnia ciąg zapytania w przekierowaniu. Ta reguła i kod PHP nie wykluczają się: pierwsza oszczędza serwerowi uruchamiania WordPressa, drugi pozostaje zabezpieczeniem odniesienia, także dla bezpośrednich odnośników /search/mot/.
A wtyczka Disable Search?
Istnieje i robi to samo. Na Gekkode linia redakcyjna jest taka, żeby nie dodawać rozszerzenia do tego, co motyw załatwia w trzydziestu linijkach: o jedną zależność mniej do aktualizowania i zachowanie, które czytasz we własnym kodzie. Jeśli administrujesz wieloma witrynami bez motywu potomnego, wtyczka pozostaje rozsądną opcją.
W tym samym duchu ograniczenie dostępu do zaplecza WordPressa i migracja witryny WordPress to dwie inne operacje, które robi się bez rozszerzeń.
Częste błędy
is_search() bez is_admin() psuje wyszukiwanie na listach wpisów i mediów w kokpicie. Kod z artykułu wyłącza z tego zaplecze./?s=mot pozostaje dostępny dla każdego, kto wpisze ten adres. To filtr na parse_query zamyka drzwi, a nie usunięcie formularza.s= bez ograniczenia ścieżki przekierowuje także wp-admin/edit.php?s=…. Ogranicz regułę do katalogu głównego witryny.get_search_form(), filtr go nie usunie. Trzeba wtedy zmienić szablon motywu (najlepiej potomnego).

