Mostrar diferente cantidad de posts en la primera página
Necesito mostrar una cantidad diferente de posts por página en la primera página que en las demás páginas.
Por ejemplo, esto es lo que necesito:
- Total de posts: 6
- Primera página: mostrar 3 posts
- Páginas siguientes: mostrar 2 posts por página
Aquí está mi código:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$fp_limit = 3; // límite para la primera página
$limit = 2; // límite para las páginas siguientes
$offset = 0; // desplazamiento por defecto
if( $paged == 1 ) {
$limit = $fp_limit;
} else {
$offset = $fp_limit + ( ($paged - 2) * $limit );
}
$args = array(
'post_type' => 'my_post_type',
'post_status' => 'publish',
'offset' => $offset,
'posts_per_page' => $limit,
'caller_get_posts' => -1, // eliminar posts sticky
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
)
);
$my_query = null;
$my_query = new WP_Query($args);
// bucle básico
if( $my_query->have_posts() ) :
while ($my_query->have_posts()) : $my_query->the_post();
...
endwhile; endif; // fin del bucle de archivo
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }
wp_reset_query();
En la primera página del archivo, este código asume:
Bien, 6 posts en total y 3 posts por página. Así que necesito 2 páginas de archivo y la paginación que muestro es:
[1] [2]
Sin embargo, en cualquier otra página del archivo el código asume:
Bien, 6 posts en total y 2 posts por página. Así que necesito 3 páginas de archivo y la paginación que muestro es:
[1] [2] [3]
Necesito un poco de ayuda para solucionar esto.

EDITADO - RESPUESTA REVISADA
He estado trabajando en otra solución que en realidad es mejor que la respuesta original. Esto no involucra ninguna consulta personalizada y creo que para todos los propósitos mi respuesta original puede descartarse pero se mantiene con fines informativos
Sigo creyendo que estás en la página de inicio y también trataré esto como tal. Así que esta es mi nueva solución
PASO 1
Elimina la consulta personalizada de la página de inicio y reemplázala con el bucle predeterminado
<?php
if ( have_posts() ) :
// Inicia el Bucle.
while ( have_posts() ) : the_post();
///<---TU BUCLE--->
endwhile;
//<---TU PAGINACIÓN--->
else :
//NO SE ENCONTRARON PUBLICACIONES O ALGO
endif;
?>
PASO 2
Usa pre_get_posts
para alterar la consulta principal y agregar tu taxonomía personalizada a la consulta principal para mostrar en la página de inicio.
PASO 3
Ahora, obtén la opción posts_per_page
configurada desde el backend (que asumo es 2) y también establece tu offset
que vamos a usar. Eso será 1
ya que necesitarás 3 publicaciones en la primera página y 2 en el resto
$ppg = get_option('posts_per_page');
$offset = 1;
PASO 4
En la primera página, necesitarás agregar el offset
a posts_per_page
que sumará 3 para obtener tus tres publicaciones en la primera página.
$query->set('posts_per_page', $offset + $ppp);
PASO 5
Debes aplicar tu offset
a todas las páginas siguientes, de lo contrario obtendrás una repetición de la última publicación de la página en la siguiente página
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
PASO 6
Por último, necesitas restar tu offset de found_posts
de lo contrario tu paginación en la última página será incorrecta y te dará un error 404
ya que faltará la última publicación debido al conteo incorrecto de publicaciones
NOTA: Este fragmento de código rompió la paginación en la página de búsqueda. Esto ahora está corregido, mira el código actualizado
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
TODO JUNTO
Así es como se verá tu consulta completa que debería ir en functions.php
function tax_and_offset_homepage( $query ) {
if ($query->is_home() && $query->is_main_query() && !is_admin()) {
$query->set( 'post_type', 'my_post_type' );
$query->set( 'post_status', 'publish' );
$query->set( 'ignore_sticky_posts', '-1' );
$tax_query = array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
);
$query->set( 'tax_query', $tax_query );
$ppp = get_option('posts_per_page');
$offset = 1;
if (!$query->is_paged()) {
$query->set('posts_per_page',$offset + $ppp);
} else {
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
}
}
}
add_action('pre_get_posts','tax_and_offset_homepage');
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

Sé que esto es de hace mil años, pero otra solución para cualquiera que esté buscando esta solución mientras usa una consulta personalizada, aquí está cómo hacerlo. En este ejemplo, la primera página necesitaba 10 publicaciones y cada página posterior necesita 9.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
$limit = 10;
} else {
$limit = 9;
}
y luego en el array usa esto:
'posts_per_page' => $limit,
Ahora estás listo para continuar.

Esto no funcionará. Con esto, harás que la publicación #10 se muestre dos veces. Ya que al pasar a la segunda página "pensará" que la primera página también mostró 9 publicaciones y por lo tanto comenzará a mostrar la publicación #10 aunque ya se mostró en la primera página.

Kiel estaba muy cerca. Necesitaba 3 artículos en la página principal, 12 en las páginas siguientes, esto es donde terminé:
<?php
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$current_cat = get_category($cat);
$limit = 12; // Establecer el límite de artículos en todas las páginas excepto la primera
$offset = 3; // Establecer esto al número de artículos en la primera página
if( $paged == 1 ) {
$offset = 0; // Sin desplazamiento en la primera página
$limit = 3; // Número de artículos en la portada
} else {
$offset = (($paged - 2) * $limit) + $offset; // La magia ocurre aquí
}
$args = array(
'post_type' => 'post',
'category_name' => $current_cat->slug,
'paged' => $paged,
'offset' => $offset,
'posts_per_page' => $limit,
'orderby' => 'date',
'order' => 'DESC',
);
?>
