Podemos excluir os pais de nível superior filtrando-os usando o filtro terms_clauses
para alterar a consulta SQL antes de ser executada. Dessa forma, não precisamos pular os pais no loop foreach
final, pois eles não estão na matriz de termos retornada, isso nos poupa trabalho e codificação desnecessários
Você pode tentar o seguinte:
add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args )
{
// Check if our custom arguments is set and set to 1, if not bail
if ( !isset( $args['wpse_exclude_top'] )
|| 1 !== $args['wpse_exclude_top']
)
return $pieces;
// Everything checks out, lets remove parents
$pieces['where'] .= ' AND tt.parent > 0';
return $pieces;
}, 10, 3 );
Para excluir pais de nível superior, agora podemos passar 'wpse_exclude_top' => 1
com nossa matriz de argumentos. O novo parâmetro wpse_exclude_top
é suportado pelo filtro acima
$terms = get_terms( 'category', ['wpse_exclude_top' => 1] );
if ( $terms
&& !is_wp_error( $terms )
) {
echo '<ul>';
foreach ($terms as $term) {
echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';
}
Apenas uma observação, get_term_link()
não aceite o nome do termo, somente, slug, ID ou o termo completo objeto. Para performance, sempre sempre passe o termo objeto para get_term_link()
se o termo objeto estiver disponível ( como neste caso )