а как они будут меняться, если вы каждый раз делаете выборку по одной и той же странице?
раз уж вы делаете кастомный запрос, то вот сюда
$query = new WP_Query( 'cat=2&posts_per_page=3' );
нужно передавать текущую страницу
но вообще все сделано неправильно. правильнее было повесить фильтр на pre_get_posts и там выводить нужное количество постов в категориях.
как сейчас у вас делается несколько лишних запросов на этой странице и паджинация будет работать не корректно.
допустим, у вас 100 постов в этой категории, в настройках сайта указано выводить по 10 (всего 10 страниц в архиве этой категории). вот этим кодом вы ожидаете, что будет выводится по 3 и в архиве категории должно получиться 34 страницы. но если попробуете открыть страницу /page/25, то оно выдаст ошибку