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:
"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.
// 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.