Crea tu propio motor de búsqueda para WordPress

En este artículo vamos a ver cómo personalizar la búsqueda en WordPress, creando nuestro propio motor de búsqueda para adaptarlo a nuestras necesidades.

wordpress searchPor defecto el buscador de WordPress realiza las búsquedas en el título, extracto, y contenido de todas tus entradas y páginas, y también lo hará en tus Custom Post Types si al definirlos has marcado exclude_from_search = false.

Para cargar el formulario de búsqueda en tus plantillas basta con llamar a la función get_search_form() desde el template que quieras (p.e: sidebar.php). Lo que hace esta función es pintar el código que tengas en el archivo searchform.php de tu tema (si no lo tienes puedes crearlo). El ejemplo para un formulario de búsqueda básico es:

Como vemos, es muy básico, un simple input y un botón para enviar el formulario. Vamos a ver como enriquecer esta búsqueda y poder filtrar por categorías, etiquetas, limitar la búsqueda a un tipo de contenido determinado e incluso extender la búsqueda a campos personalizados o custom fields.

 

Ampliando la búsqueda para filtrar por categorías y etiquetas

La búsqueda por defecto en WordPress puede resumirse en un formulario con un input, que al enviarse te lleva a una url del tipo http://midominio.es/?s=busqueda. Es decir, envía por $_GET el parámetro “s” con el valor de lo que hemos introducido en el campo buscar. Internamente genera una consulta (WP_Query) que devuelve los resultados de los posts, pages y CPTs que contengan esa palabra en el título o contenido.

El parámetro s es una variable de consulta o Query Var. Aquí tienes un listado con todas las Query Vars disponibles, vamos a montar un ejemplo con category_name y tag.

Simplemente añadimos dos campos de tipo select, a los que llamaremos category_name y tag, para que de este modo, cuando enviemos el formulario, nos pase por la url el parámetro correspondiente quedando algo tipo http://midominio.es/?s=busqueda&category_name=noticias

Podemos añadir más campos usando las Query Vars como por ejemplo:

  • category_name: slug de una categoría. Admite valores múltiples separados por coma (p.e. category_name=noticias,eventos)
  • cat: ID de la categoría. Admite valores múltiples separados por coma
  • p: ID de un post de cualquier tipo.
  • name: slug de un post de cualquier tipo.
  • author: ID de autor
  • author_name: user_nicename de autor
  • tag: slug de una etiqueta. Admite valores múltiples separados por coma
  • tag_ID: ID de la etiqueta. Admite valores múltiples separados por coma
  • post_type: slug del tipo de post. post_type=any para mostrar posts de cualquier tipo.
  • year: para filtrar por año
  • month: para filtrar por mes
  • day: para filtrar por día
  • orderby: Indica el campo por el cual ordenar los resultados. Por ejemplo title, name, date…
  • order: Indica el orden de los resultados. Puede ser ASC o DESC.

 

Limitar la búsqueda a un tipo de contenido determinado

Si queremos limitar la búsqueda a un tipo de contenido determinado, por ejemplo que sólo busque en las entradas (descartando pages y CPTs), podemos hacerlo de dos maneras. La primera es añadiendo un input de tipo hidden a nuestro formulario de búsqueda llamado post_type y asignándole el valor post. De este modo pasará el parámetro post_type a la búsqueda:

La segunda opción es añadiendo un filtro a pre_get_posts en nuestro archivo functions.php:

Como vemos en este ejemplo, en éste filtro preguntamos si estamos haciendo una búsqueda y fuera del admin, en caso de que se cumpla esta condición establecemos que busque sólo en posts.

 

Ampliar la búsqueda a campos personalizados

Ésta parte tiene un poco más de miga ya que WordPress te permite extender al búsqueda a campos personalizados o custom fields a través de meta_query, pero con el operador lógico AND. Es decir, podrías construir una búsqueda para que encuentre resultados que coincidan en el título, o en el extracto, o en el contenido…y además también en el custom field que indiquemos:

De esta forma nuestra búsqueda quedaría: (título Ó extracto Ó contenido) Y (campo personalizado). Ésto puede resultar restrictivo porque lo que nos interesa es que nos devuelva todos los posts que contengan donde sea al menos una coincidencia con lo que estoy buscando.

Para ésto necesitamos tirar de ingenio. Lo que podemos hacer es a través del filtro posts_where un reemplazo del mismo donde hacemos el like al post_title, lo reemplazaremos por el like al post title más “o en el campo personalizado”:

De esta manera podemos extender la funcionalidad de búsqueda por defecto y adaptarla a nuestras necesidades, creando un formulario de búsqueda avanzada que mejorará la experiencia de usuario.

Si te ha gustado, valora este artículo para mejorar la calidad del blog o compártelo en Redes Sociales…
1 Star2 Stars3 Stars4 Stars5 Stars (3 votos, valoración 4,00 sobre 5) Loading...

Web Hosting