Cum să transmitem un parametru de căutare $_GET către o nouă pagină personalizată de căutare?

26 nov. 2013, 17:29:08
Vizualizări: 21.5K
Voturi: 4

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ă?

0
Toate răspunsurile la întrebare 2
1
10

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:

  1. 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']
  2. trimite toate căutările către URL-ul home: /?s=mysearchstring dar folosind hook-ul 'template_include' pentru a utiliza custom-search.php în loc de search.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:

  1. este independentă de temă: codul poate fi pus într-un plugin și utilizat cu orice temă, și nu necesită crearea paginii în backend
  2. 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
26 nov. 2013 19:16:01
Comentarii

Mulțumesc! Am înțeles acum. Voi folosi prima soluție deoarece am nevoie de ambele pagini de căutare. Numele custom-search a fost pur demonstrativ.

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

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.

26 nov. 2013 18:19:54