Seleccionar página

Modificar los resultados de búsqueda en WordPress

por | Mar 28, 2017 | Wordpress

Índice de contenidos

Modificar los resultados de búsqueda, ver; post, categoría…

Seguimos con la serie de artículos dedicados a modificar el buscador en WordPress. Ayer expliqué varios métodos para modificar su apariencia y algunos plugins que modifican la funcionalidad del buscador. Con el post de hoy aprenderemos cómo modificar los resultados de búsqueda en WordPress.

Modificar el buscador en WordPress

Por defecto WordPress realiza las búsquedas en post, páginas… hoy voy a explicar como limitar los resultados: a post, categorías de un post… y en el próxima entrada veremos cómo modificar la página de resultados de búsqueda en WordPress.

Función para modificar los resultados de búsqueda en WordPress

Vamos a utilizar un hook o gancho, disponible en WordPress que nos ayuda a filtrar los resultados de la consulta principal. En concreto, vamos a hacer uso de pre_get_posts.

pre_get_posts

Este hook se llama después de crear la query principal y antes de visualizarla por pantalla. Esto nos permite modificar la Query para que únicamente muestre los resultados que nos interesa. Los códigos de ejemplo se deben añadir al archivo functions.php que encontrarás en la carpeta del tema WP con el que trabajes.

El objeto $query es pasado a la función por referencia, no necesitas declarar dentro de tu función una variable global ni un valor de retorno. Pero cuidado, cualquier cambio que realicemos sobre la consulta dentro de la función, modifica la query.

Para evitar que se altere la consulta principal a nivel general, empleamos funciones condicionales tipo: 

if ($query->is_search)

para indicar que aplique el hook cuando es una consulta.

Lo entenderás mejor con los siguientes ejemplos:

Ejemplo 1: Mostrar resultados de búsqueda de los post pertenecientes a la categoría con slug «wordpress»
function busqueda_categoria_nombre ( $query ) {
	if( $query->is_main_query() && $query->is_search ) {
		$query->set('category_name', 'wordpress');
	}
}
add_action('pre_get_posts','busqueda_categoria_nombre');

El código es muy sencillo, declaramos una nueva función «busqueda_categoria_nombre«. Si la $query es la principal y es la $query de búsqueda entonces, que seleccione de todos los resultados los post con nombre de categoría «wordpress».

La última línea add_action, indica que cuando se produzca el evento ($query lista) queremos modificar la consulta. Esta línea de código es necesaria para que la función se ejecuté.

Voy a escribir de nuevo la función con un nuevo condicional !is_admin(). Este condicional es importante porque el administrador de WordPress también emplea la función de búsqueda y no nos interesa limitarla a los post. is_admin(), comprueba si estamos en el Dashboard de WordPress. Es recomendable emplear esta estructura en todos los códigos.

function busqueda_categoria_nombre ($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('category_name', 'wordpress');
    }
  }
}
add_action('pre_get_posts','busqueda_categoria_nombre ');
Ejemplo 2: Mostrar resultados de búsqueda de los post pertenecientes a la categoría con ID=5
function busqueda_categoria_id( $query ) {
    if ( !is_admin() && $query->is_main_query() ) {
      if ($query->is_search) {
        $query->set( 'cat', '5' );
      }
    }
}
add_action( 'pre_get_posts', 'busqueda_categoria_id' );
Ejemplo 3: Modificar los resultados de búsqueda en WordPress para que únicamente muestre los post (excluir páginas de la búsqueda)

La mayoría de los usuarios de nuestro blog, cuando realizan algún tipo de búsqueda en el mismo, demandan artículos o entradas sobre un tema concreto y no páginas estáticas. 

function mostrar_solo_post($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('post_type', 'post');
    }
  }
}
add_action('pre_get_posts','mostrar_solo_post');
Ejemplo 3: Mostrar Custom Post Types (entradas personalizadas)

Si tienes algún tipo de entrada personalizada en tu blog: libros, eventos, películas… puedes declarar en la función un array de tipos para que se muestren en los resultados de búsqueda: array(‘post’,’libros’,’eventos’,’peliculas’);

