Estoy trabajando en mi sitio, cualquier error hazmelo saber... :)

Jepser Bernardino

idea

Búsqueda avanzada en WordPress

Hace poco para un proyecto necesitaba hacer un buscador avanzado, que me mostrara resultados en base a ciertos criterios y como siempre ha sido criticado, el sistema de búsqueda de wordpress es muy limitada.

Existen una serie de plugins para poder mejorar la funcionalidad, desde un Search API creado por Justin Shreve. Hasta plugins como WP Custom Search de Benjamin. Un buen plugin pero es difícil de modificar y en un proyecto anterior hacia conflicto con Jquery.

No es nada nuevo (para mi lo fue en su momento) pues muchas veces queremos buscar en cierta categoría, o en cierta taxonomía, algún custom field, etc.

¿Cómo funciona el formulario de búsqueda?

Cuando hacemos un query, le mandamos los parámetros para que nos muestre los posts de la categoría X, o la taxonomía Y, etc. Con el formulario es igual, por medio de hidden fields (en el más básico de los casos) o selects, checkboxes y campos de texto creamos el query para poder hacer la búsqueda.

¡Ya los ejemplos!

Buscar en una categoría específica

Imaginemos que quiero buscar en mi blog solo en la categoría portafolio, el código sería así:

<form method=”get” id=”searchform” action=”<?php bloginfo(‘home’); ?>/”>
<div>
<input type=”text” value=”<?php echo wp_specialchars($s, 1); ?>” name=”s” id=”s” />
<input type=”hidden” name=”cat” value=”5″ />
<input type=”submit” id=”searchsubmit” value=”Buscar” />
</div>
</form>

Donde con un campo invisible  coloco la categoría que deseo, pero es engorroso buscar el id de la categoría pues muchas veces cuando uno trabaja en local los id’s cambian ya en el WordPress de producción, ¡pero no se asusten! Podemos quitarnos esa piedra del zapato con una función donde es mucho más fácil por nombre de categoría así:

$id_categoria = get_cat_id('Coloco el nombre de la categoría');

Para que al final nos quede algo así:

<form method=”get” id=”searchform” action=”<?php bloginfo(‘home’); ?>/”>
<div><?php $id_categoria = get_cat_id('portafolio'); ?>
<input type=”text” value=”<?php echo wp_specialchars($s, 1); ?>” name=”s” id=”s” />
<input type=”hidden” name=”cat” value=”<?php echo $id_categoria; ?>″ />
<input type=”submit” id=”searchsubmit” value=”Buscar” />
</div>
</form>

Pero que si no quiero que busquen en una sola categoría, sino que pueda elegir en que categoría buscar de todas las que tengo. Solo cambiamos el campo nombrado “cat” (de categoría) por un select con el mismo nombre y usando la función dropdown_categories nos queda así:

<?php wp_dropdown_categories('show_count=0&hierarchical=1&depth=1'); ?>

Podemos cambiar a mostrar la lista de tags, todas las categorías, solo las categorías principales todo depende de la configuración de esta función.

Buscar solo los hijos de una categoría

Siempre seguimos con los select y esta vez utilizamos la función get_categories() digamos que quiero las subcategorías de mi categoría principal llamada Sodas y bajo esta categoría se encuentran los sabores de gaseosas.

<form method=”get” id=”searchform” action=”<?php bloginfo(‘home’); ?>/”>
<div id=”search”>
<input type=”text” value=”Search… ” name=”s” id=”s” />
<?php $id_categoria = get_cat_id('sodas'); ?>
<?php $categorias = get_categories(‘child_of=$id_categoria′);
$catlist = ”;
foreach ($categorias as $cat) {
$lista_cat.= $cat->cat_ID.’,';
}
$lista_cat. $id_categoria;
?>
<input type=”hidden” name=”cat” value=”<?php echo “$lista_cat”?>” />
</div><!–/search –>
</form>

Buscando en una taxonomía

Primero debemos tener en cuenta que es una taxonomía, hay un sin fin de tutoriales y explicaciones; para hacerlo fácil es una clasificación de un algo. Ahora como ejemplo, tengo mi taxonomía llamada área donde están concentradas las carreras de una univesidad para las cuales quiero buscar y también esas carreras solo están disponibles en ciertas partes del mundo, entonces quiero un formulario que me busque el tipo de carrera y la ubicación y que me muestre SOLO los resultados que están para esos lugares y que sean el tipo de carrera que deseo.

