Mostrar diferente cantidad de posts en la primera página

25 jul 2014, 12:40:37
Vistas: 15.2K
Votos: 16

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.

7
Comentarios

Si tan solo pudiera decirle a WP_pagenavi cuántas publicaciones mostrar en la primera página y en el resto...

norixxx norixxx
25 jul 2014 12:59:43

¿Por qué exactamente necesitas hacerlo de esta manera? ¿Algún motivo en particular?

Pieter Goosen Pieter Goosen
25 jul 2014 13:06:32

Es solo el capricho de mi cliente. En realidad no me importa si uso wp_pagenavi o no. ¿Hay alguna otra técnica que pueda usar?

norixxx norixxx
25 jul 2014 13:12:53

En primer lugar, 'caller_ get_ posts' contiene espacios y no es válido. En segundo lugar, está obsoleto. Usa ignore_sticky_posts en su lugar.

kaiser kaiser
25 jul 2014 15:22:21

Tu página de inicio, ¿es una página de inicio normal o está configurada como página frontal

Pieter Goosen Pieter Goosen
25 jul 2014 15:48:46

No sabía que caller_get_posts estaba obsoleto...

norixxx norixxx
26 jul 2014 02:50:10

Deberías establecer debug en true durante el desarrollo. El modo debug te habría mostrado esto

Pieter Goosen Pieter Goosen
26 jul 2014 07:45:14
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 3
1
25

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 );
25 jul 2014 17:11:06
Comentarios

Otra forma es evitar usar offset y utilizar 'post__not_in' excluyendo el primer post de las consultas en páginas !== 0.

Luca Reghellin Luca Reghellin
4 dic 2020 19:10:32
1

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.

21 feb 2018 12:57:39
Comentarios

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.

norman.lol norman.lol
9 may 2019 09:24:56
0

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',
);
?>
12 abr 2022 21:38:00