Interogare personalizată de căutare

8 apr. 2014, 18:18:22
Vizualizări: 36.3K
Voturi: 6

Vreau să creez o pagină de căutare personalizată care să facă următoarele:

Utilizatorul bifează mai multe elemente într-un formular pentru ce dorește să vadă în rezultatele căutării (practic alege dintr-o listă de etichete).

Sunt returnate rezultatele care se potrivesc cu toate etichetele alese (folosind AND, nu OR).

Un exemplu specific ar fi:

Returnează toate postările din categoria "Zonă" unde etichetele = "școală primară" ȘI "parc"

  1. Trebuie să dau formularului de căutare un nume specific?
  2. Pe pagina cu rezultatele căutării, cum să scriu interogarea personalizată astfel încât să preia toate postările din categoria Zonă și care au toate etichetele pe care utilizatorul le-a ales în formularul de căutare?

Iată un exemplu de cod pentru implementare:

// În template-ul paginii de căutare
$category = 'area';
$tags = $_POST['selected_tags']; // Array cu etichetele selectate

$args = array(
    'category_name' => $category,
    'tag_slug__and' => $tags, // Folosește AND între etichete
    'posts_per_page' => -1
);

$query = new WP_Query($args);

if($query->have_posts()) :
    while($query->have_posts()) : $query->the_post();
        // Afișează rezultatele
        the_title();
        the_content();
    endwhile;
    wp_reset_postdata();
else :
    echo 'Nu s-au găsit rezultate';
endif;
6
Comentarii

Multă confuzie în ceea ce am citit. Am văzut că ar trebui să folosesc ceva de genul query_posts('cat=32&tag=hs1+hs1&showposts=5'); și am văzut că ar trebui să folosesc ceva de genul `<?php

$the_query = new WP_Query( 'cat=Neighborhood&tag=elementary school+park' );

// Bucla while ( $the_query->have_posts() ) : $the_query->the_post();
the_title(); the_content(); endwhile;

wp_reset_postdata();

?>`

Peanut Peanut
8 apr. 2014 18:47:22

și am văzut că ar trebui să folosesc ceva de genul $query = array ( 'paged' => 1, 'posts_per_page' => '5', 'offset' => 0, 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', 'post_type' => array ( 'post' => 'post', ), 'cat' => '35', 'tag__and' => array ( 0 => 36, 1 => 39, ), ); ... practic sunt extrem de confuz.

Peanut Peanut
8 apr. 2014 18:47:38

@Peanut Două note: Dacă ai informații suplimentare, te rog să postezi [editări] în loc de comentarii. Nu toată lumea citește comentariile și acestea sunt curățate din când în când. În al doilea rând, te rog să folosești formatarea (backticks) pentru cod în comentarii. Ai un link "ajutor" chiar lângă formularul de comentarii aici. Mulțumesc.

kaiser kaiser
8 apr. 2014 18:58:15

Folosește WP_Query și parametrul s, nu uita să apelezi wp_reset_postdata după ce ai terminat cu această interogare :-) REF: https://codex.wordpress.org/Class_Reference/WP_Query#Search_Parameter

jave.web jave.web
20 ian. 2017 14:04:11

Te rog să consulți aceeași întrebare pe stackoverflow https://stackoverflow.com/questions/9523881/how-do-i-modify-search-query-in-wordpress/57786703#57786703

Amit Kumar PRO Amit Kumar PRO
4 sept. 2019 13:42:32

Te rog să verifici aceeași întrebare pe stackoverflow https://stackoverflow.com/questions/9523881/how-do-i-modify-search-query-in-wordpress/57786703#57786703

Amit Kumar PRO Amit Kumar PRO
4 sept. 2019 13:43:56
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 2
0
11

1) Puteți utiliza șabloanele search.php și searchform.php ca punct de plecare. Crearea unei Pagini de Căutare Codex

2) În ceea ce privește interogarea personalizată, puteți utiliza hook-ul pre_get_posts pentru a verifica dacă vă aflați pe o pagină de căutare, apoi puteți obține valorile din $_GET și puteți modifica interogarea în consecință. Referință Acțiune - pre_get_posts

Există o mulțime de tutoriale online și întrebări pe acest forum care vă pot ajuta. Unele sunt Simple, iar altele sunt mai Complexe. Va trebui să faceți o cercetare serioasă pentru a realiza acest lucru. Sper că vă ajută!

8 apr. 2014 18:24:48
0

Pentru a crea o căutare personalizată, veți avea nevoie de aceste câmpuri de introducere în codul HTML. Puteți utiliza atributele name și value pentru a transmite datele către URL.

<input type="hidden" class="category" name="category_name" value="recording">
<input type="hidden" class="type" name="post_type" value="post">
<input type="text" class="search-bar" id="global-search"><button class="search-submit" type="submit" id="search-submit">

Apoi, în fișierul de scripturi, va trebui să construiți URL-ul.

// actualizează tipul de căutare
let type = $('input.type').val();
if(type === 0 || type == undefined){
  type = "";
}
// actualizează categoria de căutare
let category = $('input.category').val();
if(category === 0 || category == undefined){
  category = "";
}
// actualizează cuvântul cheie de căutare
keyword = '/?s=' + $(this).val() + '&post_type=' + type + '&category_name=' + category;
$('.search-keyword').attr('data-target','/cimuk' + keyword);
$('.search-keyword .label').text('Caută ' + '"' + $(this).val() + '"');

//apelează această funcție la trimitere sau apăsarea tastei Enter
function goKeyword(){
    window.location.href = $('.search-keyword').data('target')
}

Apoi puteți adăuga acest filtru în fișierul functions.php. Acesta va prelua variabilele din URL și le va transmite către interogarea de căutare.

//Filtru de căutare pentru tipul de postare
function mySearchFilter($query) {
    $post_type = $_GET['post_type'];
    $category = $_GET['category_name'];
    if (!$post_type) {
        $post_type = 'any';
    }
    if (!$category){
        $category = null;
    }
    if ($query->is_search) {
        $query->set('post_type', $post_type);
        $query->set('category_name', $category);
    };
    return $query;
};


add_filter('pre_get_posts','mySearchFilter');

Rezultatele ar trebui să se încarce în fișierul search.php.

14 nov. 2019 23:25:36