Incluir termo de taxonomia personalizado na pesquisa

33

Eu tenho duas taxonomias personalizadas aplicadas a dois tipos de postagem personalizados. a lista de termos na barra lateral é ótima e lista todas as postagens associadas a ela. No entanto, se você pesquisar um dos termos em específico, ele não exibirá uma postagem com esse termo.

Exemplo: http://dev.andrewnorcross.com/das/all-case-studies/ Procure pelo termo "PQRI"

Eu não recebo nada. Alguma ideia? Eu tentei usar vários plugins de pesquisa, mas eles quebram meus parâmetros de pesquisa personalizados ou simplesmente não funcionam.

Norcross
fonte
Nocross, você pode adicionar algum feedback à resposta proposta por Jan? Você provavelmente está procurando um plugin que faça o trabalho?
hakre
Acabei desistindo do plano. Desde que eu criei três funções de pesquisa separadas (com base em diferentes necessidades em determinadas áreas), todos os plugins que testei os quebraram. No final, eu disse ao cliente para incluir termos no conteúdo, se eles quisessem que fosse pesquisável.
Norcross

Respostas:

36

Eu recomendaria o plug-in Search Everything também, 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: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

onetrickpony
fonte
1
Isso é ótimo - como esse código pode ser modificado para excluir uma matriz de IDs de taxonomia da pesquisa?
HandiworkNYC.com
Note-se que os retornos de chamada de filtro para esses ganchos aceitam 2 argumentos; o segundo para todos eles sendo a instância WP_Query que é passada por referência. Quaisquer verificações is_search()ou outras chamadas do método WP_Query ( is_search() is_home()etc.) devem sempre ser chamadas diretamente na instância de consulta (por exemplo, $query->is_search()assumindo que o nome da variável de instância esteja $queryna assinatura de retorno de chamada), em vez da função de modelo que sempre se refere à consulta principal , não a consulta para a qual o filtro está sendo executado.
Evan Mattson
4
Além disso, provavelmente não é uma boa idéia para injetar a matéria-string de busca publicamente disponíveis diretamente em uma consulta SQL ... leitura recomendada
Evan Mattson
Eu gostaria apenas de acrescentar que esta tem um conflito com WPML porque WPML usos tos já 'T' em se juntar a parte, portanto, usando algo personalizado em vez de tr, tt e t corrige esse problema
Bobz
7

Essa é a pesquisa 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 post_titlee post_content, mas, se você deseja incluir mais alguma coisa, deve conectar-se ao posts_searchfiltro.

Jan Fabry
fonte
5

Tentei a solução do Onetrickpony acima https://wordpress.stackexchange.com/a/5404/37612 , o que é ótimo, mas encontrei um problema lá, que não funcionou para mim, e eu faria uma pequena modificação:

  1. se eu procurasse uma string no título da taxonomia - funciona muito bem
  2. se a taxonomia tiver caracteres especiais, por exemplo, com "Umlauts" em alemão (ö, ä, ü) e uma pesquisa por oe, ae, ue insteda de usar o caractere especial - você precisará 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 pesquisado e, por esse motivo, você obtém TODAS as postagens no resultado, em vez de apenas as do taxonomia filtrada. Uma simples instrução IF resolve o problema. Portanto, todo o código modificado seria este (funciona perfeitamente para mim!)

função 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') ";
  retornar $ onde;
}

função 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 ";
  retornar $ join;
}

função custom_search_groupby ($ groupby) {
  global $ wpdb;

  // precisamos agrupar no código da postagem
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) retorna $ groupby;

  // groupby estava vazio, use o nosso
  if (! strlen (trim ($ groupby))) retorna $ groupby_id;

  // não estava vazio, acrescente o nosso
  retorne $ 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
fonte
3

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

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

hakre
fonte
+1 para o plug-in Pesquisar tudo. Funciona como esperado e retorna mais resultados do que a pesquisa padrão do Wordpress.
PNMG
2

Achei a resposta do onetrickpony ótima, mas trata qualquer pesquisa como um único termo e também não lida com uma frase de pesquisa entre aspas. Eu modifiquei seu código (especificamente, a atom_search_wherefunção) 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');
Mojamba
fonte
1

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

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

O exemplo de código de tkelly funcionou para mim ao substituir o termo authorem seu exemplo product_tagpor nossas necessidades de plug-ins de carrinho.

mroncetwice
fonte