Lo primero será crear una función que podré utilizar cuantas veces sea por si necesito diferentes formularios, entonces colocamos esto en functions.php.

function get_terms_dropdown($taxonomies, $args){
$myterms = get_terms($taxonomies, $args);
$output ="<select name='".$taxonomies."'>";
foreach($myterms as $term){
$root_url = get_bloginfo('url');
$term_taxonomy=$term->taxonomy;
$term_slug=$term->slug;
$term_name =$term->name;
$link = $term_slug;
$output .="<option value='".$term_name."'>".$term_name."</option>";
}
$output .="</select>";
return $output;
}

Esta función nos toma todos los terminos de una taxonomía que querramos y podemos reutilizarla para las taxonomías que sean.

Entonces regresando tengo mi taxonomía area y ubicación y quiero buscar por ese criterio.

<form method="get" id="searchform" action="<?php bloginfo('home'); ?>/">
<?php
$taxonomies = 'area';
$args = array('orderby'=>'name','hide_empty'=>true);
$area_select = get_terms_dropdown($taxonomies, $args); ?>
<p><label>Elije el area de la carrera que le interesa</label>
<?php echo $area_select; ?></p>
<?php
$taxonomies = 'ubicacion';
$args = array('orderby'=>'name','hide_empty'=>true);
$ubicacion_select = get_terms_dropdown($taxonomies, $args); ?>
<p><label>Elije el lugar donde deseas estudiar</label>
<?php echo $ubicacion_select; ?></p>
<input name="Buscar" type="submit" value="Buscar" />
</form>

Buscando en los custom fields

Esto es muy importante y sobre todo útil, para una inmobiliaria utilicé uno de los plugins listados allá arriba y hasta ahora me dí cuenta que puedo hacer lo mismo pero con mejor control de lo que quiero.

Vamos a hacer un ejemplo que no tiene nada que ver con la inmobiliaria, digamos que tengo una biblioteca virtual, y los libros pueden buscarse por género, titulo y autor. Colocaré entonces un radio que me marque una de las 3 opciones (por supuesto que podemos hacer eso mucho más fácil con taxonomías). El formulario me quedaría así:

<form method="get" id="searchform" action="<?php bloginfo('home'); ?>/">
<input type="text" value="<?php echo wp_specialchars($s, 1); ?>" name="s" id="s" />
<label for="titulo">Buscar por título<input name="key" type="radio" value="titulo" /></label>
<label for="autor">Buscar por autor<input name="key" type="radio" value="autor" /></label>
<label for="genero">Buscar por género: <input name="key" type="radio" value="genero" /></label>
<input type="submit" id="searchsubmit" value="Buscar libro" />
</form>

Básicamente lo que se hace es darle el nombre “key” que hace referencia que es un custom field y le damos el nombre del custom, entonces buscaremos en valor en el campo “s” en el custom field que elijamos.

Opciones, ¡infinitas!

Básicamente se puede hacer una búsqueda en todo lo que se necesite dependiendo de los condicionales que uno desee aquí está un lista de los que he probado esta el momento.

name=”cat” value=”ID de la categoría” – busca en categorías, con los ID’s de las mismas. Separado en comas (,) para buscar en más de una categoría y le agregamos un signo menos (-) para excluir categorías

name=”key” value=”nombre del custom field” - busca en los custom fields, se coloca el nombre del custom.

name=”tag” value=”el nombre del tag” – busca en los tags y si tiene valor busca en el contenido y que tenga el tag incluido en el post

name=”nombre de la taxonomía” value=”el término de la taxonomía” – al tener varias taxonomías, hace el condicional AND para buscar en entradas que cumplan con las taxonomías, se pueden hacer OR agregando terminos separados por comas (,) en el mismo value de la taxonomía (ejemplo: name=”taxo_talla” value=”small, medium”).

¡Espero que les ayude un poco en su próximo proyecto!

