Revista Informática

Ofrecer sugerencias en tu WordPress usando opensearch

Publicado el 11 agosto 2010 por Displaynone

Creo que para ciertos blogs es muy útil ofrecer la opción de añadir OpenSearch para que la gente puede realizar búsquedas en nuestro blog. Algo también bastante útil es que nos ofrezca sugerencias de búsquedas (tal y como hace Google). Para ello tan sólo hay que añadir una opción al XML de OpenSearch y modificar nuestro functions.php.

En el fichero XML deberemos añadir la siguiente etiqueta:

<Url
  type="application/x-suggestions+json" 
  template="http://miblog.com/suggestion/{searchTerms}"
/>

Y añadir xmlns:suggestions="http://www.opensearch.org/specifications/opensearch/extensions/suggestions/1.1" a la etiqueta inicial OpenSearchDescription

Yo en este caso he preferido usar una URL amigable, sobre todo para practicar con el wp_rewrite, pero se podría hacer perfectamente con una variable con parámetros.

Una vez cambiado el opensearch.xml deberemos modificar el functions.php, para lo cual tendremos que coger el término que se quiere sugerir y buscar entre las categorías y tags y entre los títulos de los posts para así mostrar una unión de ambos. Las categorías se ordenarán por el número de veces que aparece y los posts por fecha descendente.

add_filter('init','suggestion_init');
add_filter('query_vars','suggestion_insertMyRewriteQueryVars');
add_filter('rewrite_rules_array','suggestion_rewrite');
 
// Acciones iniciales
function suggestion_init(){
  // Reescribe las reglas
  global $wp_rewrite;
  $wp_rewrite->rewrite_rules();
 
  // Obtiene el termino a buscar
  $req = explode('/', substr($_SERVER['REQUEST_URI'], 1), 2);
  if ($req[0] == 'suggestion') {
    $result = wp_cache_get( 'suggestion_'.$req[1] );
    if ( false == $result ) {
      global $wpdb;
      $list = array();
      // Recupera las 4 categorias/tags que coincidan
      $res = $wpdb->get_results("select name from $wpdb->terms t, $wpdb->term_taxonomy tx where name like '%".$req[1]."%' and t.term_id = tx.term_id group by name order by count desc limit 4");
      foreach ($res as $item) $list[] = $item->name; 
      // Recupera las 4 anotaciones que coincidan   
      $res = $wpdb->get_results("select post_title from $wpdb->posts where post_title like '%".$req[1]."%' order by ID desc limit 4");
      foreach ($res as $item) $list[] = $item->post_title;
      // Devuelve en formato JSON     
    	$result = json_encode(array($req[1], $list));
    	wp_cache_set( 'suggestion_'.$req[1], $result );
    } 
 
    echo $result;
    exit();
  }
}
 
// Permite que WP acepte un nueva parametro en la query de la URL
function suggestion_insertMyRewriteQueryVars($vars) {
    array_push($vars, 'suggestion');
    return $vars;
}
 
// Reescribe la regla
function suggestion_rewrite($rules)
{
	$newrules = array();
	$newrules['suggestion/([^/]+)/(.*)$'] = 'index.php?suggestion=$matches[1]';
	return $newrules + $rules;
}

En el código he añadido caché, porque es altamente recomendable, puediendo usar el plugin WP File Cache. También debo decir que me encontré con el problema del timeout que tiene Firefox para esperar la respuesta para la sugerencia, muy pequeño para mi servidor, por lo que si quieres modificarlo, busca el fichero nsSearchSuggestions.js y modifica el valor de _suggestionTimeout.


Volver a la Portada de Logo Paperblog