Respuestas:
Esto es lo que probé y obtuve una solución con 3 pasos. Digamos que su tipo de publicación personalizada es " productos "
1) Agregar código de función aquí puede especificar el archivo-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) Cree una plantilla de resultados de búsqueda para el tipo de publicación personalizada (archive-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(); ?>
Crear formulario de búsqueda
En este formulario de búsqueda, el valor "productos" está oculto y solo buscará publicaciones de productos .
<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>
para más información, me gustaría vincularlo aquí
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/
get_query_var('post_type')
devolvió una matriz (en lugar de una cadena), por lo que no se pudo comparar directamente. Como solo estoy buscando un tipo de publicación a la vez, simplemente cambié mi $post_type
var a $post_type[0]
.
http://localhost:3000/?s=cloud%27&post_type=product
ahttp://localhost:3000/search/cloud/product
search_template
filtro parece ser una alternativa más apropiada paratemplate_include
Esto es lo que funciona para mí. No tan limpio, pero no pude obtener ninguna de estas otras respuestas para trabajar.
Formulario de búsqueda para el tipo de publicación personalizada:
<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>
En 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');
En 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; ?>
Naturalmente, en los tres lugares deberá reemplazar "libro" con su tipo de publicación personalizada.
¡Espero que esto ayude a alguien!
Un código corto más actualizado
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');
Estaba buscando usar dos formas diferentes para mis búsquedas normales y mis búsquedas en un tipo de publicación personalizada.
Mi tipo de publicación personalizada utiliza un encabezado diferente al de las páginas normales, en mi página normal, la llamada a mi formulario de búsqueda es:
<?php get_search_form(true); ?>
Y la llamada a mi formulario de búsqueda en el encabezado de tipo de publicación personalizada es:
<?php get_template_part('search','library'); ?>
Que tiene un campo adicional:
<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.
En el archivo de funciones tengo el siguiente código que ha proporcionado.
/** 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');
Que detecta si el formulario de búsqueda está haciendo una búsqueda dentro de los campos personalizados, mostrando así la búsqueda en una plantilla personalizada, de lo contrario, use la plantilla normal.
Editar: se corrigió la llamada a la función get_search_form () que habría devuelto verdadero sin importar qué.
get_search_form('true')
debería ser get_search_form(true)
. get_search_form
está buscando una entrada booleana, así que true
o false
. Al envolverlo entre comillas, lo está alimentando con una cadena, no con un parámetro booleano. La forma en que se configura esa función, ambas 'true'
y 'false'
devolverían el mismo resultado, porque ambas son cadenas no vacías (lo que hace que la función devuelva verdadero en ambos casos).
Para solucionar el problema de búsqueda de entrada vacía, puede sustituir el código de función con esto:
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');