WordPress, muestra más publicaciones en una subpágina

3 minutos de lectura

quiero mostrar más publicaciones en mis subpáginas

Mi código en las funciones.php

function number_of_posts($query)
{
    if($query->is_main_query())
    {
       $paged = $query->get( 'paged' );
       if ( ! $paged || $paged < 2 ) 
       {

       } 
       else 
       {
           $query->set('posts_per_page', 24);
       }
    }
    return $query;
}
add_filter('pre_get_posts', 'number_of_posts');

Problema:
En la primera página obtengo una paginación incorrecta. Muestra un enlace a la subpágina 4 pero una subpágina 4 no sale.

Creo que debo agregar algo como esto.

....
if ( ! $paged || $paged < 2 ) 
{

// show only 10 posts but calculate the pagination with 18 posts

} 
.....

es posible?

  • Bueno, supongo que debes modificar el código de paginación en lugar de este, ya que Pagination calculará las páginas en función del número fijo de publicaciones, por lo que te enfrentas a este error.

    – Anand Thakkar

    9 de enero de 2016 a las 5:38

  • La paginación de @Anandthakkar funciona con las consultas principales. $max_num_pages propiedad que se calcula dividiendo el $found_posts por la cantidad de publicaciones por página. Todo lo que necesita hacer es modificar el $found_posts propiedad con la found_posts filtrar

    – Pieter Goosen

    9 de enero de 2016 a las 7:45

  • ¿Puede ser más específico sobre lo que quiere decir con “subpáginas”?

    –Jim Maguire

    10 de enero de 2016 a las 18:22

avatar de usuario
pieter goosen

Aquí hay una versión modificada de una publicación que hice en WPSE hace un tiempo

DE WPSE

PASO 1

Necesitamos conseguir el posts_per_page opción configurada desde el back-end (que debe configurarse en 10) y también configure su offset que vamos a utilizar. Eso será 14 ya que necesitará 24 publicaciones en la página uno y 24 en el resto.

Si no desea modificar la posts_per_page opción, puede simplemente establecer la variable $ppg a 10

$ppg = get_option( 'posts_per_page' );
//$ppg = 10;
$offset = 14;

PASO 2

En la página uno, tendrás que restar el offset a posts_per_page

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

PASO 3

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

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

PASO 4

Por último, debe agregar su compensación a found_posts de lo contrario, su paginación no mostrará la última página

add_filter( 'found_posts', function ( $found_posts, $query ) 
{
    $offset = 14;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}, 10, 2 );

TODOS JUNTOS

Así es como se verá su consulta completa que debería ir a functions.php

add_action('pre_get_posts', function ( $query ) 
{
    if ( !is_admin() && $query->is_main_query() ) {
        $ppp    = get_option( 'posts_per_page' );
        //$ppp  = 10;
        $offset = 14;

        if ( !$query->is_paged() ) {
            $query->set( 'posts_per_page', $ppp - $offset );
        } else {
            $offset = ( ( $query->query_vars['paged']-1 ) * $ppp ) - $offset;
            $query->set( 'posts_per_page', $ppp );
            $query->set( 'offset', $offset );
        }
    }
});

add_filter( 'found_posts', function ( $found_posts, $query ) 
{
    $offset = 14;

    if( $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}, 10, 2 );

<?php 
function number_of_posts($query)
{
    if($query->is_main_query())
    {
       $paged = $query->get( 'paged' );

       //if page is less than 2 get 10 post on that page (that is on page 1)
       if ( ! $paged || $paged < 2 ) 
       {
            $query->set('posts_per_page', 10);
       } 
       else 
       {
           $query->set('posts_per_page', 24);
       }
    }
    return $query;
}
add_filter('pre_get_posts', 'number_of_posts');?>

y en la consulta principal donde ha especificado todos los argumentos para Wp_Query. por favor añadir $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

¿Ha sido útil esta solución?