El formulario de búsqueda estándar de WordPress incluye un sólo input, de nombre s, en el que se específica el texto que se quiere buscar. En este tutorial vamos a ver como añadir más parámetros que nos permitan filtrar los resultados de búsqueda con criterios más específicos. Por ejemplo, limitar los resultados de búsqueda a una categoría o a un tipo de post.

Generando un formulario de búsqueda personalizado

El formulario de búsqueda estándar de WordPress lo podemos generar con esta función:

<?php get_search_form(); ?>

El resultado en HTML es:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
	<label>
		<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
		<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
	</label>
	<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

El formulario puede ser personalizado de varias formas, una de las más comunes es creando el archivo searchform.php en la carpeta del tema que tengamos activo. En este archivo podemos poner nuestro propio formulario de búsqueda con todas las demás opciones que queramos y será el utilizado por la función get_search_form(). Por ejemplo:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
	<label>
		<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
		<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
	</label>
        <select name="category_name">
            <option value="">Todas las categorías</option>
            <option value="politica">Política</option>
            <option value="eonomia">Economía</option>
        </select>
	<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

Ahora que ya sabemos como personalizar el formulario de búsqueda estamos listos para el siguiente paso.

Opciones de búsqueda con query string

Cómo el formulario utiliza method="get", los inputs adicionales que pongamos se enviarán como query strings (pares variable=valor). Y aquí viene lo bueno: podemos utilizar directamente cualquier variable admitida por WP Query en formato query string. Por ejemplo, podemos utilizar category_name y post_type:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
    <label>
        <span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
        <input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
    </label>
    <select name="category_name">
        <option value="">Todas las categorías</option>
        <option value="politica">Política</option>
        <option value="eonomia">Economía</option>
    </select>
    <select name="post_type">
        <option value="any">Todos los tipos</option>
        <option value="post">Post estándar</option>
        <option value="noticia">Noticias</option>
    </select>
    <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

Supongamos que en el formulario anterior introducimos “euro” como término de búsqueda y seleccionamos “Economía” como categoría y “Noticias” como tipo de post. Al enviar el formulario se generará esta URL: http://misitio.com/?s=euro&category_name=economia&post_type=noticia. Cómo las variables del query string tienen nombres admitidos por WP Query, WordPress los utilizará para filtrar los resultados de búsqueda sin que tengamos que hacer nada más. Así de sencillo.

Una lista de variables estándar que podemos utilizar (no exhaustiva):

  • category_name: nombre (slug) de una categoría (taxonomía “Categories” del core). Admite varias separadas por coma; por ejemplo, category_name=economia,politica.
  • cat: ID de una categoría (taxonomía “Categories” del core). Admite varias separadas por coma.
  • p: ID de un post de cualquier tipo.
  • name: slug de un post de cualquier tipo.
  • pagename y page_id
  • author y author_name
  • tag y tag_id para filtrar por etiquetas. (taxonomía post_tag del core).
  • post_type: slug del tipo de post. post_type=any para mostrar posts de cualquier tipo.
  • variables de fecha: year, month, day.

Para una lista más completa y ver todas las opciones de cada variable mira la documentación de WP Query.

Ejemplo

En el siguiente ejemplo obtendremos todas las categorías como opciones de un elemento select utilizando la función wp_dropdown_categories(). La categoría seleccionada será utilizada de forma automática por WordPress para filtrar los resultados de búsqueda:

<form role="search" method="get" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <label>
        <span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
        <input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
    </label>
    <label for="cat"><?php echo _x( 'Choose a category:', 'label' ) ?></label>
    <?php wp_dropdown_categories(); ?>
    <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

Búsqueda avanzada con pre_get_posts action

El action hook pre_get_posts nos permite manipular el query principal de WordPress antes de que se ejecute. En otras palabras, podemos decirle a WordPress los criterios exactos que queremos que utilice para buscar los posts en la base de datos. En el callback se recibe un objeto WP Query que podemos manipular a nuestro antojo.

Ejemplo

Excluir de los resultados de búsqueda aquellos posts que estén en la categoría 1 o 2:

add_action( 'pre_get_posts', 'include_any_post_type_in_search' );
function include_any_post_type_in_search( $query ) {
    //Comprobamos que NO estamos en el área de administración,
    //que el query es para una búsqueda
    //y que es el query principal
    if ( ! is_admin() && $query->is_search && $query->is_main_query() ) {
        //Excluir posts que estén en alguna de estas categorías
        $query->set( 'category__not_in', array( 1, 2 ) );
    }
}

Cómo ves, añadir funcionalidad extra a la búsqueda en WordPress es muy sencillo y con el action pre_get_posts las posibilidades son ilimitadas.

  • raverman

    Hola Juan, soy de Uruguay y estoy desarrollando un sitio para agencias de viaje utilizando el tema Book Your Travel el cual me a permitido utilizar Partner y sinceramente se ve muy bien, los buscadores con que cuenta el tema son todos referentes a los tours y yo necesito uno que liste todos los contenidos publicados por un Partner el cual tiene permisos especiales propios del tema (BYT Frontend Submit Role) para publicar desde el Front

  • Maru

    Hola Juan, te hago una consulta porque si bien entiendo la lógica, realmente no tengo conocimientos de php y estoy parada con este asunto ya que no encontraba solución hasta que di con tu post!

    Estoy usando advanced custom fields para agregar en ciertos posts las opciones de Localidad y de Ciudad. Lo que necesito es que el formulario de búsqueda incluya estas opciones como parte del mismo. Es decir, que incluya 3 campos que permitan buscar por: término de búsqueda + ciudad + localidad.
    Me podrás ayudar? Desde ya, muchas muchas gracias.
    Saludos,
    Maru

    • Maru

      Los campos que uso son:

      [acf field=”localidad”]

      [acf field=”ciudad”]

  • Rene Garcia

    Muy buen aporte amigo pero tengo una consulta… si yo quisiera hacer consultas propias por ejemplo a otra base de datos y hacer mis propios queries… hay posibilidad de hacerlo?

    • Por supuesto que hay posibilidad, nada te lo impide. Puedes construir el formulario que quieras y procesarlo como te guste, WordPress no te lo va impedir, pero me temo que es una situación un tanto alejada del propósito de este post.

    • Rene Garcia

      Ok muchas gracias y si es lo que estoy haciendo procesandolo a mi manera… muchas gracias de nuevo

  • Miguel

    ¿Y si quisiera buscar dentro de los valores de una taxonomía? Por no repetir lo ya explicado, te remito al soporte de wordpress donde hay también imágenes: https://es.forums.wordpress.org/topic/busqueda-taxonomia?replies=9
    Llevo ya unos cuantos días buscando documentación pero no encuentro nada.
    Un saludo.

  • Alberto Páez

    Muy útil todo tu contenido, es de gran ayuda. ¿Cómo puedo realizar esa búsqueda personalizada (formulario) usando custom post types y custom fields?

    • Cómo se explica en el post, en el action pre_get_posts puedes manipular el query principal de WordPress a tu antojo, incluyendo los custom post types, meta fields y cualquier otro parámetro de WP_Query. ¿Dónde tienes problemas exactamente para hacerlo?

    • Alberto Páez

      Bueno, en mi caso quiero crear varios campos personalizados (estaba pensando en utilizar el plugin acf) y filtrar a través de esos campos para hacer una selección de coches (u otros productos).

    • Si, muy bien, ¿pero dónde tienes problemas para hacerlo? ¿qué no has entendido del post? ¿dónde necesitas ayuda?

    • Alberto Páez

      Necesito la ayuda a la hora de crear ese campo de búsqueda personalizado…, el típico campo que se usa en las web de coches o inmobiliarias

    • Lo siento Alberto pero si no eres más concreto sólo te puedo remitir a los ejemplos del post. A partir de ellos deberías ser capaz de hacer los que necesites. Si tienes algún problema concreto para hacerlo o no entiendes alguna parte, aquí estaré para responder tus dudas.

    • Alberto Páez

      Gracias por tu atención