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

31

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

Ejemplo: enlace Buscar 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.

    
pregunta Norcross 06.10.2010 - 03:06

6 respuestas

35

También recomendaría el complemento Buscar todo , pero si desea implementar esto con 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: enlace

    
respondido por el onetrickpony 15.12.2010 - 12:48
7

¿Es esta la búsqueda estándar de WordPress? Debido a que no parece incluir taxonomías (ni siquiera estándar, como categorías y etiquetas) en la búsqueda. El código busca en post_title y post_content , pero si desea incluir algo más, debe enlazar con el filtro posts_search .

    
respondido por el Jan Fabry 07.10.2010 - 17:56
5

Probé la solución de Onetrickpony por encima de enlace , lo cual 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, p. ej. con "Umlauts" alemanes (ö, ä, ü) y una búsqueda de oe, ae, ue insteda de usar el carácter especial (debe agregar la búsqueda en la bala 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 intenta 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, obtiene TODAS las publicaciones en el resultado. En lugar de solo los de la taxonomía filtrada. Una simple declaración de IF resuelve el problema. Entonces, el código modificado completo 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 = 'publish')";
  return $where;
}

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";
  return $join;
}

function custom_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 || !get_search_query()) 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','custom_search_where');
add_filter('posts_join', 'custom_search_join');
add_filter('posts_groupby', 'custom_search_groupby');
    
respondido por el Asped 09.09.2013 - 00:05
3

Tengo el mismo nivel de información que en enero. Sé que también es posible extender la búsqueda con complementos.

Probablemente Search Everything (Wordpress Plugin) es lo que está buscando. De acuerdo con la lista de características, ahora admite taxonomías personalizadas.

    
respondido por el hakre 06.11.2010 - 18:17
1

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

enlace

El ejemplo de código de tkelly me funcionó al reemplazar el término author en su ejemplo con product_tag as según nuestras necesidades para los complementos del carrito.

    
respondido por el mroncetwice 08.12.2012 - 22:42
1

Encontré que la respuesta de onetrickpony es excelente, pero trata cualquier búsqueda como un solo término y tampoco tratará una frase de búsqueda entre comillas. Modifiqué su código (específicamente, la función atom_search_where ) un poco 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');
    
respondido por el Mojamba 12.11.2015 - 06:52

Lea otras preguntas en las etiquetas