Incluir termo de taxonomia personalizada na pesquisa

31

Eu tenho duas taxonomias personalizadas aplicadas a dois tipos de post personalizado. os termos lista na barra lateral muito bem e irá listar todas as mensagens associadas a ele. No entanto, se você pesquisar um dos termos em específico, ele não exibirá um post com esse termo.

Exemplo: enlace Pesquisa pelo termo "PQRI"

Eu não recebo nada. Alguma ideia? Tentei usar vários plug-ins de pesquisa, mas eles quebraram meus parâmetros de pesquisa personalizados ou simplesmente não funcionam.

    
por Norcross 06.10.2010 / 03:06
fonte

6 respostas

35

Eu também recomendaria o plug-in Pesquisar tudo , mas se você quiser implementar isso usando a função de pesquisa do WP, aqui está o código que estou usando no meu 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');

É baseado no plug-in Tag-Search: enlace

    
por onetrickpony 15.12.2010 / 12:48
fonte
7

Esta é a busca padrão do WordPress? Porque isso não parece incluir taxonomias (nem mesmo padrão, como categorias e tags) na pesquisa. O código pesquisa em post_title e post_content , mas se você quiser incluir mais alguma coisa, deverá conectar-se ao filtro posts_search .

    
por Jan Fabry 07.10.2010 / 17:56
fonte
5

Eu tentei a solução do Onetrickpony acima enlace , o que é ótimo, mas eu encontrei um problema lá, que não funcionou para mim, e eu faria uma pequena modificação:

  1. se eu procurei por uma string no título da taxonomia - ela funciona muito bem
  2. se a taxonomia tiver caracteres especiais, por exemplo com alemão "Umlauts" (ö, ä, ü) e um procura por oe, ae, ue insteda de usar o caractere especial - você precisa adicionar a pesquisa na lesma da taxonomia - OR t.slug LIKE '%".get_search_query()."%'

  3. se você procurar uma combinação de uma consulta de pesquisa e um filtro de taxonomia - isso também funciona bem

  4. Mas o problema é que, quando você tenta usar apenas o filtro de taxonomia - o gancho de pesquisa anexa uma string vazia à consulta se nenhum texto for procurado e, por esse motivo, você obtém TODAS as postagens no resultado, em vez de apenas aqueles da taxonomia filtrada. Uma simples instrução IF resolve o problema. Então todo o código modificado seria isso (funciona perfeitamente bem para mim!)

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');
    
por Asped 09.09.2013 / 00:05
fonte
3

Eu tenho o mesmo nível de informação como Jan. Eu sei que é possível estender a pesquisa com plugins também.

Provavelmente Pesquisar tudo (Wordpress Plugin) é o que você está procurando. De acordo com a lista de recursos, agora ele suporta taxonomias personalizadas.

    
por hakre 06.11.2010 / 18:17
fonte
1

Eu tenho o mesmo problema com o plug-in do carrinho WooCommerce. Meus resultados de pesquisa não incluem o termo de taxonomia personalizada, 'product_tag', porque não é uma tag de postagem padrão. Eu encontrei uma solução neste outro thread StackOverflow sobre o assunto:

enlace

O exemplo de código de tkelly funcionou comigo ao substituir o termo author em seu exemplo por product_tag as por nossas necessidades para os plugins do carrinho.

    
por mroncetwice 08.12.2012 / 22:42
fonte
1

Eu achei a resposta do onetrickpony ótima, mas ela trata qualquer pesquisa como um único termo e também não lida com uma frase de busca entre aspas. Eu modifiquei seu código (especificamente, a função atom_search_where ) um pouco para lidar com essas duas situações. Aqui está minha versão modificada de seu 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');
    
por Mojamba 12.11.2015 / 06:52
fonte