Afișarea rezultatelor căutării în aceeași pagină
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.

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();
}
?>

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.
