Come passare un parametro di ricerca $_GET a una nuova pagina di ricerca personalizzata?

26 nov 2013, 17:29:08
Visualizzazioni: 21.5K
Voti: 4

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?

0
Tutte le risposte alla domanda 2
1
10

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

  1. 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']
  2. inviare tutte le ricerche all'URL home: /?s=mysearchstring ma agganciare 'template_include' per usare custom-search.php invece di search.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é:

  1. è 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
  2. è 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
26 nov 2013 19:16:01
Commenti

Grazie! Ora ho capito. Utilizzerò la prima soluzione poiché ho bisogno di entrambe le pagine di ricerca. Il nome "custom-search" era puramente dimostrativo.

Glorious Kale Glorious Kale
26 nov 2013 20:16:56
0

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.

26 nov 2013 18:19:54