script88,
на первый взгляд схема решения проста и такова:
1. В макет(ы) добавляем условия, что если не AJAX-запрос, то выводим header и footer.
2. вывод центральной области перехватываем в буфер через ob_start() и ob_get_clean(), и проверяем, если AJAX-запрос, то даем соответствующий ответ, иначе просто выводим информацию.
3. Пишем клиентский JS, который будет запрашивать определенные страницы.
Первый камень:
Если меню реагирует на позицию страницы (например пункты там делаются жирным и т.п.) и меню в макете - естественно, что оно не будет меняться. Необходмо либо отдельно грузить меню, либо на JS делать зависимости.