Обычно это делается с использованием AJAX (а, следовательно, с помощью JS, jQuery и т.д.)
Ваш скрипт, ответственный за выдачу результата, должен уметь отдавать сырые данные (или уже целиком отрисованный блок) исходя из переданного ему номера страницы.
Как только Вы нажимаете кнопку "показать дальше", ваш Ajax обращается к вашему бэкэнду - передает номер пагинации, далее получает либо сухие данные и рендерит их в блок в DOM, либо получает уже отрендеренный бэкэндом блок и вставляет его в соответствующий блок в DOM. Соответственно, новый блок данных появляется у Вас на сайте.
Другой вариант - это получить от бэкэнда сразу много-много отрендеренных данных, распределить их по блокам, и все блоки, кроме первого, скрыть (display: none). Тогда по нажатию кнопки будет открываться блок за блоком. Это менее "кашерно", т.к., во-первых, передаются данные, которые могут и не понадобится. А во-вторых (при очень большом объеме данных), придется их ограничивать, а пользователь может захотеть бОльшего.