27 comentarios

  1. 6 septiembre 2010

    muy bueno
    saludos

  2. jordi
    17 septiembre 2010

    Fantástico tutorial, ¿es posible añadir algún campo para que filtre por custom post type?

  3. jordi
    17 septiembre 2010

    Resuelto:
    name=”post_type”

  4. 17 septiembre 2010

    exacto hay infinitas posibilidades, desde que lo que armas es un query, puedes crear las opciones con name=”nombre del parámetro en el query” value=”el valor posible y válido”. Saludos

  5. 15 diciembre 2010

    Hola Jepser, muy útil tu tutorial; te pregunto algunas dudas que me han surgido al aplicar tus recetas:

    La búsqueda por campos personalizados usando name=”key” no me funciona y googleando encuentro el plugin WP Custom Fields Search que funciona a la perfección, aunque preferiría llegar a una solución sin usar plugin alguno.

    Parece que el query de la búsqueda no acepta el campo key, tampoco el meta_key como sugieren otros tutoriales.

    Encuentro también este otro tutorial que explica cómo modificar algunos archivos del wp-includes para implementar la búsqueda en campos personalizados. Tiene el inconveniente de que a cada actualización de WP habría que volver a cambiar el código de esos archivos, así que no me parece buena opción.

    ¿Alguna idea?

    En cuanto a la búsqueda por taxonomías me pasa lo mismo: consigo formar un query de búsqueda con una taxonomía (por ejemplo autor) y una categoría, del tipo:

    ?cat=3&autor=pablo

    Pero no un query combinando dos taxonomías, del tipo:

    ?autor=pablo&isbn=2289222

    ¿Alguna idea sobre esto otro?

  6. 15 diciembre 2010

    Que tal! Mira básicamente es hacer un query como un costum loop (http://codex.wordpress.org/Function_Reference/query_posts) y listo con respecto a las múltiples taxonomías si tienes razón; este es el plugin que resuelve el problema http://wordpress.org/extend/plugins/query-multiple-taxonomies/ espero que te ayude y pilas!

  7. 16 diciembre 2010

    Oye, genial el plugin para hacer querys de varias taxonomías, con él ya está todo resuelto. Funciona a la perfección. Gracias por el soplo.

    Lo de hacer un query de custom fields, lo hago sin problema con query_posts pero cuando paso esos valores como parámetros de búsqueda desde el formulario, WordPress los ignora.

  8. 13 enero 2011

    Solo para agradecerte por este tremendo post. No sabia que era tan fácil hacer busquedas avanzadas en wordpress solo añadiendo los parametros. Lo que más me sorprendio son los custom fields, increible!.

    Gracias!

  9. raul
    28 enero 2011

    Perdoná mi ignorancia, pero estos códigos ¿en donde se insertan? ¿hay que crear algún archivo php y guardarlo en la carpeta de la plantilla en uso? si me pudieras dar el dato por donde empezar, o que modificar, te agradeceré, así puedo empezar a armar mi propio buscador. ¡Gracias!

  10. 17 febrero 2011

    Que tal Raul, se insertan en el tema dentro del formulario de búsqueda.

  11. 16 marzo 2011

    NO FUNCIONA EL BUSCAR EN CAMPOS PERSONALIZADOS !! :S ALGUNA OTRA FORMA ?

  12. Soledad
    4 agosto 2011

    Hola! Necesito pedirte ayuda , aclaro que soy principiante: Quiero hacer un buscador de colectivos (buses) en el que se pueda definir la busqueda por punto departida y destino.¡Mi idea es crear la categoria punto de partido y destino y establecer los hijos para cada una (ciudades). Se que explicaste como definir esa busqueda, pero mi pregunta es: como hago para que me aparezcan los dos campos “punto de partida” y “destino” espero que se entienda lo que pregunto
    saludos y gracias
    soledad

  13. josue
    28 septiembre 2011

    Hola ami no me funciona esto

    name=”taxo_talla” value=”small, medium”

    alguna forma de indicar el evitar incluir la taxonomia seleccionada??
    saludos!!

  14. 2 octubre 2011

    es que solo puedes colocar un valor por campo!

  15. 10 octubre 2011

    Hola Jepser, buen día … Antes felicitarte por tu trabajo el cual saca de apuros algunos desarrolladores que estamos en apuros, entrando al tema, tengo varios metas creados desde el functions.php, como puedo hacer busquedas en ellos sin usar plugin ya que no utilizo el loop.php para hacer la busqueda. Con el name=”key”, no me funciona.

  16. dubi
    11 octubre 2011

    buscando por buscador avanzado wordpress encontre tu página, estoy haciendo un tipo de formulario de busqueda y hasta ahora me funciona este

    Elija su Región

    <option value="term_id ?>” selected=”selected”>
    name ?>

    que me hace una select con las categorias del sitio, ahora quiero hacer lo mismo pero que en el select aparezcan solo las subcategorias.. como lo hago necesito caleta de ayuda en eso estoy que me vuelvo chango :@

    saludos :D

  17. dubi
    11 octubre 2011

    LOL no se puso el codigo entero s_s

  18. 24 octubre 2011

    bueno lo que pasa es que busco un buscador que sea como de filtro que escoja una categoria y ya pongo la seleccionada en seguida pueda poner el nombre del cartucho a buscar y ese me mande a la pagina donde se encuentra con su informacion.

    me urge esta ayudadita.

  19. 24 octubre 2011

    Aqui esta este tutorial que he echo que si bien no es lo mismo que quieres se le acerca bastante: http://jepserbernardino.com/mini-tutoriales/crear-anidados-con-categoriastaxonomias-en-wordpress/

  20. 24 octubre 2011

    mmm bueno deja explicarme mas , la pagina que estoy haciendo es sobre cartuchos de impresoras entonces lo que quiero es modificar el buscador de wordpress para que cuando busque algun producto en la pagina pues me aparesca unicamente la informacion que puse sobre el cartucho. pero que al encontrar lo uqe busco pues me mande directamente a la pagina y no que me salga que escribi un post con ese nombre.

  21. emiliano
    6 noviembre 2011

    hola Jepser, me podrias decir como hago para buscar por medio de tags en wordpress y que si uno de los tags no se encuentra en los resultados, me muestre igualmente los resultados de los demas tags? porque hasta ahora no consigo hacerlo, tengo el plugin Search Everything Version: 6.6 gracias.!

  22. Mario
    7 diciembre 2011

    Es posible hacer que en el desplegable select, no solo me muestre todas los terminos existentes de la taxonomia, sino que me muestre una con la opción “cualquiera”, de manera que si elijo esta opción me busca en toda la taxonomia?

  23. 7 diciembre 2011

    que tal Mario si se puede, cuando hace el get_terms(‘mi taxonomia’, ‘mis parametros), este te devuelve en un array los siguiente:
    name
    taxonomy
    slug
    … (etc)
    entonces podrias construir a partir de alli un select con lo siguiente:
    $taxonomy = 'mytaxonomy';
    $terms = get_terms($taxonomy, 'hide_empty=0);
    if($terms) {
    echo '

    ';

  24. Mario
    8 diciembre 2011

    Gracias por la respuesta Jepser, pero no me queda claro. El código no sale correctamente en tu mensaje. Por otro lado, siguiendo este tutorial…. donde debería hacer las modificaciones? en el functions.php o en el searchform.php?

  25. Victor
    3 enero 2012

    Hola Jepser:

    Necesitaba hacer una consulta como puedo filtrar en un buscador con dos Custom Filed, por ejemplo donde Tengo “Marca” Y “Modelo” de un vehiculo y traer el detalle de este articulo.
    Lo intente creando una taxonomia “Marca” y “Modelo” y reemplace en el codigo que publicaste pero esto no lo hace dependiente uno del otro, osea no filtra, agradeceria pudieras darme un tip de como puedo filtrar estos “Custom Field” y que puedan ser dependientes uno del otro en este caso “Marca” de “Modelo”.

    Desde ya gracias por tu tiempo.
    Saludos.

  26. 7 marzo 2012

    Hola!! Excelente publicacion,

    Me esta funcionando de maravilla las busquedas, solo tengo un pequeño problema, quiciera que los resultados me los mostrara con una imagen miniatura, como lo puedo hacer?

    Saludos!

  27. Mile
    6 mayo 2012

    Soledad, estoy en la misma que tu, necesito crear dos campos en mi caso
    que digan Ciudad de Partida y Ciudad de Llegada, si va el caso lo mismo 
    Queria saber si pudiste hacerlo y puedas compartir te lo agradeceria y si 
    Jepser puedes ayudarnos seria genial !!

    Besos y muy buena info en general.
    Saludos.!

Join to the conversation

Go top idea