function mostrar_post_y_eventos($query) {
  if ( !is_admin() && $query->is_main_query() ) {
      if ($query->is_search) {
      $query->set('post_type', array( 'post', 'eventos' ) );
      }
  }
}
add_action('pre_get_posts','mostrar_post_y_eventos');

Copia y pega el código en el archivo functions.php de tu tema. Recuerda que para no perder las modificaciones con actualizaciones del tema, siempre aconsejo trabajar con un tema hijo.

Hasta aquí hemos llegado con la entrada de hoy. Puedes modificar cualquiera de los códigos explicados para adaptarlo a las necesidades de tu proyecto. Si se te resiste el código no dudes en pedir ayuda empleando el formulario de comentarios.

Dejo para mañana el tercer artículo sobre modificar los resultados de búsqueda en WordPress, aprenderemos a realizar las modificaciones sobre la página de resultados de búsqueda «search.php«.

Te puede ayudar:

Cómo modificar el buscador en WordPress

Añadir buscador a la barra de menú WordPress.

Plugins WordPress para crear un tema hijo.

 

 

 

9 Comentarios

  1. Gema

    Buenas noches!

    Tengo una tienda online con woocomerce y lo que necesito es delimitar los resultados de búsqueda a productos, únicamente.
    ¿Como lo puedo hacer?

    Responder
    • Lph by Nerea Liébana

      Buenas tardes Gema, no entiendo muy bien tu pregunta. WooCommerce ofrece por defecto un widget de buscador para productos. Me puedes explicar un poco más el problema, quizá lo que necesites es utilizar el buscador de woocommerce y no el de WP. Ya me cuentas. Saludos

      Responder
  2. erik

    ¿Como limito los resultados de búsqueda solo a categorías, etiquetas y títulos? es decir que no tome en cuenta el contenido de las entradas.
    Muchas gracias por la info!

    Responder
  3. santiago

    Pero donde tengo que entrar para incrustar el codigo? gracias

    Responder
    • Lph by Nerea Liébana

      Buenos días Santiago, en el archivo functions.php dentro de la carpeta del tema WP.

      Responder
  4. Alberto

    Buenos días! Muchas gracias por compartir, me sirve de gran ayuda. Aunque tengo una duda. Yo necesito excluir de mis resultados de búsqueda tanto las páginas como una categoría en concreto. ¿Cómo sería la función? Muchas gracias.

    Responder
    • Lph by Nerea Liébana

      Hola Alberto,
      puedes trabajar cambiando set();
      $query->set( ‘category__not_in’, array( 23, 19 ) ); /*selecciona todas las categorías menos la ID=23 y ID=9*/
      también puedes añadir un nuevo condicional dentro del if; if ( !is_admin() && $query->is_main_query() && !is_page()) /*para excluir las páginas*/

      Responder
  5. Diego Castiblanco

    Hola, yo instale el plug in de search everything y quiero editar los resultados de la búsqueda para que me muestre mas de 5 por página. también quiero mostrar los resultados sin fecha y sin autor.

    Responder
    • Lph by Nerea Liébana

      Hola Diego, lo siento pero no he trabajado nunca con ese plugin. La URL de soporte del plugin es la siguiente:
      Support Search Everything
      en esa dirección puedes consultar tus dudas.
      Otra opción es modificar el código del plugin que encontrarás dentro de wp-content/plugins/search-everything y modificar la plantilla de resultados para eliminar fecha y autor del bucle de salida y número de post a mostrar de la consulta query.
      Si no sabes programación o se utiliza una query global siempre puedes emplear un método muy sencillo que es eliminar con CSS la visibilidad de fecha y autor. Debes poner lo siguiente en tu archivo css con:
      .search .post-meta {display:none}
      Por otro lado en en Ajustes >> Lectura que cifra tienes configurada en:
      «Número máximo de entradas a mostrar en el sitio»? El plugin puede coger el dato de ahí?
      Ya me dices…
      Saludos!

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *