dynamically limit depth of wp_list_pages

This is a little tricky, and my solution may not be the best for the performance. You may add this Value as a Custom Field to the Page, so you do not have to query it everytime.

// get the ancestors of the page, and check if the page is toplevel
$parent = array_reverse( get_post_ancestors( $post->ID ) );
if ( isset( $parent[0] ) ) {
    $toplevel = $parent[0];
} else {
    $toplevel = $post->ID;
}

// get the children of this toplevelpage
$children = get_page_hierarchy( get_pages(), $toplevel );
$depth = 0;
foreach ( $children as $child => $slug ) {

    // check how many ancestors this page has
    $count = count( get_ancestors( $child, 'page' ) );
    // if more than the current depth, set the depth to the new value
    if ( $count > $depth ) {
        $depth = $count;
    }

}
echo $depth; //total depth below this toplevelpage, you can delete this part afterwards

$depth_without_last = $depth - 1;

Just insert the varible instead of the 0 at the depth in your $args, this should work 🙂