La paginación muestra el mismo contenido en todas las páginas
Aquí está mi loop
$my_query = new WP_Query(array(
'cat' => -399, // Excluir la categoría con ID 399
'posts_per_page' => 6, // Mostrar 6 posts por página
'offset' => 5, // Saltar los primeros 5 posts
'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1 // Obtener número de página actual
));
if ( $my_query->have_posts() ) : while ( $my_query->have_posts() ) : $my_query->the_post();
$imgurl = wp_get_attachment_url( get_post_thumbnail_id($post->ID) );
$finalurl = get_stylesheet_directory_uri(). "/functions/thumb.php?w=180&h=180&a=t&src=".$imgurl;
$date = get_the_date();
$id = $post->ID;
?>
.... contenido del loop ....
<?php $finalurl = "";
endwhile;
else: ?>
<p><?php _e('Lo sentimos, no hay posts que coincidan con tus criterios.'); ?></p>
<?php endif; wp_reset_query();
$id = ""; wp_pagenavi(); // Mostrar paginación
La paginación muestra el mismo contenido en todas las páginas. Necesito tus sugerencias.

Prueba cambiando $my_query
por $wp_query
para ver si eso soluciona el problema. Descubrí que cuando renombras la consulta afecta a la paginación.
También deberías mover el reset de la consulta después de la paginación. Aquí tienes un bucle que he verificado que funciona con paginación:
$args = array(
'posts_per_page' => 10,
'post_type' => 'post',
'paged' => get_query_var( 'paged' ),
);
$wp_query = new WP_Query( $args );
while ( $wp_query->have_posts() ) : $wp_query->the_post();
get_template_part( 'templates/content', 'posts' );
endwhile;
/*
PAGINACIÓN
*/
if ( function_exists( 'page_navi' ) ) {
?>
<div id="pagination">
<?php page_navi(); ?>
</div>
<?php }
wp_reset_query(); ?>

Si usas wp_pagenavi en la página de inicio (front page), no funcionará. Necesitas cambiar el valor de current paged en la función wp_pagenavi así:
// Modifiqué el código a continuación, puedes ver la diferencia con el tuyo.
if(!empty($paged)) {
$paged = $paged;
}elseif(get_query_var( 'paged')) {
$paged = get_query_var('paged');
}elseif(get_query_var( 'page')) {
$paged = get_query_var('page');
}else {
$paged = 1;
}

Aquí hay una mejora a la respuesta de @Devin-Walker. Esto es específicamente para archive.php pero puede adaptarse para otros loops.
También utiliza los enlaces de navegación nativos de WordPress en lugar de page_navi().
Espero que esto ayude a alguien.
<?php
/**
* Página de Archivo
*
* @Desde 1.0
*/
// Salir si se accede directamente
if ( !defined('ABSPATH')) exit;
?>
<?php get_header(); ?>
<div class="container">
<div class="row">
<?php
// Nota - Configurar el número de posts por página en WP-Admin > Ajustes > Lectura > 'Las páginas de blog muestran como máximo'
$args = array(
'post_type' => 'post',
'paged' => get_query_var('paged'),
'cat' => get_query_var('cat'),
);
$wp_query = new WP_Query( $args );
while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<div class="col-md-4 post-card archive my-4">
<div class="text-center">
<a href="<?php the_permalink(); ?>"><img src="<?php echo the_post_thumbnail_url('card-size'); ?>" alt="<?php the_title(); ?>" title="<?php the_title(); ?>"></a>
</div>
<div class="post-card-details archive-post-details px-4 pb-2">
<h3 class="post-card-category px-4 py-2"><?php single_cat_title(); ?></h3>
<h3 class="post-card-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p class="post-card-p"><?php echo apply_filters( 'the_content', wp_trim_words( strip_tags( get_post_field('post_content') ), 15 ) ); ?></p>
</div>
</div>
<?php endwhile; ?>
</div>
<!-- Navegación -->
<div class="tablet-pill tablet-pill-purple mb-5"><?php previous_posts_link( 'Página Anterior' ); ?> <?php if(get_previous_posts_link() && get_next_posts_link()) echo ' - '; ?> <?php next_posts_link( 'Página Siguiente' ); ?></div>
<?php wp_reset_query(); ?>
</div>
<?php get_footer();

Sé que esto fue hace años, pero traigo otra solución para cualquiera que esté experimentando un error similar. En mi caso, estaba usando un offset de 0, así que eliminé el offset de los argumentos de la consulta, lo cual estaba causando el problema. Espero que esto ayude a alguien más:
Antes
$query_args_pagination = array(
'post_type' => $post_type_pagination,
// 'posts_per_page' => $countPPP,
'post_status' => 'publish',
'order' => 'ASC',
'orderby' => 'date',
'posts_per_page' => '12',
'offset' => '0',
'paged' => $paged_pagination,
// 'page' => $paged_pagination,
// 'orderby' => 'date',
'tax_query' => array(
array(
'taxonomy' => $taxonomy_pagination,
'field' => 'slug',
'terms' => $categoria_pagination,
)
)
);
Después
$query_args_pagination = array(
'post_type' => $post_type_pagination,
// 'posts_per_page' => $countPPP,
'post_status' => 'publish',
'order' => 'ASC',
'orderby' => 'date',
'posts_per_page' => '12',
// 'offset' => '0',
'paged' => $paged_pagination,
// 'page' => $paged_pagination,
// 'orderby' => 'date',
'tax_query' => array(
array(
'taxonomy' => $taxonomy_pagination,
'field' => 'slug',
'terms' => $categoria_pagination,
)
)
);
