Wyłączenie wyszukiwarki WordPress bez wtyczki (functions.php, ?s=)

Kompletny kod do wyłączenia wyszukiwarki WordPress bez wtyczki: zwrócenie 404 na adresach ?s=, usunięcie formularza, widżetu i bloku wyszukiwania, zamknięcie punktu końcowego REST oraz wariant w .htaccess.

Jak wyłączyć wyszukiwarkę w WordPressie: kod i wtyczka
Szybka odpowiedź

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.

functions.php
<?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:

  1. Zapytanie. Na parse_query, jeśli główne zapytanie jest wyszukiwaniem po stronie publicznej, zostaje zamienione w 404 przez set_404() i odpowiedni kod HTTP. is_admin() zostawia wyszukiwarkę kokpitu nietkniętą; is_main_query() chroni zapytania poboczne rozszerzeń.
  2. Formularz. get_search_form() to funkcja, którą motywy wywołują, żeby wyświetlić formularz; filtr każe jej zwracać pusty ciąg.
  3. Widżet motywów klasycznych.
  4. 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 niej core/search.
  5. API REST. /wp-json/wp/v2/search?search=mot zwraca teraz błąd rest_no_route zamiast listy wyników.

Sprawdzenie

Wystarczą trzy zapytania, w przeglądarce albo przez curl:

bash
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:

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=…).

.htaccess
# 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/.

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

Zablokowanie także wyszukiwarki kokpitu Test 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.
Usunięcie formularza i zapomnienie o adresie Formularz to tylko drzwi: /?s=mot pozostaje dostępny dla każdego, kto wpisze ten adres. To filtr na parse_query zamyka drzwi, a nie usunięcie formularza.
Przekierowanie .htaccess na całej witrynie Reguła na s= bez ograniczenia ścieżki przekierowuje także wp-admin/edit.php?s=…. Ogranicz regułę do katalogu głównego witryny.
Motyw, który wyświetla własny formularz Jeśli motyw nie używa get_search_form(), filtr go nie usunie. Trzeba wtedy zmienić szablon motywu (najlepiej potomnego).

WordPress

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty, e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.