Почему то он выводит только первый уровень вложенности, а мне надо все 3 уровня которые вложены в id 4…
Вам здесь не только знание php требуется, но еще и знание SQL. Если вы указываете parent=>4, это уже получается $where[«parent»] = $parent; (см. код).
Плюс к этому вы еще указываете 'template' => 5.
В итоге у вас получается
'where' => [ 'parent' => 4, 'template' => 5 ],
То есть в вашу выборку могут попасть только те документы, которые являются непосредственно дочерними для документа с id 4, а так же у которых шаблон 5. К этому еще не забываем про автоматически добавленные условия Опубликован, Не удален, Не скрыт из меню.
Резюмирую: если вы явно указываете раздел, то будут получены документы только этого раздела.
А если вы хотите получить все документы во всех вложенных разделах, то эта задача весьма не простая, и требует правильной организации каталога, чтобы можно было попроще это выполнить. Есть два пути:
1. Все целевые документы должны иметь какой-то уникальный признак, который бы позволил сделать выборку без учета вложенности. К примеру, иметь какой-то свой особенный шаблон или типа того.
2. Если не сделано как в первом пункте, то придется выполнять перебор всех необходимых уровней и выбирать оттуда нужные документы. В качестве примера можете изучить процессор, который получает товары из определенного раздела. Он сначала перебором делает выборку всех дочерних разделов, а потом получает конечную выборку товаров, для которых указанные разделы являются родительскими.