Í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.
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.
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?
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
¿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!
Pero donde tengo que entrar para incrustar el codigo? gracias
Buenos días Santiago, en el archivo functions.php dentro de la carpeta del tema WP.
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.
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*/
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.
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!