Come passare un parametro di ricerca $_GET a una nuova pagina di ricerca personalizzata?
Finora nella mia installazione WordPress ho una pagina di ricerca completa che posso chiamare andando a:
/?s=stringadiricerca
E questo cerca tra le pagine WordPress contenenti la stringa "stringadiricerca
".
Ho creato una nuova pagina "Ricerca Personalizzata" (/custom-search/
) e ho assegnato un file template custom-search.php
(stesso codice di search.php
).
Come posso aggiungere un parametro di ricerca a questa pagina?
/custom-search?s=stringadiricerca
non funziona, mostra solo 404 Pagina Non Trovata, mentre /custom-search/
visualizza una pagina di ricerca come unico risultato.
custom-search.php
codice:
<?php
/*
Template Name: Custom Search
*/
//ID del Post
global $wp_query;
$content_array = $wp_query->get_queried_object();
if(isset($content_array->ID)){
$post_id = $content_array->ID;
}
else $post_id=0;
$template_uri = get_template_directory_uri();
//Ricerca
$allsearch = &new WP_Query("s=$s&showposts=-1");
$count = $allsearch->post_count;
wp_reset_query();
$hits = $count == 1 ? $count." ".__("risultato per","goodweb") : $count." ".__("risultati per","goodweb");
get_header();
?>
insieme al listato HTML.
Cosa posso fare per passare la query di ricerca come parametro a questa pagina?

Il problema è che il parametro 's'
è un parametro standard di query di WordPress, quando usi l'URL /custom-search?s=mysearchstring
stai dicendo a WordPress di recuperare la pagina 'custom-search'
che contiene la stringa 'mysearchstring'
e questo causa un errore 404.
Hai 2 possibilità:
- usare un altro nome per la query string, ad esempio
/custom-search?cs=mysearchstring
e poi all'interno del template della pagina usare la variabile$_GET['cs']
invece della variabile$_GET['s']
- inviare tutte le ricerche all'URL home:
/?s=mysearchstring
ma agganciare'template_include'
per usarecustom-search.php
invece disearch.php
. Questo può essere fatto senza creare una pagina 'custom-search'.
Soluzione 1
L'unica cosa che devi fare è usare la query string 'cs'
invece di 's'
, poi all'interno del tuo template usa:
// ...
$s = filter_input(INPUT_GET, 'cs', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...
Soluzione 2
Elimina la pagina 'custom-page' che usa il template "Custom Search"
: non ne hai bisogno. Puoi anche rimuovere completamente gli header del template, se vuoi.
Invia tutte le richieste di ricerca a /?s=mysearchstring
.
Ora aggiungi al tuo functions.php
:
add_filter('template_include', 'my_custom_search_template');
function my_custom_search_template( $template ) {
if ( is_search() ) {
$ct = locate_template('custom-search.php', false, false);
if ( $ct ) $template = $ct;
}
return $template;
}
In questo modo tutte le richieste di ricerca verranno visualizzate usando il tuo custom-search.php
(se esiste). Nota che la ricerca è già stata eseguita nella query principale, quindi non è necessario eseguirla nuovamente. Se vuoi impostare posts_per_page
a -1 usa pre_get_posts
:
add_action('pre_get_posts', 'search_no_paging');
function search_no_paging( $q ) {
if ( $q->is_main_query() && $q->is_search() && ! is_admin() ) {
$q->set('posts_per_page', -1);
}
}
E nel tuo custom-search.php
usa:
global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("risultato per","goodweb") : $count." ".__("risultati per","goodweb");
get_header();
while( have_posts() ) { the_post();
// il tuo loop qui
}
Come puoi vedere non è necessario eseguire una query personalizzata perché la query principale fa già il lavoro.
La Soluzione 1 è la scelta migliore se vuoi mostrare il contenuto della pagina insieme ai risultati della ricerca, ma se stai creando quella pagina senza contenuto, con il solo scopo di usare il template personalizzato per i risultati di ricerca, la soluzione 2 è migliore perché:
- è indipendente dal tema: il codice può essere inserito in un plugin e usato con qualsiasi tema, e non richiede che la pagina venga creata nel backend
- è più performante: se usi la soluzione 1, vengono eseguite due query, la prima per ottenere la pagina, la seconda per i risultati di ricerca; usando la soluzione 2 viene eseguita solo una query

Una stringa GET
funzionerà esattamente come in qualsiasi altra applicazione PHP, ma non puoi utilizzare un parametro di query che WordPress utilizza. Questo è il problema qui. WordPress già utilizza s
. Usa qualcos'altro, come 'mys'.
Onestamente però, la tua ricerca personalizzata sembra praticamente una normale ricerca, quindi non capisco davvero perché lo stai facendo.
