Afișarea rezultatelor căutării în aceeași pagină

24 apr. 2012, 01:10:23
Vizualizări: 31.2K
Voturi: 8

Problemă

Am o pagină pe site-ul meu unde trebuie să fac căutări suplimentare în cadrul acelei pagini. Folosesc metoda implicită WordPress de căutare cu <?php get_search_form(); ?> pentru căutarea din header, care funcționează foarte bine.

Am creat un alt formular HTML în pagina mea, fără a folosi metoda PHP implicită, pentru căutările suplimentare astfel:

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
    <div>
        <label for="s" class="screen-reader-text">Caută:</label>
        <input type="text" id="s" name="s" value="" />
        <input type="hidden" name="post_type" value="photo_group" /> 
        <input type="submit" value="Caută" id="searchsubmit" />
    </div>
</form>

Folosesc type=hidden pentru a obține tipul de postare personalizat prin care vreau să caut:

<input type="hidden" name="post_type" value="photo_group" />

care îmi generează un link care arată similar cu:

http://site-ul-meu.ro/?s=cauta&post_type=photo_group

Întrebare

Când folosesc noul formular de căutare creat în pagină, acesta folosește search.php implicit pentru a afișa rezultatele. Cum pot afișa rezultatele căutării pentru tipul de postare personalizat, să zicem într-un div în aceeași pagină?

Am încercat să creez un nou șablon de pagină care să afișeze rezultatele fără succes, ar putea fi aceasta calea corectă de a face și am făcut-o eu greșit?

*Editare*

Încerc soluția lui sanchothefat. Arată corect? Acesta este întregul meu div pentru rezultatele căutării și interogarea de căutare.

<div id="photo-search">
    <h2>Caută Poze:</h2>
    <form action="<?php the_permalink(); ?>" id="searchform" method="get">
        <div>
            <label for="s" class="screen-reader-text">Caută:</label>
            <input type="text" id="search" name="search" value="" />
            <input type="hidden" name="post_type" value="photo_group" /> 
            <input type="submit" value="Caută" id="searchsubmit" />
        </div>
    </form>

    <?php if( isset( $_REQUEST['search'] ) ) {
        query_posts( array(
        's' => $_REQUEST['search'],
        'post_type' => $_REQUEST['photo_group'],
        'paged' => $paged
        ));

        if( have_posts() ) : while ( have_posts() ) :
            the_title();
            the_content();                      
        endwhile; endif;

        wp_reset_query(); 
        }
    ?>
</div>

Primesc eroarea 404 pagină negăsită când efectuez căutarea.

4
Comentarii

Soluția mea a funcționat pentru tine în final?

sanchothefat sanchothefat
2 mai 2012 17:43:45

M-ai îndreptat în direcția corectă, așa că, într-un fel, m-ai ajutat. Mulțumesc mult.

Romes Romes
2 mai 2012 18:29:28

care a fost soluția ta? Încerc să fac același lucru - să afișez rezultatele căutării unui post personalizat pe aceeași pagină cu cererea de căutare și primesc în continuare o pagină 404 când dau click pe submit

Claire Claire
7 nov. 2012 18:40:39

Am avut aceeași problemă și am descoperit că prezența lui post_type=my_cpt_post_type în URL era cauza. Similar cu schimbarea numelui implicit al input-ului de la 's' la 'search' în răspunsul de mai jos, am schimbat input-ul meu hidden de la 'post_type' la 'p_type' și asta a rezolvat problema. Apoi, în interogarea ta poți folosi 'post_type' => $_REQUEST[ 'p_type' ]

philip philip
1 feb. 2021 16:19:04
Toate răspunsurile la întrebare 2
1

Cea mai simplă opțiune dacă doriți să afișați rezultatele căutării în contextul unei pagini este să folosiți o buclă personalizată, altfel nu veți putea accesa informațiile paginii.

Schimbați input-ul cu numele s în altceva, cum ar fi search sau q, pentru a opri WordPress să folosească căutarea sa standard.

Apoi, modificați parametrul action din formular cu URL-ul paginii curente. Puteți folosi <?php get_permalink(); ?> pentru asta.

Bucla pe care trebuie să o implementați este următoarea:

<?php
    if ( isset( $_REQUEST[ 'search' ] ) ) {
          // execută interogarea de căutare
          query_posts( array(
             's' => $_REQUEST[ 'search' ],
             'post_type' => $_REQUEST[ 'post_type' ],
             'paged' => $paged
             )
          );

        // buclă
        if ( have_posts() ) : while ( have_posts() ) :
            // parcurge rezultatele aici
        endwhile; endif;

        // revine la interogarea originală
        wp_reset_query();
    }
?>
24 apr. 2012 11:39:16
Comentarii

Trebuie să schimb if ( have_posts() ) : while ( have_posts() ) : în if ( have_posts() ) : while ( have_posts() ) : the_post(); pentru a evita bucla infinită (nu sunt sigur de ce). Poate pentru că randez un șablon personalizat în interior cu get_template_part(...).

jmarceli jmarceli
26 oct. 2015 14:23:43
2

Puteți modifica interogarea înainte ca aceasta să fie procesată:

add_action('parse_query', function($query){

  // nu este o cerere de căutare
  if(!$query->is_search)
    return;

  // validează tipul de postare aici (ar trebui să furnizați o listă albă)
  $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;

  // ajustează interogarea
  if($post_type && post_type_exists($post_type))
    $query->set('post_type', $post_type);

});

Aceasta vă va returna postări care corespund tipului de postare solicitat.

Dacă doriți să interogați mai multe tipuri de postări, treceți un array în loc: array('post', 'page', $post_type). Și pentru a grupa postările în funcție de tip, verificați tipul în buclă și stocați CPT-urile într-un array temporar, pe care îl iterați după ce postările normale au fost afișate.

24 apr. 2012 03:13:21
Comentarii

Este ceva ce pun în fișierul meu functions.php sau pur și simplu direct pe pagină?

Romes Romes
24 apr. 2012 17:02:57

da, fie asta, fie construiești un nou plugin și lipești codul în el

onetrickpony onetrickpony
24 apr. 2012 17:48:26