WordPress – Buscar en Categorías, Etiquetas y Campos Personalizados
En WordPress por defecto las búsquedas que puedan realizar los visitantes de la Web, las realiza sólo en los campos título y contenido de las entradas, pero las entradas pueden tener más información, como taxonomías (Categorías y Etiquetas) y Campos Personalizados.
Para que además en las búsquedas también se realicen dentro de Categorías, Etiquetas y Campos Personalizados, podemos añadir al final del “functions.php” de nuestro tema, las líneas de código que tenéis al final de este posts.
Como se puede estas líneas estan divididas en 3 funciones, la primera es con “posts_join”, dónde añadimos a la consulta de la base de datos las tablas de taxonomías ( wp_term_relationships, wp_term_taxonomy y wp_terms ) y la tabla de campos personalizados ( wp_postmeta ), luego con “posts_where” buscamos en los terminos de taxonomías ( wp_terms->name ) y en los valores de los campos personalizados ( wp_postmeta->meta_value ) y por último con “posts_groupby” nos aseguramos de que el resultado salga agrupado por entradas, así evitamos que puedan salir entradas repetidas.
add_filter(‘posts_join’, ‘busqueda_join’);
function busqueda_join($join){
global $wpdb;
if ( is_search() ) {
$join .= “INNER JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id INNER JOIN {$wpdb->postmeta} pm ON {$wpdb->posts}.ID = pm.post_id “;
}
return $join;
}
add_filter(‘posts_where’,’busqueda_where’);
function busqueda_where($where){
global $wpdb;
if ( is_search() ) {
$where .= ” OR (t.name LIKE ‘%”.get_search_query().”%’) “;
$where .= ” OR (pm.meta_value LIKE ‘%”.get_search_query().”%’) “;
}
return $where;
}
add_filter(‘posts_groupby’, ‘busqueda_groupby’);
function busqueda_groupby($groupby){
global $wpdb;
$groupby_id = “{$wpdb->posts}.ID”;
if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;
if(!strlen(trim($groupby))) return $groupby_id;
return $groupby.”, “.$groupby_id;
}