Потому, что у вас в коде происходит обход только по текущему уровню каталога $dir.
Чтобы обход заныривал глубже, нужно создать рекурсивную функцию.
Телом рекурсивной функции у вас будет:
if ($dh = opendir($dir))
{
// код, который у вас в вопросе
}
А точка вызова для смены подкаталога:
if (is_file($dir.$file)) {
// код из вопроса
}
else if(is_dir($dir.$file))
{
$zip->addEmptyDir($dir.$file);
// тут должен быть вызов рекурсивной функции, по которой вы передаете контекст $zip и $dir.$file (наверное, передача по ссылке)
}
В этом случае у вас будет рекурсивный обход каталогов в глубину.
PS: Проконтролируйте дескриптор $zip на больших вложенностях и большим содержании файлов, нет ли переполнения выделенной оперативной памяти. Еще стек вызовов функций не бесконечный, тоже проконтролируйте глубину вызова.
PPS: Бэкапить сайты в архив делается одной строчкой линуксовой командой, и засовывается в crontab. Будет работать надежнее. Эта не задачка для php-разработчика.
То, что вы делаете - это просто тренировка на кошках, как работать с ZipArchive в PHP.