A veces WordPress és muy fácil de usar pero a veces también nos encontramos con confusiones, con conceptos un poco confusos y el codex de wordpress no ayuda mucho. En este post cuento cómo realizar correctamente el paginado de una query hecha a base de get_posts().

Normalmente necesitaremos hacer una query con get_posts() si nos interesa seguir atribuyendo la variable $post a la plantilla desde dónde llamanos get_posts(), por ejemplo. De esta forma podemos seguir obteniendo the_content() de la prpopia página o usar get_post_meta().

Normalmente llamamos get_posts() con unos argumentos en forma de array. En este caso obtendremos un custom post type:

<?php
    $productos = get_posts(
        array(
            'post_type' => 'product',
        )
    );
?>

Si tenemos demasiados productos y los queremos paginar le tendremos que asignar mediante el parámetro post_per_page los elementos que queremos mostrar por página sino cogerá los que se ha asignado en los ajustes de wordpress (ajustes > lectura).

<?php
    $productos = get_posts(
        array(
            'post_type' => 'product',
            'posts_per_page' => 9,
        )
    );
?>

Ahora deberemos paginar correctamente los elementos. Existe una variable de worpres, get_query_var(‘paged’), que nos devuelve la página o no. Si es que no será que es la primera página. Esta variable la recoge de mediante la url, dependiendo de cómo tengas configurados los enlaces permanentes tendrá un aspecto u otro. Si tienes configurada la estructura a modo “bonito” será algo así cómo: dominio.com/nombre-de-la-pagina/page/2, si fuera la configuración por defecto sería así: dominio.com/?page_id=1&paged=2.

Quedaría algo así:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
?>

Ahora lo que tenemos que hacer es pasarle el valor de la página a get_posts(). Para ello usaremos un parámetro llamado offset, no os confundáis cómo me pasaba a mi que offset no es equivalente al número de la página. Realmente offset es el número del elemento inicial, quiero decir, si tenemos 5 elementos por página y quiero la página 2, tendríamos que hacer este cálculo:

( página - 1 ) * elemtos_por_pagina = ( 2 - 1 ) * 5 = 5

Por lo tanto nuestro código si lo juntamos todo quería así:

<?php 
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    /* Si se quiere el de valor por defecto, 
       se tiene que obtener mediante get_option('posts_per_page') */
    $posts_per_page = 12;
 
    $productos = get_posts(
        array(
            'posts_per_page' => $posts_per_page,
            'offset'         => ($paged-1)*$posts_per_page,
            'post_type'      => 'product',
        )
    );
?>

PD: muchas gracias Victron por tu ayuda.

Categorías: PHP, Wordpress
Si necesitas una url corta puede usar: codygo.es/1191

Deja un comentario