
Voeg in het bestand functions.php van je thema een filter toe op parse_query dat elke zoekopdracht omzet in een 404, een filter get_search_form dat een lege string teruggeeft, en verwijder het widget en het blok voor zoeken. De volledige code, getest op WordPress 7.1, staat in het artikel, er is geen plugin nodig.
Een presentatiewebsite van vijf pagina’s, een one-pager, een portfolio: de zoekfunctie van WordPress dient daar nergens voor, en het bijbehorende formulier staat het thema in de weg. Erger nog, de resultatenpagina bestaat ook zonder formulier, op het adres /?s=mot, en toont een lege pagina of een lijst met inhoud die je niet onder de aandacht wilde brengen. Zo schakel je de zoekfunctie in WordPress volledig uit, zonder plugin, met een fragment voor functions.php.
Waarom je de zoekfunctie uitschakelt
- Ze is overbodig op een kleine site: alles is met één klik bereikbaar vanuit het menu.
- Ze genereert waardeloze resultatenpagina’s, die bots met eender welk woord kunnen opvragen, wat serverbronnen verspilt en overbodige URL’s creëert.
- Het formulier dat het thema oplegt past vaak niet in het ontwerp.
De volledige code voor functions.php
Te plaatsen in het bestand functions.php van je child theme (of in een kleine eigen plugin, om themawissels te overleven). Elk blok sluit een andere deur.
<?php
/**
* Schakelt de WordPress-zoekfunctie aan de voorkant uit.
*/
// 1. Elke zoekopdracht via URL (/?s=mot of /search/mot/) wordt een 404-pagina.
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. Het zoekformulier van het thema wordt niet meer getoond.
add_filter( 'get_search_form', '__return_empty_string' );
// 3. Het klassieke zoekwidget wordt verwijderd.
add_action( 'widgets_init', function () {
unregister_widget( 'WP_Widget_Search' );
}, 11 );
// 4. Het blok 'Zoeken' verdwijnt uit het invoegmenu van de editor.
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. Het REST-eindpunt voor zoeken wordt gesloten.
add_filter( 'rest_endpoints', function ( array $endpoints ) {
unset( $endpoints['/wp/v2/search'], $endpoints['/wp/v2/search/(?P<id>[\d]+)'] );
return $endpoints;
} );Wat elk blok doet:
- De query. Bij
parse_querywordt de hoofdquery, als het om een zoekopdracht aan de voorkant gaat, omgezet in een 404 metset_404()en de bijbehorende HTTP-code.is_admin()houdt de zoekfunctie van het beheerscherm intact,is_main_query()voorkomt dat secundaire query’s van extensies worden geraakt. - Het formulier.
get_search_form()is de functie die thema’s aanroepen om het formulier te tonen, het filter zorgt ervoor dat deze functie een lege string teruggeeft. - Het widget van klassieke thema’s.
- Het blok van blokgebaseerde thema’s. Het filter ontvangt ofwel
true(alle blokken toegestaan), ofwel een lijst: in het eerste geval wordt eerst de volledige lijst opgebouwd voordatcore/searcheruit wordt gehaald. - De REST API.
/wp-json/wp/v2/search?search=motgeeft nu een foutrest_no_routeterug in plaats van een lijst met resultaten.
Controleren
Drie verzoeken volstaan, in een browser of met 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":"Er is geen route gevonden die overeenkomt met de URL en de aanvraagmethode."…
curl -s "https://exemple.fr/" | grep -c 'role="search"'
# 0: geen formulier meer op de pagina (als het thema via get_search_form werkt)In het beheerscherm moet het zoeken in berichten, pagina’s en media gewoon blijven werken.
Als het thema zijn eigen formulier toont
Sommige thema’s schrijven het formulier rechtstreeks in hun templates (header.php, searchform.php) zonder get_search_form() te gebruiken. Het filter heeft dan geen enkel effect op de weergave. Twee opties: de betreffende template overschrijven in een child theme, of het formulier ondertussen verbergen met CSS:
.search-form,
form[role="search"] {
display: none;
}CSS verbergt alleen: het blokkeren van /?s= door het eerste PHP-blok blijft onmisbaar.
Variant: ?s= omleiden via .htaccess
Als je liever geen 404 toont maar doorverwijst naar de homepage, doet een Apache-regel dat al voordat WordPress wordt uitgevoerd. Deze regel geldt alleen voor de root van de site, zodat de zoekfunctie van het beheerscherm (wp-admin/edit.php?s=…) niet wordt geraakt.
# Plaats dit vóór het blok # BEGIN WordPress
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)s= [NC]
RewriteRule ^$ /? [R=301,L]Het afsluitende ? maakt de querystring van de omleiding leeg. Deze regel en de PHP-code sluiten elkaar niet uit: de eerste bespaart de server het uitvoeren van WordPress, de tweede blijft de referentiebescherming, ook voor permalinks zoals /search/mot/.
En de plugin Disable Search?
Die bestaat en doet hetzelfde. Bij Gekkode is de redactionele lijn om geen plugin toe te voegen voor iets wat een thema in dertig regels kan doen: één afhankelijkheid minder om bij te werken, en gedrag dat je in je eigen code terugleest. Als je meerdere sites beheert zonder child theme, blijft de plugin een redelijke optie.
In dezelfde lijn zijn de toegang tot de back-office van WordPress beperken en een WordPress-site migreren twee andere ingrepen die zonder plugin kunnen.
Veelgemaakte fouten
is_search() zonder is_admin() verbreekt het zoeken in de lijsten met berichten en media van het dashboard. De code uit het artikel sluit het beheerscherm uit./?s=mot blijft bereikbaar voor iedereen die de URL intypt. Het filter op parse_query sluit de deur, niet het verwijderen van het formulier.s= zonder padbeperking leidt ook wp-admin/edit.php?s=… om. Beperk de regel tot de root van de site.get_search_form() gebruikt, verwijdert het filter het formulier niet. Dan moet je de template van het thema aanpassen (bij voorkeur een child theme).

