
Aggiungi nel file functions.php del tuo tema un filtro su parse_query che trasforma ogni query di ricerca in una 404, un filtro get_search_form che restituisce una stringa vuota, poi togli il widget e il blocco di ricerca. Il codice completo, testato su WordPress 7.1, è nell'articolo; non serve alcun plugin.
Un sito vetrina di cinque pagine, un sito one-page, un portfolio: la ricerca di WordPress non serve a nulla e il suo modulo ingombra il tema. Peggio, la pagina dei risultati esiste anche senza modulo, all’indirizzo /?s=mot, e mostra una pagina vuota o un elenco di contenuti che non volevi mettere in evidenza. Ecco come disattivare del tutto la ricerca in WordPress, senza plugin, con uno snippet per functions.php.
Perché disattivare la ricerca
- È inutile su un sito piccolo: tutto si raggiunge dal menu in un clic.
- Produce pagine di risultati senza valore, che i bot possono sollecitare con qualsiasi parola, sprecando risorse del server e creando URL parassite.
- Il modulo imposto dal tema spesso non ha posto nel progetto grafico.
Il codice completo per functions.php
Da inserire nel file functions.php del tuo tema child (oppure in un piccolo plugin fatto in casa, così sopravvive ai cambi di tema). Ogni blocco chiude una porta diversa.
<?php
/**
* Disattiva la ricerca di WordPress lato pubblico.
*/
// 1. Ogni ricerca via URL (/?s=mot o /search/mot/) diventa una pagina 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. Il modulo di ricerca del tema non viene più mostrato.
add_filter( 'get_search_form', '__return_empty_string' );
// 3. Il widget di ricerca classico viene rimosso.
add_action( 'widgets_init', function () {
unregister_widget( 'WP_Widget_Search' );
}, 11 );
// 4. Il blocco «Cerca» dell'editor sparisce dal menu di inserimento.
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. L'endpoint REST di ricerca viene chiuso.
add_filter( 'rest_endpoints', function ( array $endpoints ) {
unset( $endpoints['/wp/v2/search'], $endpoints['/wp/v2/search/(?P<id>[\d]+)'] );
return $endpoints;
} );Che cosa fa ogni blocco:
- La query. Su
parse_query, se la query principale è una ricerca lato pubblico, viene trasformata in 404 conset_404()e il codice HTTP corrispondente.is_admin()lascia intatta la ricerca dell’amministrazione;is_main_query()evita di toccare le query secondarie dei plugin. - Il modulo.
get_search_form()è la funzione che i temi chiamano per mostrare il modulo; il filtro le fa restituire una stringa vuota. - Il widget dei temi classici.
- Il blocco dei temi a blocchi. Il filtro riceve
true(tutti i blocchi consentiti) oppure un elenco: nel primo caso si ricostruisce l’elenco completo prima di togliervicore/search. - L’API REST.
/wp-json/wp/v2/search?search=motrestituisce ora un errorerest_no_routeinvece di un elenco di risultati.
Verificare
Bastano tre richieste, in un browser o con 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":"Nessuna rotta corrispondente all'URL e al metodo della richiesta è stata trovata."…
curl -s "https://exemple.fr/" | grep -c 'role="search"'
# 0: nessun modulo nella pagina (se il tema passa da get_search_form)Nell’amministrazione, la ricerca di articoli, pagine e media deve continuare a funzionare.
Se il tema mostra un modulo suo
Alcuni temi scrivono il modulo direttamente nei propri template (header.php, searchform.php) senza passare da get_search_form(). In quel caso il filtro non ha alcun effetto sulla visualizzazione. Due opzioni: sovrascrivere il template in questione in un tema child, oppure nascondere il modulo via CSS nel frattempo:
.search-form,
form[role="search"] {
display: none;
}Il CSS si limita a nascondere: il blocco di /?s= da parte del primo blocco PHP resta indispensabile.
Variante: reindirizzare ?s= in .htaccess
Se preferisci non servire una 404 ma rimandare alla home, una regola Apache lo fa ancora prima che WordPress venga eseguito. È limitata alla radice del sito per non toccare la ricerca dell’amministrazione (wp-admin/edit.php?s=…).
# Da inserire prima del blocco # BEGIN WordPress
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)s= [NC]
RewriteRule ^$ /? [R=301,L]Il ? finale svuota la stringa di query del reindirizzamento. Questa regola e il codice PHP non si escludono: la prima risparmia al server l’esecuzione di WordPress, il secondo resta la protezione di riferimento, anche per i permalink /search/mot/.
E il plugin Disable Search?
Esiste e fa la stessa cosa. Su Gekkode la linea editoriale è di non aggiungere un plugin per ciò che un tema fa in trenta righe: una dipendenza in meno da aggiornare e un comportamento che leggi nel tuo codice. Se amministri più siti senza tema child, il plugin resta un’opzione ragionevole.
Sulla stessa linea, limitare l’accesso al back-office di WordPress e migrare un sito WordPress sono altre due operazioni che si fanno senza plugin.
Errori frequenti
is_search() senza is_admin() rompe la ricerca negli elenchi di articoli e media della bacheca. Il codice dell'articolo esclude l'amministrazione./?s=mot resta accessibile a chiunque digiti l'URL. È il filtro su parse_query a chiudere la porta, non la rimozione del modulo.s= senza vincolo di percorso reindirizza anche wp-admin/edit.php?s=…. Limita la regola alla radice del sito.get_search_form(), il filtro non lo toglie. Bisogna allora modificare il template del tema, preferibilmente child.

