Mostrar resultados de búsqueda en la misma página
Problema
Tengo una página en mi sitio donde necesito hacer búsquedas adicionales dentro de esa página. Estoy usando la forma predeterminada de búsqueda de WordPress con <?php get_search_form(); ?>
para mi búsqueda principal en el encabezado, que funciona muy bien.
Creé otro formulario HTML en mi página, sin usar el método PHP predeterminado, para las búsquedas adicionales de esta manera:
<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Buscar por:</label>
<input type="text" id="s" name="s" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Buscar" id="searchsubmit" />
</div>
</form>
Uso el type=hidden
para obtener el tipo de entrada personalizada por el que quiero buscar:
<input type="hidden" name="post_type" value="photo_group" />
que me da un enlace que se parece a:
http://misitio.com/?s=search&post_type=photo_group
Pregunta
Cuando uso el nuevo formulario de búsqueda creado en la página, utiliza el search.php predeterminado para mostrar los resultados. ¿Cómo puedo mostrar los resultados de la búsqueda del tipo de entrada personalizada, digamos en un div
en la misma página?
He intentado crear una nueva plantilla de página que mostraría los resultados sin éxito, ¿podría ser esta la forma correcta de hacerlo y simplemente lo hice mal?
*Edición*
Estoy probando la solución de sanchothefat. ¿Esto se ve correcto? Este es mi div completo para mis resultados de búsqueda y consulta de búsqueda.
<div id="photo-search">
<h2>Buscar Fotos:</h2>
<form action="<?php the_permalink(); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Buscar por:</label>
<input type="text" id="search" name="search" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Buscar" 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>
Obtengo un error 404 página no encontrada cuando ejecuto la búsqueda.

La opción más simple si deseas mostrar resultados de búsqueda dentro del contexto de una página es hacer un loop personalizado, de lo contrario no podrás acceder a la información de la página.
Cambia el input con el nombre s
por algo diferente como search
o q
para evitar que WordPress realice su búsqueda integrada habitual.
Luego cambia el parámetro action
del formulario por la URL de la página actual. Puedes usar <?php get_permalink(); ?>
para eso.
El loop que necesitas hacer es el siguiente:
<?php
if ( isset( $_REQUEST[ 'search' ] ) ) {
// ejecutar consulta de búsqueda
query_posts( array(
's' => $_REQUEST[ 'search' ],
'post_type' => $_REQUEST[ 'post_type' ],
'paged' => $paged
)
);
// loop
if ( have_posts() ) : while ( have_posts() ) :
// recorrer los resultados aquí
endwhile; endif;
// volver a la consulta original
wp_reset_query();
}
?>

Tengo que cambiar if ( have_posts() ) : while ( have_posts() ) :
por if ( have_posts() ) : while ( have_posts() ) : the_post();
para evitar un bucle infinito (no estoy seguro por qué). Quizás porque estoy renderizando una plantilla personalizada dentro con get_template_part(...)
.

Puedes modificar la consulta antes de que se procese:
add_action('parse_query', function($query){
// no es una solicitud de búsqueda
if(!$query->is_search)
return;
// validar el tipo de publicación aquí (deberías proporcionar una lista blanca)
$post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;
// ajustar la consulta
if($post_type && post_type_exists($post_type))
$query->set('post_type', $post_type);
});
Esto te dará publicaciones que coincidan con el tipo de publicación solicitado.
Si deseas consultar múltiples tipos de publicaciones, simplemente pasa un array en su lugar: array('post', 'page', $post_type)
. Y para agrupar publicaciones según el tipo, verifica el tipo dentro del bucle y almacena tus CPTs en un array temporal, el cual puedes iterar después de que se hayan mostrado las publicaciones normales.
