Página de resultados de búsqueda personalizada

11 may 2015, 12:25:13
Vistas: 77.6K
Votos: 3

Lo que hice fue,

Crear un search.php

<?php get_header(); ?>
<div class="wapper">
  <div class="contentarea clearfix">
    <div class="content">
      <h1 class="search-title"> <?php echo $wp_query->found_posts; ?>
        <?php _e( 'Resultados de Búsqueda Encontrados Para', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1>
      <ul>
        <?php query_posts('showposts=3'); if (have_posts()) : ?>
        <li>
          <h3><a href="<?php echo get_permalink(); ?>">
            <?php the_title();  ?>
            </a></h3>
          <?php  the_post_thumbnail('medium') ?>
          <?php echo substr(get_the_excerpt(), 0,200); ?>
          <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Leer Más</a></div>
        </li>
        <?php endif ?>
      </ul>
    </div>
  </div>
</div>
<?php get_footer(); ?>

Luego crear un searchform.php

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
  <input type="search" id="searchbox" name="s" placeholder="Introduce palabras clave" required>
    <input type="image" id="searchsubmit" alt="Buscar" class="searchicon" src="<?php bloginfo( 'template_url' ); ?>/images/icon-search.gif" />
</form>

Pero mi página de resultados no muestra la descripción del contenido y solo muestra un resultado. Sin embargo, en el título H1 muestra 2/3/5/6/7 etc número de Resultados Encontrados. Quiero mostrar al menos 10 resultados y luego la paginación, y también mostrar 200/300 caracteres de texto de contenido para el resultado de búsqueda. ¿Pueden ayudarme? Aún no soy experto en WordPress.

0
Todas las respuestas a la pregunta 2
6
10

Tengo algunas recomendaciones para tu pregunta:

Primero: deja de usar query_posts(). Revisa el codex sobre esta función para entender por qué no deberías usarla en temas o plugins. De cualquier forma, si estás en una situación extraña donde no tienes otra opción y necesitas usar query_posts(), deberías ejecutar wp_reset_query() después del loop. Debes saber que estás usando la global $wp_query, que contiene la consulta original de WordPress, y luego query_post altera la variable global $wp_query, lo que puede dar resultados inesperados. Adicionalmente, estás usando un parámetro obsoleto showposts, reemplazado por posts_per_page.

Segundo: puedes usar una plantilla de búsqueda personalizada (search.php) para personalizar el aspecto. Simplemente crea un archivo search.php en la carpeta de tu tema y personalízalo como desees. No hagas consultas personalizadas aquí; si lo haces, estarás creando una nueva consulta de posts y desperdiciando la consulta que ya hizo WordPress. Un desperdicio de recursos con impacto negativo en el rendimiento.

Tercero: para cambiar los parámetros de consulta predeterminados que usa WordPress, como el número de posts por página, etc., puedes usar la acción pre_get_posts.

Entonces, crea tu plantilla search.php como desees y usa la acción pre_get_posts para indicarle a WordPress qué parámetros quieres usar en la consulta de búsqueda:

La plantilla search.php podría ser algo así:

<?php
get_header();
global $wp_query;
?>
<div class="wapper">
  <div class="contentarea clearfix">
    <div class="content">
      <h1 class="search-title"> <?php echo $wp_query->found_posts; ?>
        <?php _e( 'Resultados de búsqueda encontrados para', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1>

        <?php if ( have_posts() ) { ?>

            <ul>

            <?php while ( have_posts() ) { the_post(); ?>

               <li>
                 <h3><a href="<?php echo get_permalink(); ?>">
                   <?php the_title();  ?>
                 </a></h3>
                 <?php  the_post_thumbnail('medium') ?>
                 <?php echo substr(get_the_excerpt(), 0,200); ?>
                 <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Leer más</a></div>
               </li>

            <?php } ?>

            </ul>

           <?php echo paginate_links(); ?>

        <?php } ?>

    </div>
  </div>
</div>
<?php get_footer(); ?>

Y la acción pre_get_posts podría ser algo así:

add_action( 'pre_get_posts', function( $query ) {

    // Verifica que sea la consulta que queremos modificar: consulta de búsqueda en el front-end
    if( $query->is_main_query() && ! is_admin() && $query->is_search() ) {

        // Cambia los parámetros de la consulta
        $query->set( 'posts_per_page', 3 );

    }

} );
11 may 2015 14:17:12
Comentarios

No es realmente necesario usar global $wp_query cuando estás en el contexto de la plantilla, puedes simplemente usar el objeto $wp_query donde sea necesario, pero supongo que más vale prevenir que lamentar :-)

Pieter Goosen Pieter Goosen
11 may 2015 14:59:48

No estaba seguro de eso, así que incluí la referencia global. Gracias por la nota.

cybmeta cybmeta
11 may 2015 15:33:41

@cybmeta gracias, funciona bien. Gracias de nuevo. Si no te importa, ¿podrías decirme cómo añadir paginación?

pagol001 pagol001
11 may 2015 23:41:48

@PieterGoosen entonces ¿crees que es mejor reemplazar global $wp_query; por $wp_query;?

pagol001 pagol001
11 may 2015 23:44:05

No incluí la paginación porque no tenías paginación en tu código, simplemente copié tu código sin la parte de la consulta personalizada. Podrías usar cualquiera de las funciones proporcionadas por WordPress para la paginación de múltiples entradas.

cybmeta cybmeta
12 may 2015 00:36:53

No, puedes dejarlo como está :-).

Pieter Goosen Pieter Goosen
12 may 2015 06:47:46
Mostrar los 1 comentarios restantes
2

Debes ejecutar el bucle, modifica tu search.php de manera similar al código a continuación:

  <?php get_header();?>

    <div class="wapper">
      <div class="contentarea clearfix">
        <div class="content">
            <ul>
                <?php if ( have_posts() ) : ?>

            <header class="page-header">
                <p><?php printf( __( 'Resultados de búsqueda para: %s', 'twentyfourteen' ), get_search_query() ); ?></p>
            </header><!-- .page-header -->

                        <?php
                        // Inicia el bucle.
                        while ( have_posts() ) : the_post();
                        ?>
                        <li><h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3></li>
                        <?php the_post_thumbnail('medium') ?>
                        <?php echo substr(get_the_excerpt(), 0, 200); ?>
                            <div class="h-readmore"> 
                                <a href="<?php the_permalink(); ?>">Leer más</a>
                            </div>
                        <?php
                        endwhile;
                else :
                // Si no hay contenido, incluye la plantilla "No se encontraron entradas".
                get_template_part( 'content', 'none' );
                endif;
                ?>       
            </ul>                                 

        </div>
      </div>
    </div>
<?php get_footer(); ?>
11 may 2015 12:40:27
Comentarios

En el código anterior cambia 'twentyfourteen' por el dominio de texto de tu tema

shuvroMithun shuvroMithun
11 may 2015 12:53:53

gracias. si me está dando error Parse error: syntax error, unexpected end of file in .../search.php en la línea 34

pagol001 pagol001
11 may 2015 23:45:34