Soporte » Plugins y Hacks » Hacks » Añadir offset al loop y que funcione la paginación

  • Resuelto Ana Cirujano

    (@acirujano)


    ¡Hola, buenas tardes!

    Necesito ayuda con este error conocido. No funciona la paginación al añadir un offset en el loop. He probado varias soluciones pero no consigo dar con la tecla.

    El la página de Noticias de la web, la primera noticia empieza a partir de la noticia número 7, porque las 6 primeras aparecen en la home.

    La página de noticias utiliza la plantilla index.php.

    He añadido el código query_posts('posts_per_page=6&offset=6'); antes del loop para conseguir saltar las 6 primeras noticias, pero esto provoca que no funcione la paginación de las noticias.

    vaya al número que vaya, siempre me dirige a la página 1.

    He probado a insertar este código en mi functions.php pero no pasa nada, supongo que tengo que personalizar algún código:

    // Fix for offset wp query home
    add_action('pre_get_posts', 'myprefix_query_offset', 1 );
    function myprefix_query_offset(&$query) {
        //Before anything else, make sure this is the right query...
        if ( ! $query->is_home() ) {
            return;
        }
     
        //First, define your desired offset...
        $offset = get_option('posts_per_page');
     
        //Next, determine how many posts per page you want (we'll use WordPress's settings)
        $ppp = get_option('posts_per_page');
        //Next, detect and handle pagination...
        if ( $query->is_paged && $query->is_main_query() ) {
            //Manually determine page query offset (offset + current page (minus one) x posts per page)
            $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
     
            //Apply adjust page offset
            $query->set('offset', $page_offset );
        }
        else {
        	if($query->is_main_query())
            	//This is the first page. Just use the offset...
            	$query->set('offset',$offset);
        }
    }

    Este es el código de las noticias en index.php:

    <?php
                query_posts('posts_per_page=6&offset=6');
    
                if (have_posts()) :
                    // check where should sidebar be placed
                    $page_id = get_the_ID();
                    $blog_style = $pi_theme_options['blog_style'];
    
                    $page_sidebar = $pi_theme_options['blog_sidebar_position'];
                    if ($blog_style == 'blog-post-full' || $blog_style == 'blog-post-masonry-full') {
                        $page_sidebar = false;
                    }
    
                    if ($page_sidebar == 'left'):
                        get_sidebar();
                    endif;
    
                    $grid_size = ($blog_style == 'blog-post-full' || $blog_style == 'blog-post-masonry-full') ? 12 : 9;
    
                    $ul_classes = array('grid_' . $grid_size, 'blog-posts', 'content-sidebar-' . $page_sidebar, $blog_style);
                    if ($blog_style == 'blog-post-masonry-full') {
                        $ul_classes[] = 'isotope';
                        $ul_classes[] = 'full';
                        $ul_id = "blogmasonry";
                    } elseif ($blog_style == 'blog-post-masonry') {
                        $ul_classes[] = 'isotope';
                        $ul_classes[] = 'cols';
                        $ul_id = "blogmasonry";
                    } else {
                        $ul_id = "classic-blog-layout";
                    }
    
                    // get animation classes
                    $animation = $pi_theme_options['blog_animation'];
                    if ($animation != "disabled") {
                        $ul_classes[] = 'triggerAnimation';
                        $ul_classes[] = 'animated';
                        $ul_classes[] = $animation;
                    }
                    ?>
                    <!-- blog posts container start -->
                    <ul id="<?php echo $ul_id; ?>" class="<?php echo join(' ', $ul_classes) ?>">
                        <?php
                        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
                        while (have_posts()) : the_post();
                            $format = get_post_format();
                            get_template_part('content', $format);
                        endwhile;
                        ?>
                        <?php pi_pagination('blog'); ?>
                    </ul><!-- blog posts container end -->
                    <?php
                    if ($page_sidebar == 'right'):
                        get_sidebar();
                    endif;
                else :
                    ?>
                    <div class="grid_12">
                        <h3><?php _e('No hay resultados', 'pi_framework') ?></h3>
                        <p style="margin-bottom:40px"><?php _e('No se han encuentrado resultados para la búsqueda realizada.', 'pi_framework') ?></p>          
                    </div>
                <?php endif; ?>

    Muchísimas gracias por tu ayuda.

    Un saludo,

    Ana

Viendo 4 respuestas - 1 de 4 (de 4 total)
  • kallookoo

    (@kallookoo)

    Hola Ana,
    Ahora no estoy en casa, pero tu problema asi mirando por encima lo tienes con la variable $paged que la defines en un sitio incorrecto y tampoco la añades en los argumentos de query_posts.
    Pon el codigo de $paged = … antes de query_post.
    y el query_posts asi:
    query_posts( array( 'posts_per_page' => 6, 'offset' => 6, 'paged' => $paged ) );

    • Esta respuesta fue modificada hace 1 año por  kallookoo.
    Ana Cirujano

    (@acirujano)

    ¡Muchas gracias por tu ayuda, Sergio!

    Ahora funciona el cambio de página en la paginación, pero las entradas que se listan siguen siendo las mismas, aunque cambie de número de página, cada página empieza en la noticia número 7…

    Moderador LGrusin

    (@lgrusin)

    @acirujano el offset nunca podrá funcionar porque ya se usa para la consulta por defecto de manera que afecta a la paginación cuando lo añades manualmente.

    Para evitar eso hay que hacer un invento, aquí te explica la solución
    https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination

    Un saludo

    • Esta respuesta fue modificada hace 1 año por  LGrusin.
    Ana Cirujano

    (@acirujano)

    ¡Muchas gracias, Luis!

    Efectivamente, eso ha solucionado el problema.

    He dejado tal cual estaba el loop en la plantilla index.php y he agregado el código del enlace que me has pasado del Codex en mi functions.php cambiando, en mi caso, is_home() por is_category() y todo correcto.

    Un abrazo,

    Ana

Viendo 4 respuestas - 1 de 4 (de 4 total)
  • El debate ‘Añadir offset al loop y que funcione la paginación’ está cerrado a nuevas respuestas.