Come creare una ricerca personalizzata per il tipo di post personalizzato?


44

Ho un campo di ricerca per i post del blog, ma ne ho bisogno di un altro per un tipo di post personalizzato. Come posso creare questo modulo di ricerca personalizzato con un diverso layout dei risultati di ricerca ?

Risposte:


61

Ecco cosa ho provato e ottenuto una soluzione con 3 passaggi. Supponiamo che il tuo tipo di post personalizzato sia " prodotti "

1 Aggiungi il codice funzione qui puoi specificare l' archivio-search.php

function template_chooser($template)   
{    
  global $wp_query;   
  $post_type = get_query_var('post_type');   
  if( $wp_query->is_search && $post_type == 'products' )   
  {
    return locate_template('archive-search.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'template_chooser');    

2 Creare Ricerca template risultato per il tipo di messaggio personalizzato (filmati-search.php)

        <?php
        /* Template Name: Custom Search */        
        get_header(); ?>             
        <div class="contentarea">
            <div id="content" class="content_right">  
                     <h3>Search Result for : <?php echo "$s"; ?> </h3>       
                     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>    
                <div id="post-<?php the_ID(); ?>" class="posts">        
                     <article>        
                    <h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>        
                    <p><?php the_exerpt(); ?></p>        
                    <p align="right"><a href="<?php the_permalink(); ?>">Read     More</a></p>    
                    <span class="post-meta"> Post By <?php the_author(); ?>    
                     | Date : <?php echo date('j F Y'); ?></span>    

                    </article><!-- #post -->    
                </div>
        <?php endwhile; ?>
    <?php endif; ?>




           </div><!-- content -->    
        </div><!-- contentarea -->   
        <?php get_sidebar(); ?>
        <?php get_footer(); ?>
  1. Crea modulo di ricerca
    In questo modulo di ricerca, il valore "prodotti" è nascosto e cercherà solo i post dei prodotti .

     <div>   
        <h3>Search Products</h3>
        <form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
        <input type="text" name="s" placeholder="Search Products"/>
        <input type="hidden" name="post_type" value="products" /> <!-- // hidden 'products' value -->
        <input type="submit" alt="Search" value="Search" />
      </form>
     </div>
    

per di più, vorrei collegarti a qui
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/


Suggerimento: quando si registra il tipo di post, l' argomento public_queryable deve essere impostato su true . In caso contrario, get_query_var ('post_type') non restituirà mai il valore post_type indicato nell'argomento url. codex.wordpress.org/Function_Reference/…
Gustavo

Un altro suggerimento / suggerimento di modifica: ha get_query_var('post_type')restituito un array (anziché una stringa), quindi non è stato possibile confrontarlo direttamente. Dal momento che sto cercando solo un tipo di post alla volta, ho semplicemente cambiato il mio $post_typevar in $post_type[0].
indextwo

c'è un modo per riscrivere l'URL da http://localhost:3000/?s=cloud%27&post_type=productahttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh Ci scusiamo per la risposta tardiva, dai un'occhiata a wordpress.stackexchange.com/questions/15418/… . Esiste anche un plugin chiamato rewrite wordpress.org/plugins/rewrite
Ronald

il search_templatefiltro sembra essere un'alternativa più appropriata atemplate_include
Alexey Kosov,

6

Ecco cosa funziona per me. Non così pulito ma non sono riuscito a far funzionare nessuna di queste altre risposte.

Modulo di ricerca per Tipo di post personalizzato:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
    <label>
        <span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
        <input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
        <input type="hidden" name="post_type" value="book" />
    </label>
    <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

In Functions.php:

function searchfilter($query) {
    if ($query->is_search && !is_admin() ) {
        if(isset($_GET['post_type'])) {
            $type = $_GET['post_type'];
                if($type == 'book') {
                    $query->set('post_type',array('book'));
                }
        }       
    }
return $query;
}
add_filter('pre_get_posts','searchfilter');

In search.php:

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
    <?php if(isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
           if($type == 'book') {?>

               /* Format for "book" custom post type */

           <?php } else { ?>

               /* Format for custom post types that are not "book,"
               or you can use elseif to specify a second post type the
               same way as above. Copy the default format here if you
               only have one custom post type. */

           <?php } ?>
    <?php } else { ?>

              /* Format to display when the post_type parameter
              is not set (i.e. default format) */
<?php } ?>
<?php endwhile; else: ?>

/* What to display if there are no results. */

<?php endif; ?>

Ovviamente in tutti e tre i posti dovrai sostituire "libro" con il tuo tipo di post personalizzato.

Spero che questo aiuti qualcuno!


2

Un codice breve più attualizzato

 function template_chooser($template)   
{    
  global $wp_query; 
  $post_type = $wp_query->query_vars["pagename"];   
  if( isset($_GET['s']) && $post_type == 'products' )   
  {

    return locate_template('archive-search.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'template_chooser'); 

2

Stavo cercando di utilizzare due diversi moduli per le mie normali ricerche e le mie ricerche su un tipo di post personalizzato.

Il mio tipo di post personalizzato utilizza un'intestazione diversa rispetto alle pagine normali, sulla mia pagina normale, la chiamata al mio modulo di ricerca è:

<?php get_search_form(true); ?>

E la chiamata al mio modulo di ricerca nell'intestazione del tipo di post personalizzato è:

<?php get_template_part('search','library'); ?>

Che ha un campo aggiuntivo:

<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.

Nel file delle funzioni ho il seguente codice che hai fornito.

/** Custom Search for Library */
function search_library($template)   
{    
  global $wp_query;   
  $post_type = get_query_var('post_type');   
  if( $wp_query->is_search && $post_type == 'library' )   
  {
    return locate_template('search-library.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'search_library');

Che rileva se il modulo di ricerca sta eseguendo una ricerca all'interno di campi personalizzati, mostrando così la ricerca in un modello personalizzato, altrimenti usa il modello normale.

Modifica: risolto il richiamo della funzione get_search_form () che sarebbe tornato vero a prescindere.


1
Vale la pena notare, ma get_search_form('true')dovrebbe essere get_search_form(true). get_search_formsta cercando un input booleano, quindi o trueo false. Avvolgendolo tra virgolette gli stai fornendo una stringa, non un parametro booleano. Il modo in cui questa funzione è impostata, entrambe 'true'e 'false'restituirebbe lo stesso risultato, poiché sono entrambe stringhe non vuote (il che fa sì che la funzione ritorni vera in entrambi i casi).
Mike,

1

Per risolvere il problema di ricerca di input vuoto è possibile sostituire il codice funzione con questo:

function template_chooser($template)   
{    
 global $wp_query;   
 $post_type = get_query_var('post_type');   
 if( isset($_GET['s']) && $post_type == 'products' )   
 {
  return locate_template('archive-search.php');  //  redirect to archive-search.php
 }   
 return $template;   
}
add_filter('template_include', 'template_chooser');

3
Sarebbe bello se spiegassi come funziona il tuo codice, rivelando la tua fonte del codice
Pieter Goosen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.