get_term_children() возвращает все дочерние разделы элемента таксономии.
а term_is_ancestor_of() проверяет является ли второй термин дочерним к первому (проверяются все уровни вложенности).
Нужно получить только дочек первого уровня, а у меня выводятся все
$prodcat = get_terms('product_cat', 'orderby=name&hide_empty=0&parent=0&hierarchical=0');// получим все верхние или с parent
foreach ($prodcat as $childcat) {//пройдём по верхним
$termID = $childcat->term_id; // id верхних
$taxonomyName = "product_cat";
$termchildren = get_term_children( $termID, $taxonomyName );// только id дочерних в массиве всех уровней а нужен только первый
echo $childcat->name;
echo ' - id ';
echo $childcat->term_id;
echo '<ul>';
foreach ($termchildren as $child) {
$term = get_term_by( 'id', $child, $taxonomyName );
echo '<li><a href="' . get_term_link( $term->term_id, $term->taxonomy ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';
}
Должно получиться так:
категория 1
подкатегория 1
подкатегория 2
подкатегория подкатегории 2 // этого не должно выводиться
...
категория n
подкатегория 1
подкатегория 2
...