Visualizzare i risultati di ricerca nella stessa pagina

24 apr 2012, 01:10:23
Visualizzazioni: 31.2K
Voti: 8

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.

4
Commenti

Alla fine la mia soluzione ha funzionato per te?

sanchothefat sanchothefat
2 mag 2012 17:43:45

Mi hai indicato la direzione giusta, quindi in un certo senso mi hai aiutato. Grazie mille.

Romes Romes
2 mag 2012 18:29:28

Qual è stata la tua soluzione? Sto cercando di fare la stessa cosa - visualizzare i risultati di ricerca di un custom post nella stessa pagina della richiesta di ricerca, ma continuo a ottenere una pagina 404 quando clicco su invio

Claire Claire
7 nov 2012 18:40:39

Mi sono trovato di fronte alla stessa soluzione e ho scoperto che avere post_type=my_cpt_post_type nell'URL causava il problema. Molto simile alla modifica del nome dell'input predefinito da 's' a 'search' nella risposta qui sotto, ho cambiato il mio input nascosto da 'post_type' a 'p_type' e questo ha risolto il mio problema. Quindi nella tua query puoi usare 'post_type' => $_REQUEST[ 'p_type' ]

philip philip
1 feb 2021 16:19:04
Tutte le risposte alla domanda 2
1

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();
    }
?>
24 apr 2012 11:39:16
Commenti

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(...).

jmarceli jmarceli
26 ott 2015 14:23:43
2

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.

24 apr 2012 03:13:21
Commenti

È qualcosa che devo inserire nel file functions.php o semplicemente direttamente nella pagina?

Romes Romes
24 apr 2012 17:02:57

sì, puoi fare così oppure creare un nuovo plugin e incollare il codice al suo interno

onetrickpony onetrickpony
24 apr 2012 17:48:26