Cum să transmitem un parametru de căutare $_GET către o nouă pagină personalizată de căutare?
Până acum în instalarea mea WordPress am o pagină completă de căutare WordPress pe care o pot accesa mergând la:
/?s=stringcautare
Aceasta caută prin paginile WordPress care conțin șirul "stringcautare
".
Am creat o pagină nouă "Căutare Personalizată" (/custom-search/
) și i-am atribuit un fișier template custom-search.php
(același cod ca search.php
).
Cum pot adăuga un parametru pentru cuvântul cheie la aceasta?
/custom-search?s=stringcautare
nu funcționează, arată doar pagina 404 Not Found, în timp ce /custom-search/
afișează o pagină de căutare ca singur rezultat.
custom-search.php
cod:
<?php
/*
Template Name: Custom Search
*/
//ID-ul Postării
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();
//Căutare
$allsearch = &new WP_Query("s=$s&showposts=-1");
$count = $allsearch->post_count;
wp_reset_query();
$hits = $count == 1 ? $count." ".__("rezultat pentru","goodweb") : $count." ".__("rezultate pentru","goodweb");
get_header();
?>
împreună cu afișarea html.
Ce pot face pentru a transmite interogarea de căutare ca parametru către această pagină?

Problema este că parametrul 's'
este un parametru standard de interogare în WordPress, când folosești URL-ul /custom-search?s=mysearchstring
îi spui WordPress să recupereze pagina 'custom-search'
care conține șirul 'mysearchstring'
și asta generează o eroare 404.
Ai 2 posibilități:
- folosește un alt nume pentru parametrul de interogare, de exemplu
/custom-search?cs=mysearchstring
apoi în template-ul paginii folosește variabila$_GET['cs']
în loc de$_GET['s']
- trimite toate căutările către URL-ul home:
/?s=mysearchstring
dar folosind hook-ul'template_include'
pentru a utilizacustom-search.php
în loc desearch.php
. Acest lucru poate fi realizat fără a crea o pagină 'custom-search'.
Soluția 1
Singurul lucru pe care trebuie să-l faci este să folosești parametrul de interogare 'cs'
în loc de 's'
, apoi în template folosește:
// ...
$s = filter_input(INPUT_GET, 'cs', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...
Soluția 2
Șterge pagina 'custom-page' care folosește template-ul "Custom Search"
: nu ai nevoie de ea. Poți elimina complet anteturile template-ului, dacă dorești.
Trimite toate cererile de căutare către /?s=mysearchstring
.
Acum adaugă în 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;
}
Astfel, toate cererile de căutare vor fi afișate folosind custom-search.php
(dacă acesta există). Reține că căutarea este deja efectuată în interogarea principală, deci nu trebuie să o rulezi din nou, dacă dorești să setezi posts_per_page
la -1 folosește 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);
}
}
Iar în custom-search.php
folosește:
global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("hit for","goodweb") : $count." ".__("hits for","goodweb");
get_header();
while( have_posts() ) { the_post();
// bucla ta aici
}
După cum vezi, nu este nevoie să rulezi o interogare personalizată deoarece interogarea principală face deja treaba.
Soluția 1 este cea mai bună alegere dacă dorești să afișezi conținutul paginii alături de rezultatele căutării, dar dacă creezi acea pagină fără conținut, doar cu scopul de a utiliza template-ul personalizat pentru rezultatele căutării, soluția 2 este mai bună deoarece:
- este independentă de temă: codul poate fi pus într-un plugin și utilizat cu orice temă, și nu necesită crearea paginii în backend
- este mai performantă: dacă folosești soluția 1, se rulează două interogări, prima pentru a obține pagina, a doua pentru rezultatele căutării; folosind soluția 2 se rulează doar o singură interogare

Un șir GET
va funcționa la fel ca în orice altă aplicație PHP, dar nu poți folosi un parametru de interogare pe care îl folosește WordPress. Aceasta este problema aici. WordPress folosește deja s
. Folosește altceva, cum ar fi 'mys'.
Însă, sincer, căutarea ta personalizată arată destul de similar cu o căutare normală, așa că nu înțeleg cu adevărat de faci asta.
