Página de resultados de búsqueda personalizada
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.

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 );
}
} );

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 :-)

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

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

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

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.

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(); ?>
