Во-первых, переменная $i вам не нужна, у объекта WP_Query есть свойство
$query->current_post.
Во-вторых, не нужно делать каждый раз wp_reset_postdata() и продолжать цикл, достаточного одного стандартного цикла while( have_posts() ), а внутри if.
В третьих, у вас в целом разметка одинаковая, отличаются только классы / стили. Поэтому вашу задачу в принципе можно решить чисто на CSS. Но если все же хотите задействовать PHP, то будет что-то типа такого:
$arguments = [
'posts_per_page' => 5
];
$query = new WP_Query( $arguments ); ?>
<div class="row">
<?php
// Обычный WordPress Loop:
while ( $query->have_posts() ) : $query->the_post();
// Можно ограничиться одним кастомным классом с индексом:
echo "<div class=\"custom-post-style-{$query->current_post}\">";
...
endwhile; ?>
</div>