Не знаю, актуален ли вопрос, но приведу свои соображения.
get_header и компанию можно убрать, поместить в модальное окно цикл из single.php, но ведь функции в модальном окне php'шные, а значит уже инициировали запрос и загрузили.. что? верно, последнюю добавленную запись (блог ведь).
Тут проблема в том, что пермалинк инициирует запрос к БД и перезагружает страницу, так как php выполняется на стороне сервера. Можно было бы воспользовать AJAX и перезагрузить только информацию в модальном окне, но тут возникает еще один вопрос, как вызвать модальное окно и при этом инициировать локальную перезагрузку, конкретной записи? и как функция узнает какую запись нужно запросить у БД? причем, без пермалинка, иначе он перезагрузит страницу
Модальное окно могло бы хорошо выводить цикл ленты записей, the_content'у можно приказать выводить весь текст, тогда загрузится некоторое количество записей, через AJAX указать добавление старых записей через load_more при некотором событии. Тут может помочь скрипт слайдеров, чтобы прятать другие записи из ленты и фокусировать на одной единственной, это создаст иллюзию перехода, но это будет не цикл одиночной записи, а цикл ленты.
Право же, можно сымитировать модальное окно якобы "без перезагрузки страницы", но перезагрузка ведь будет. После перезагрузки, запись будет выведена в "модальном окне", а сзади будет видно и меню, и прокрутка фона body, и удалять get'ы не нужно, только закрыть, выводимые ими блоки, z-index присвоить полупрозрачному блоку, затемняющему сайт, а ещё обязательно добавить к клику на затемняющий фон и кнопке закрыть переход обратно к странице с которой перешёл пользователь на single.php. То есть пользователь кликает на permalink тот его отправляет на сингл с полноценной перезагрузкой, но сингл оформлен так будто ты попал туда без перезагрузки, а при клике на закрыть он отправляет пользователя обратно. Бредовая идея, конечно, но вдруг. Вот пример:
https://rocketbank.ru/ кликнуть "на попробовать сейчас"