Contenido

query_posts() y el problema de la paginación

13 Ago

+ 23

Hace ya mucho tiempo, hablamos de las maravillas que se podían hacer con query_posts(). Esta función, nos permite personalizar los posts que queremos que aparezcan, para ello disponemos de una buena batería de parámetros con los que podemos personalizar la query que nos obtiene de la base de datos.

Los que hemos lidiado con ella, somos conscientes del problema que tiene dicho método con la paginación ya que esta función es aplicada siempre y repite una y otra vez los resultados de la primera petición.

Para solventar dicho problema debemos recurrir a una condición para que nos informe de en que página nos encontramos, y así condicionar, más aún, nuestra query_posts();

query_posts() sin paginación

<?php if (have_posts()) : ?>
    <?php query_posts("category_name=somecat"); ?>
        <?php while (have_posts()) : the_post(); ?>

Este ejemplo, muestra el método sencillo de usar esta función, mediante query_posts() condicionaremos la petición para que nos devuelva los posts de la categoría cuyo nombre sea «somecat«.

query_posts(); con paginación

<?php if (have_posts()) : ?>
     <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
            query_posts("category_name=somecat&paged=$paged"); ?>
        <?php while (have_posts()) : the_post(); ?>

Como podemos ver en negrita, la única modificación es que añadimos la paginación por defecto a nuestra query, comprobando con get_query_var() la existencia de la variable paged, seleccionamos la página en la que se encuentra la query y en caso de no existir, informaremos que nos encontramos en la página 1, mostrando los primeros resultados.

Via

  • Buen post, como siempre.
    La verdad es que llevas un ritmo diabolico de posteos esta semana,no hay quien te pare, jeje.

  • Gracias por la info, la acabo de usar en un theme que estoy editando.
    Saludos

  • Cuanto más php veo más me doy cuenta que pasarme a python (con django) es una gran elección, te aseguro por experiencia propia que cualquier aplicación grande hecha en php degenera y se convierte en un chapuza, porque php no está hecho para proyectos grandes, está hecho para proyectos pequeños y un desarrollo rápido, pero a la que tengas que hacer muchos cambios te darás cuenta de lo poco mantenible que se convierte la aplicación.

  • Buena solución. Lo malo es que no funciona cuando le das un offset al query_posts(). El problema persiste y aún no le encuentro solución.

  • Interesante, en mi caso lo habia solucionado agregando $query_string

    query_posts($query_string . «&cat=NUMEROAQUI»);

  • @Xyborg: Si, más o menos es lo mismo. get_query_var() es un método para coger la variable paged (o cualquiera enviada por parámetro) a la página.

  • @aNieto2k si, es bueno contar con mejores alternativas tambien, como no posteaste esto hace semanas atras! jaja, que me tuvo loco un buen rato jeje.

  • @Xyborg: No, sobre el problema de la paginación es la primera vez que comento algo.

    Saludos

  • Como siempre grandes tutoriales, me has resuelto el problemon que me cargaba, te agradezco muchisimo el tiempo que dedicas y la informacion y tutoriales de gran calidad que haces.

    he aprendido mucho en tu blog. GRACIAS

  • Hola!
    Estoy instalando un blog con wordpress 2.7 y utilizando el plugin pagenavi para la paginación.
    El permalink que utilizo es /%postname%/ y con él tengo problemas. No me deja ir a la página 2 por ejemplo (/recetas/page/2/) me muestra los resultados de la página 1. Si quito pagenavi y utilizo next_posts_link() y previous_posts_link() tampoco me muestra las siguientes páginas.
    En cambio, si quito /%postname%/ y lo dejo por defecto funciona correctamente.
    ¿Cómo puedo solucionar esto? He intentado varias cosas, pero nada.
    Gracias de antemano

  • muchas gracias!, me estaba quemando la cabeza y google me trajo aqui 😀

  • Un genio, gracias aNieto2k, me haz solucionado un problema de web mobil, por favor si puedes chequealo desde tu celular o desde un emulador al http://www.mycoctel.com.

    Saludos.

  • Excelente, me habeis salvado de una intensa investigación, ya estaba triste porque no iba a poder montar mi nuevo theme hoy 😛

  • La verdad que no se que haría sin ti. fenómeno!!!!

  • He buscado bastante el tema xq tambien tuve problemas con la paginación, y gracias a tu post solucioné

    pero ahora me sale otro problema, tengo 2 loop, uno el de wordpress con 9 post por pagina + un query con 3 post mas abajo.

    Ahora con tu funcion se pagina sin problemas, pero como el query tiene mas post que todos los otros juntos, genera mas paginas, pero da un error cuando pagino hasta el final, xq sobrepasa las paginas del loop original de todos los post juntos.

    aca dejo el código

    ID, ‘thumbnail’, true); ?>
    <a href="» title=»»><img src="» alt=»» />

    <a href="» title=»»>

    Accesorios >>

    ID, ‘thumbnail’, true); ?>
    <a href="» title=»»><img src="» alt=»» />

    <a href="» title=»»>

  • Aca pongo de nuevo el codigo xq no quedo entero

    ID, 'thumbnail', true); ?>
    <a href="" title=""><img src="" alt="" />

    <a href="" title="">

    Accesorios >>

    ID, 'thumbnail', true); ?>
    <a href="" title=""><img src="" alt="" />

    <a href="" title="">

    Pueden ver la pagina es esta

  • Intenté poner el codigo entre las etiquetas code /code y no se puede como hago para mostrarles?

  • Gracias,
    funciona a la perfección.

    Saludos

  • Tengo un problema similar que me está quemando la cabeza y no puedo solucionarlo.

    Resulta que cree un template page con un query_posts( ‘meta_key=committee&orderby=meta_key&order=ASC&cat=8’); para mostrar una categoria pero esta no me muestra paginacion. Noté que la url ya no busca en dominio/category/name, sinó que busca en dominio/nombrepagina/

    Tambien intenté con una sola plantilla pero con una llamada /category/economic-and-cultural-rights/?meta_value=country&order_by=meta_value&order=ASC sin tener resultado.

    Me podrían informar si este inconveniente tiene una solución.

    aNieto2k, tu blog me es sumamente útil, te felicito…

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.