Blog

Modificar tu resultado de búsqueda – WordPress Tutorial

Como vimos en la búsqueda avanzada en WordPress podemos modificar de diferentes maneras el comportamiento de la búsqueda y resultado en WordPress sin tener que utilizar plugins innecesarios y ademas pesados.

Ahora veremos como modificar los resultados de búsqueda, básicamente hay 2 maneras de hacerla (las que yo utilizo). Dividiré el artículo en 2 partes para que puedas ver las diferencias y entender una por una.

Entendiendo como WordPress muestra los resultados

WordPress, tiene una jerarquía de archivos en sus temas. Hay un archivo llamado search.php que es el que WordPress  busca para mostrar los resultados, entonces si solo deseamos colocar por ejemplo:

  • Agregar Thumbnails
  • Mostrar los diferentes post types de diferentes formas
  • Excluir de búsqueda categorias
  • En si, modificar el formato más no el comportamiento, sáltate a modificando el formato

Modificando los resultados dependiendo el formulario de búsqueda

Un problema que tenemos a la hora de buscar cosas mas complejas o de ser necesario, con un par de custom fields, deseamos comparar valores y todo lo que podamos imaginarnos en complejidad utilizando, query_posts.

En el buscador

<?php $results_ID = get_page_id('results'); ?>
<form action="<?php echo get_permalink($results_ID); ?>" method="get">
<?php wp_nonce_field('searching','nonce'); ?>
<label for="s"><?php _e('Terms'); ?></label>
<input type="text" name="s" id="s" />
<label for="s"><?php _e('Price'); ?></label>
<input type="number" name="value" />
<?php $post_types = get_post_types(); if($post_types) { ?>
<select name="post_type">
 <?php foreach($post_types as $p) { $current_posttype = get_post_type_object($p); ?>
 <option value="<?php echo $p; ?>"><?php echo $current_posttype->label; ?></option>
 <?php } ?>
</select>
<?php } ?>
<?php $types = get_terms('types'); if($types) { foreach($types as $t) { ?>
<label for="<?php echo $t->slug; ?>"><input type="checkbox" name="type" value="<?php echo $t->slug; ?>" /><?php echo $t->name; ?></label>
<?php } } ?>
<input type="submit" value="<?php _e('Submit'); ?>" />
</form>

El ejemplo será un buscador para una inmobiliaria (es donde mas campos se me ocurren), describo el código de arriba:

  • Primero buscamos la pagina (antes creada) y colocamos el link de ella en el action del formulario
  • Luego colocamos un par de inputs, uno de termino y otro de precio
  • Imaginemos que tenemos 4 posttypes distintos, Casas, Apartamentos, Bodegas, Granjas (podrían ser taxonomías, pero quiero ejemplificar)
  • Y luego tenemos el “type”, que será Alquiler o Venta

En la parte de nuestro tema, creamos un template, para colocar el siguiente código:

<?php get_header(); ?>
<div class="container">
 <?php if ( !empty($_POST) && !wp_verify_nonce($_POST['nonce'],'searching') ) {
 $args = array(
 'post_type' => $_REQUEST['post_type'],
 's' => $_REQUEST['s'],
 'meta_query ' => array(
 array(
 'key' => 'price',
 'value' => $_REQUEST['value'],
 'compare' => '<',
 'type' => 'numberic'
 )
 ),
 'types' => $_REQUEST['type'],
 );
 ?>
 <?php $search_results = new WP_Query($args);
 while ($search_results->have_posts()) : $search_results->the_post(); ?>
 <!-- Do stuff... -->
 <?php endwhile; } //nonce ?>
</div><!--container-->
<?php get_footer(); ?>

Lo que hacemos es modificar los parámetros que mandamos los  parámetros de búsqueda que recibimos por POST, con verificación de envío. Entonces podemos manipular esa información de una manera más compleja.

Modificando el formato

El archivo search.php se comporta como un loop normal, donde $query_string lleva todos las publicaciones que se tienen que mostrar.

  • Entonces digamos que queremos:
  • Agregarle un thumbnail
  • Mostrar a que posttype pertenece
  • Si es post mostrar la categoría
  • Si es pagina, mostrar su hijos (descendientes)
<?php $post_type = get_post_type(); ?>
<div class="post <?php echo $post_type; ?>">
<?php if(has_post_thumbnail()) the_post_thumbnail('thumb'); //agrego thumbnail si existe?>
<?php if($post_type == 'post') { $category = get_category(); echo $category[0]->name; } ?>
<h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
<?php if(!is_page()) the_excerpt(); else the_content(); ?>
</div>

Espero que te ayude!