Tener un número diferente de publicaciones en la primera página

11

Necesito tener una cantidad diferente de publicaciones por página en la primera página que en las otras páginas.

Por ejemplo, esto es lo que necesito.

  • Total de mensajes: 6
  • Primera página: mostrando 3 publicaciones
  • Página siguiente: muestra 2 publicaciones por página

Aquí está mi código:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

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, // remove sticky post
    '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);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

En la primera página del archivo, este código supone:

Bueno, 6 publicaciones en total y 3 publicaciones por página. Necesito 2 páginas de archivo y la paginación que les presento es:

[1] [2]

Sin embargo, en cualquier otra página del archivo, el código supone:

Bueno, 6 publicaciones en total y 2 publicaciones por página. Necesito 3 páginas de archivo y la paginación que les presento es:

[1] [2] [3]

Necesito un poco de ayuda para arreglar esto.

norixxx
fuente
Si tan solo pudiera decirle a WP_pagenavi cuántas publicaciones en la primera página y el resto ...
norixxx
¿Por qué exactamente necesitas hacerlo de esta manera? Cualquier razón en particular
Pieter Goosen
Solo el egoísmo de mi cliente. En realidad no me importa si uso wp_pagenavi o no. ¿Alguna otra técnica que pueda usar?
norixxx
2
En primer lugar 'caller_ get_ posts'contiene espacios y no es válido. En segundo lugar, está en desuso. Usar en su ignore_sticky_postslugar.
kaiser
Su página de inicio, ¿es una página de inicio normal o está configurada como portada?
Pieter Goosen

Respuestas:

21

EDITAR - RESPUESTA REVISADA

He estado trabajando en otra solución que en realidad es mejor la respuesta original. Esto no implica ninguna consulta personalizada y creo que, a todos los efectos, mi respuesta original puede descartarse pero conservarse con fines informativos

Todavía creo que estás en la página de inicio y también trataré esto como tal. Esta es mi nueva solución.

PASO 1

Elimine la consulta personalizada de la página de inicio y reemplácela con el bucle predeterminado

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

PASO 2

Use pre_get_postspara modificar la consulta principal para agregar su taxonomía personalizada a la consulta principal para mostrar en la página de inicio.

PASO 3

Ahora, obtenga la posts_per_pageopción establecida desde el back-end (que supongo que es 2) y también configure la offsetque vamos a usar. Eso será 1porque necesitarás 3 publicaciones en la página uno y 2 en el resto

$ppg = get_option('posts_per_page');
$offset = 1;

ETAPA 4

En la página uno, deberá agregar el offsetpara posts_per_pageagregar hasta 3 para obtener sus tres publicaciones en la página uno.

$query->set('posts_per_page', $offset + $ppp);

PASO 5

Debe aplicar su offseta todas las páginas posteriores, de lo contrario obtendrá una repetición de la última publicación de la página en la página siguiente

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

PASO 6

Por último, debe restar su desplazamiento de lo found_postscontrario, su paginación en la última página será incorrecta y le dará un 404error ya que faltará la última publicación debido al recuento incorrecto de publicaciones

NOTA: Este código rompió la paginación en la página de búsqueda. Esto ya está arreglado, vea 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 );

TODOS JUNTOS

Así es como se verá su consulta completa que debería ir a 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 );
Pieter Goosen
fuente
3

Sé que esto es de hace 1000 años, pero otra solución para cualquiera que esté buscando esta solución mientras usa una consulta personalizada, aquí es 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 la matriz use esto:

'posts_per_page' => $limit,

Ahora estás listo para irte.

Kiel Fleming
fuente
2
Esto no funcionara. Con esto, tendrá la publicación # 10 que se mostrará dos veces. Dado que al ir a la segunda página, "pensará" que la primera página también tenía 9 publicaciones mostradas y, por lo tanto, comenzará a mostrar la publicación n.º 10, aunque ya se mostró en la primera página.
leymannx