На первый взгляд, похоже, ваш подход должен работать. Не могу сказать больше без дополнительной информации о вашей проблеме.
В качестве альтернативы я сделал похожую вещь в блоге, который я веду, но мне нужно было немного больше контролировать вывод. Так что я закончил свою собственную работу. Вот как я это сделал:
// Generate the subnav for a page
// Returns a list of links to child pages
// if there are no children, returns a blank list
function get_subnav($page_id)
{
$current_page = get_page($page_id);
if ($current_page->ancestors) {
$child = get_page($page_id);
$ancestor_id = $child->ancestors[0];
$page = get_page($ancestor_id);
} else {
$page = get_page($page_id);
}
$children = get_children('post_parent=' .
$page->ID . '&post_type=page&post_status=publish&order=ASC&orderby=menu_order');
if ($children) {
$html = '';
foreach ($children as $child) {
$html .= "<li><a href='" . get_page_link($page->ID) . "'>" . get_post_meta($page->ID, 'nav_name', true) . "</a></li>\n";
}
} else {
return false;
}
return $html;
}
Я называю это так: get_subnav($post->ID)
Обратите внимание, что он не будет лазать по всему дереву дочерних страниц. Если вы вызываете его с дочерней страницы, он создаст навигацию, используя своего первого предка в качестве корневого узла.