Incluir término de taxonomía personalizada en la búsqueda

33

Tengo dos taxonomías personalizadas aplicadas a dos tipos de publicaciones personalizadas. la lista de términos en la barra lateral está bien y enumerará todas las publicaciones asociadas. Sin embargo, si busca uno de los términos en específico, no aparece una publicación con ese término.

Ejemplo: http://dev.andrewnorcross.com/das/all-case-studies/ Busque el término "PQRI"

No consigo nada ¿Algunas ideas? He intentado usar varios complementos de búsqueda pero rompen mis parámetros de búsqueda personalizados o simplemente no funcionan.

Norcross
fuente
Nocross, ¿puedes agregar algún comentario a la respuesta propuesta por Jan? ¿Probablemente estás buscando un complemento que haga el trabajo?
Hakre
Terminé abandonando el plan. Como había creado 3 funciones de búsqueda separadas (basadas en diferentes necesidades en ciertas áreas), todos los complementos que probé los rompieron. Al final, le dije al cliente que incluyera términos en el contenido si quería que se pudiera buscar.
Norcross

Respuestas:

36

También recomendaría el complemento Buscar todo , pero si desea implementar esto usando la función de búsqueda de WP, aquí está el código que estoy usando en mi tema Atom:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT 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";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

Se basa en el complemento Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

Pony de un solo truco
fuente
1
Esto es genial: ¿cómo se puede modificar este código para excluir una serie de ID de taxonomía de la búsqueda?
HandiworkNYC.com
Cabe señalar que las devoluciones de llamada de filtro para estos ganchos aceptan 2 argumentos; el segundo para todos ellos es la instancia WP_Query que se pasa por referencia. Las comprobaciones is_search()u otras llamadas al método WP_Query ( is_search() is_home()etc.) siempre deben llamarse directamente en la instancia de consulta (por ejemplo, $query->is_search()suponiendo que el nombre de la variable de instancia está $queryen la firma de devolución de llamada) en lugar de la función de plantilla que siempre se referirá a la consulta principal , no la consulta para la que se ejecuta el filtro.
Evan Mattson
44
Además, probablemente no sea una buena idea inyectar la cadena de búsqueda sin procesar disponible públicamente directamente en una consulta SQL ... lectura recomendada
Evan Mattson
Solo me gustaría agregar que esto tiene un conflicto con WPML porque WPML ya usa 'T' en la parte de la combinación, por lo que el uso de algo personalizado en lugar de tr, tt y t soluciona este problema
Bobz
7

¿Es esta la búsqueda estándar de WordPress? Porque eso no parece incluir taxonomías (ni siquiera estándar, como categorías y etiquetas) en la búsqueda. El código busca post_titley post_content, pero si desea incluir algo más, debe engancharlo al posts_searchfiltro.

Jan Fabry
fuente
5

Probé la solución de Onetrickpony arriba https://wordpress.stackexchange.com/a/5404/37612 , que es genial, pero encontré un problema allí, que no funcionó para mí, y haría una pequeña modificación:

  1. si busqué una cadena en el título de la taxonomía, funciona muy bien
  2. si la taxonomía tiene caracteres especiales, por ejemplo, con "Umlauts" alemanes (ö, ä, ü) y uno busca oe, ae, ue insteda de usar el carácter especial, debe agregar la búsqueda en la babosa de la taxonomía - OR t.slug LIKE '%".get_search_query()."%'

  3. si busca una combinación de una consulta de búsqueda y un filtro de taxonomía, esto también funciona bien

  4. Pero el problema es que cuando intentas usar solo el filtro de taxonomía: el gancho de búsqueda agrega una cadena vacía a la consulta si no se busca texto, y por esa razón obtienes TODAS las publicaciones en el resultado, en lugar de solo aquellas del Taxonomía filtrada. Una simple declaración IF resuelve el problema. Entonces, todo el código modificado sería este (¡funciona perfectamente bien para mí!)

function custom_search_where ($ where) { 
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%') AND {$ wpdb-> posts} .post_status = 'publicar') ";
  devolver $ donde;
}

function custom_search_join ($ join) {
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "LEFT 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 ";
  devuelve $ join;
}

function custom_search_groupby ($ groupby) {
  global $ wpdb;

  // necesitamos agrupar en ID de publicación
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) devuelve $ groupby;

  // groupby estaba vacío, usa el nuestro
  if (! strlen (trim ($ groupby))) devuelve $ groupby_id;

  // no estaba vacío, agrega el nuestro
  return $ groupby. ",". $ groupby_id;
}

add_filter ('posts_where', 'custom_search_where');
add_filter ('posts_join', 'custom_search_join');
add_filter ('posts_groupby', 'custom_search_groupby');
Asped
fuente
3

Tengo el mismo nivel de información como Jan. Sé que también es posible ampliar la búsqueda con complementos.

Probablemente Buscar todo (Wordpress Plugin) es lo que estás buscando. Según la lista de características, ahora admite taxonomías personalizadas.

hakre
fuente
Complemento +1 para Buscar todo. Funciona como se esperaba y devuelve más resultados que la búsqueda estándar de Wordpress.
PNMG
2

Encontré que la respuesta de onetrickpony es excelente, pero trata cualquier búsqueda como un solo término y tampoco trata con una frase de búsqueda entre comillas. Modifiqué un poco su código (específicamente, la atom_search_wherefunción) para lidiar con estas dos situaciones. Aquí está mi versión modificada de su código:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT 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";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');
Mojamba
fuente
1

Tengo el mismo problema con el complemento de carrito de WooCommerce. Mis resultados de búsqueda no incluyen el término de taxonomía personalizado, 'etiqueta_producto', porque no es una etiqueta de publicación estándar. Encontré una solución en este otro hilo de StackOverflow sobre el asunto:

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

El ejemplo de código de tkelly funcionó para mí al reemplazar el término authoren su ejemplo con product_tagnuestras necesidades para los complementos del carrito.

mroncetwice
fuente