Buscando termos de taxonomias relacionados ao post type

Recentemente em um dos projetos para um cliente, foi me solicitado que criasse um algoritmo para listar todos os termos de um post-type específico. Assim eu teria um filtro de um formulário populando com os termos e taxonomias exatas.

Seria algo simples de fazer usando a função get_terms padrão do wordpress. No entanto, no meu projeto possui diversos post_types definidos e diversas taxonomias. E então como eu listaria todos os termos relacionados a determinada taxonomia de um post_type específico?

Fica complexo até de explicar o motivo do get_termos não ser suficiente útil para este proposito.

O [get_terms] relaciona termos de uma determinada taxonomia, mas não é capaz (pelo menos por enquanto e nos testes que fiz) de relacionar a um post type específico também, isso considerando que ambas taxonomias sejam usadas/ligadas/relacionadas em ambos post_types.

Foi então necessário que eu criasse uma função de relacionamento entre o post type e o terms.

Antes, para entender melhor o porque da função, irei explicar uma situação como exemplo:

Tenho 2 post_type chamados: Veiculo e Translado;
Agora eu tenho 2 taxonomias que estão ligadas ao Veiculo e ao translado: Carros e Moto;
E digamos que eu tenha 3 termos ligados a taxonomia Carros: corolla, celta, astra;

Com nossa informação definida, sabemos que temos que relacionar taxonomia, termos e o post type, desta forma, teremos o seguinte algoritmo:

 $query = $wpdb->prepare(

                          "SELECT DISTINCT t.name,t.slug from $wpdb->terms AS t
                          INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
                          INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
                          INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id
                          WHERE p.post_type IN($post_types) AND tt.taxonomy='$nome_da_taxonomia'"

                        );

                      $results = $wpdb->get_results( $query );

Os campos que serão atualizados neste caso, são na linha do WHERE, com a variável do $post_type e com a $nome_da_taxonomia.

É importante saber diferenciar taxonomia de termos na hora de programar e montar seu loop. Com o get_terms ele não sabe associar um termo a um post_type, buscando assim todos os termos da taxonomia que você estipular. Limitando então o seu loop.

De maneira geral, eu criei e disponibilizo abaixo um algoritmo necessário para que nosso loop traga todos os termos que estiverem apenas no post_type que você definir. Fazendo assim um filtro mais completo do seu loop. Esta é a parte completa do código que listei acima também.

  global $post, $wpdb; // inicia as funções globais


 // abaixo a função get_terms que traz todos os termos de uma determinada taxonomia, mas não filtra por post_type! (Postei como exemplo, mas não é usada no que precisamos)

  $terms = get_terms(
    $nome_da_Taxonomia , array( 'hide_empty' => 1, 'parent' => 0)
);
 
// Abaixo um pequeno loop com um select que criei

               //START select
               $select = '
       
                 <select name="'
.$nome_da_taxonomia.'">';

                 //default valor
                 $select .= '<option value="">'. $nome_da_taxonomia .'</option>';

                 
// Aqui começa uma exceção, se não tiver post_type selecionado na variável que coloquei a cima imprimirá o termos da taxonomia específica

                 if ($post_types == "" || $post_types == null) {

                   $results = get_terms($nome_da_taxonomia , array('parent' => 0,'hide_empty' => 0));

                 } else {


// Caso tenha post_type definido, mostra o algoritmo para filtrar e relacionar o termo ao post_type e Taxonomia

// Então aqui começa a nossa brincadeira:

                      $query = $wpdb->prepare(

                          "SELECT DISTINCT t.name,t.slug from $wpdb->terms AS t
                          INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
                          INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
                          INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id
                          WHERE p.post_type IN($post_types) AND tt.taxonomy='$nome_da_taxonomia'"

                        );


                      $results = $wpdb->get_results( $query );
                 

}


// Feito isso, é só montar o loop com a variavel results
               
                 foreach ($results as $term) {

                 $select .= '<option '.$selected.' value="' . $term->slug . '">' . $term->name . '</option>';


                     }


               $select .= '</select></div>';

Lembrando que este é apenas um exemplo, o código em si que foi necessário para que funcione o meu filtro, e a requisição/select é feita no nosso banco de dados, nele relacionamos as taxonomias ao post_types e aos termos. Você pode usar essa função como quiser para apresentar o resultado, mas tornou-se simples e funcional, no meu projeto deu certo, talvez em alguma situação seja útil para você também.

Qualquer dúvida comente o post pelo site ou acompanhe o dev pelas redes sociais ou até mesmo meu perfil no twitter, que está abaixo.

Espero ter ajudado.

 

 

About Rubens Junior 18 Articles
Programador Sênior na empresa Hositec, Front-end e Backend; Conhecimento em: Java, PHP, Android, Mysql, HTML, CSS, SASS, LESS, Type Script, Jquery, Webservice, JavaScript... e eterno estudante de outras linguagens também.