Mostrar resultados de búsqueda en la misma página

24 abr 2012, 01:10:23
Vistas: 31.2K
Votos: 8

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.

4
Comentarios

¿Funcionó mi solución para ti al final?

sanchothefat sanchothefat
2 may 2012 17:43:45

Me orientaste en la dirección correcta, así que, en cierto modo sí me ayudó. Muchas gracias.

Romes Romes
2 may 2012 18:29:28

¿cuál fue tu solución? Estoy intentando hacer lo mismo - mostrar los resultados de búsqueda de un custom post en la misma página donde se hace la búsqueda y sigo obteniendo un error 404 cuando hago clic en enviar

Claire Claire
7 nov 2012 18:40:39

Me enfrenté a la misma solución y descubrí que tener post_type=my_cpt_post_type en la URL estaba causando el problema. Muy similar a cambiar el nombre del input predeterminado de 's' a 'search' en la respuesta a continuación, cambié mi input oculto de 'post_type' a 'p_type' y eso resolvió mi problema. Luego en tu consulta puedes usar 'post_type' => $_REQUEST[ 'p_type' ]

philip philip
1 feb 2021 16:19:04
Todas las respuestas a la pregunta 2
1

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

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

jmarceli jmarceli
26 oct 2015 14:23:43
2

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.

24 abr 2012 03:13:21
Comentarios

¿Esto es algo que pongo en mi archivo functions.php o simplemente directamente en la página?

Romes Romes
24 abr 2012 17:02:57

sí, ya sea eso o crear un nuevo plugin y pegar el código en él

onetrickpony onetrickpony
24 abr 2012 17:48:26