Visualizzare i risultati di ricerca nella stessa pagina
Problema
Ho una pagina sul mio sito dove ho bisogno di fare una ricerca aggiuntiva all'interno della stessa pagina. Sto usando il metodo predefinito di WordPress per la ricerca con <?php get_search_form(); ?>
per la ricerca nell'header principale, che funziona benissimo.
Ho creato un altro form HTML nella mia pagina, senza utilizzare il metodo PHP predefinito, per le ricerche aggiuntive come segue:
<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Cerca:</label>
<input type="text" id="s" name="s" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Cerca" id="searchsubmit" />
</div>
</form>
Uso il type=hidden
per ottenere il custom post type attraverso il quale voglio effettuare la ricerca:
<input type="hidden" name="post_type" value="photo_group" />
che mi fornisce un link simile a:
http://mywebsite.com/?s=search&post_type=photo_group
Domanda
Quando uso il nuovo modulo di ricerca creato nella pagina, viene utilizzato il file search.php predefinito per visualizzare i risultati. Come posso visualizzare i risultati della ricerca del custom post type, ad esempio in un div
nella stessa pagina?
Ho provato a creare un nuovo template di pagina che visualizzasse i risultati senza successo, potrebbe essere il modo giusto di farlo e l'ho solo fatto male?
*Modifica*
Sto provando la soluzione di sanchothefat. È corretto questo? Questo è il mio div completo per i risultati della ricerca e la query di ricerca.
<div id="photo-search">
<h2>Cerca Foto:</h2>
<form action="<?php the_permalink(); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Cerca:</label>
<input type="text" id="search" name="search" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Cerca" 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>
Ottengo un errore 404 pagina non trovata quando eseguo la ricerca.

L'opzione più semplice se vuoi mostrare i risultati di ricerca nel contesto di una pagina è creare un loop personalizzato, altrimenti non sarai in grado di accedere alle informazioni della pagina.
Cambia l'input con il nome s
in qualcos'altro come search
o q
per impedire a WordPress di eseguire la sua solita ricerca integrata.
Successivamente, modifica il parametro action
del form con l'URL della pagina corrente. Puoi usare <?php get_permalink(); ?>
per questo.
Il loop che devi implementare è il seguente:
<?php
if ( isset( $_REQUEST[ 'search' ] ) ) {
// esegui la query di ricerca
query_posts( array(
's' => $_REQUEST[ 'search' ],
'post_type' => $_REQUEST[ 'post_type' ],
'paged' => $paged
)
);
// loop
if ( have_posts() ) : while ( have_posts() ) :
// scorri i risultati qui
endwhile; endif;
// ritorna alla query originale
wp_reset_query();
}
?>

Devo cambiare if ( have_posts() ) : while ( have_posts() ) :
in if ( have_posts() ) : while ( have_posts() ) : the_post();
per evitare un loop infinito (non sono sicuro del perché). Forse perché sto renderizzando un template personalizzato all'interno con get_template_part(...)
.

Puoi modificare la query prima che venga elaborata:
add_action('parse_query', function($query){
// non è una richiesta di ricerca
if(!$query->is_search)
return;
// convalida il tipo di post qui (dovresti fornire una whitelist)
$post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;
// modifica la query
if($post_type && post_type_exists($post_type))
$query->set('post_type', $post_type);
});
Questo ti permetterà di ottenere i post che corrispondono al tipo di post richiesto.
Se vuoi interrogare più tipi di post, passa semplicemente un array invece di un singolo valore: array('post', 'page', $post_type)
. E per raggruppare i post in base al tipo, controlla il tipo all'interno del loop e memorizza i tuoi CPT in un array temporaneo, che puoi iterare dopo aver mostrato i post normali.
