Risposte:
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(); ?>
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/
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_type
var in $post_type[0]
.
http://localhost:3000/?s=cloud%27&post_type=product
ahttp://localhost:3000/search/cloud/product
search_template
filtro sembra essere un'alternativa più appropriata atemplate_include
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!
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');
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.
get_search_form('true')
dovrebbe essere get_search_form(true)
. get_search_form
sta cercando un input booleano, quindi o true
o 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).
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');