Uma tarefa comum para um programador é exibir um elemento (ex: um banner publicitário) apenas se o post pertencer a uma categoria ou taxonomia específica (ex: ‘Género de Filme: Comédia’).
No WordPress, temos duas funções principais para isto que são frequentemente confundidas: is_tax() e has_term(). A diferença entre elas é crucial para a lógica do seu tema.
1. Is_tax() vs has_term() – Qual é a diferença?
Is_tax() – Contexto da página (arquivo)
Use isto para verificar que página o utilizador está a ver.
- O utilizador está atualmente na página de arquivo da categoria “Terror”?
if ( is_tax( 'genero', 'terror' ) ) {
echo 'Você está na lista de terror!';
}
Esta função retornará false se estiver numa página de Post Único (Single Post), mesmo que esse post seja, de facto, um filme de terror!
Has_term() – Contexto do post (single)
Use isto para verificar o que está atribuído a um post específico.
- Este filme específico é de “Terror”?
if ( has_term( 'terror', 'genero' ) ) {
echo 'Este post é um filme de terror.';
}
Esta função é mais frequentemente usada dentro do The Loop ou no ficheiro single.php.
2. O problema da hierarquia (pais e filhos)
O maior desafio é que has_term() verifica apenas exatamente o termo que especificar.
Assuma esta estrutura:
- Filmes (Taxonomia:
movie_genre)- Comédia (ID: 10)
- Romântica (ID: 11)
- Comédia Negra (ID: 12)
- Comédia (ID: 10)
Se tiver um post atribuído APENAS a “Romântica”, a verificação:
has_term( 'comedia', 'movie_genre' )
retornará FALSE. Porquê? Porque o post tecnicamente não tem a caixa de seleção “Comédia” marcada, apenas “Romântica”.
Solução: Função auxiliar para descendentes
Para verificar se um post pertence à categoria “Comédia” OU a qualquer uma das suas subcategorias, precisamos de escrever a nossa própria função auxiliar.
/**
* Verifica se um post pertence a um termo ou aos seus filhos.
*/
function wppoland_in_term_tree( $term_id_or_slug, $taxonomy, $post_id = null ) {
$post_id = $post_id ? $post_id : get_the_ID();
$term = get_term_by( is_numeric($term_id_or_slug) ? 'id' : 'slug', $term_id_or_slug, $taxonomy );
if ( ! $term ) {
return false;
}
// 1. Verificar atribuição direta (mais rápido)
if ( has_term( $term->term_id, $taxonomy, $post_id ) ) {
return true;
}
// 2. Obter todos os filhos do termo
$children = get_term_children( $term->term_id, $taxonomy );
if ( is_wp_error( $children ) || empty( $children ) ) {
return false;
}
// 3. Verificar se o post tem algum dos filhos
return has_term( $children, $taxonomy, $post_id );
}
Uso:
// No single.php
if ( wppoland_in_term_tree( 'comedia', 'movie_genre' ) ) {
get_template_part( 'partials/banner-comedy' );
}
3. Otimização de performance
A função get_term_children() executa uma consulta à base de dados. Se usar isto num loop que exibe 50 posts, está a fazer 50 consultas SQL extra.
Uma otimização importante é passar o ID em vez do Slug. O WordPress tem de procurar o ID a partir do Slug de qualquer forma, por isso fornecer o ID (ex: 10) poupa uma consulta de pesquisa.
// Mais rápido (ID)
has_term( 10, 'movie_genre' );
// Mais lento (Slug -> requer pesquisa)
has_term( 'comedia', 'movie_genre' );
Resumo
- Use
is_tax()apenas para verificar se está numa página de arquivo. - Use
has_term()para verificar logicamente posts individuais. - Lembre-se que
has_termnão herda – se precisar de lógica “categoria e filhos”, use uma função auxiliar personalizada.

