Soporte » WordPress Avanzado » Paginación que repite las mismas entradas

  • Resuelto SerGi

    (@sdesergi)


    Buenas,

    Antes que nada disculpad si cometo algun error creando este debate, pues es la primera vez que uso el foro de soporte de wordpress. También os informo de que mis conocimientos de php son más limitados de lo que quisiera.

    Mi caso es el de alguien que quiere modificar el Loop de la última plantilla que wordpress lleva por defecto (Twenty seventeen), en su archivo index.php, para que, en el frontpage, pueda mostrar las entradas de una categoria en concreto.

    Para lograr esto busqué en el códex para finalmente dar con esta obertura del Loop:

    $loop_customizado = new WP_Query(‘cat=3’);
    if ($loop_customizado-> have_posts()):
    /* Start the Loop */
    while ($loop_customizado-> have_posts()): $loop_customizado-> the_post();

    El resto sigue tal y como está en la plantilla de wordpress.

    ¿Funciona? Sí, pero en cada una de las paginaciones del blog me repite exactamente las mismas entradas. Cabe decir que he probado otros métodos para modificar el Loop con idénticos o similares resultados. Unos crean el mimso nº de entradas que nº de entradas hay en dicha categoria mientras que otros crean el mismo nº de entradas que cantidad total hay de entradas en el blog. Sea como sea, y una vez creada la paginación, puedes leer exactamente el mismo contenido en cada una de las páginas (1, 2, 3, 4…). Los cambios los realizo en un tema hijo. Todo me ha funcionado perfecto pero este detalle no consigo solucionarlo y he ido siguiendo el códex con varios ejemplos 🙁

    No he encontrado un debate similar que pudiera ayudarme, espero encontrar con alguien que sepa como solucionarlo. ¡Muchas gracias de antemano!

    SerGi

Viendo 15 respuestas - 16 de 30 (de 30 total)
  • Moderador LGrusin

    (@lgrusin)

    Pues si que es raro, me funcionó desde el primer momento, de hecho los códigos que pongo los pruebo antes por si las moscas.

    Si no le pones el número de posts a mostrar te salen todas las entradas de la categoría pero sale el «nada encontrado», que lo genera el tema.

    Un misterio…

    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.
    Moderador almendron

    (@almendron)

    A ver si saco un rato durante el fin de semana y lo vuelvo a probar.

    Los parámetros de cat, posts_per_page y paged ya los probé en su dia usando todas las posibles combinaciones. Almendron, ese código que compartes es el que acabé por usar pero es necesario probarlo metiendo entradas ajenas a esa categoria para darse cuenta de que la paginación responde al nº total de posts de todo el blog, en vez de los post de esa categoria. Seguro que te ha funcionado? En ese caso lo entendería menos pues a mi, en local, con todo pelado y de serie, tampoco me funcionaba.

    Finalmente terminé por controlar el contenido desde el archivo Functions.php, con el código que se describe en este enlace del códex o en la sección para desarrolladores.

    Me gustaba la idea de controlar el contenido desde cada archivo.php y dejar el functions.php en paz pero… el pre_get_posts funciona con la paginación a la perfección metiendo en la función los condicionales que te dé la gana ¡y listos! Los pros y los contras de hacerlo de una u otra forma los desconozco por lo que, de no haberlos, daria el tema por zanjado. Aunque sigo pensando en que hay un error en esa función del LOOP con la paginación…

    ¡Saludos!

    Moderador LGrusin

    (@lgrusin)

    La principal diferencia es que con el código inicial que habías puesto creabas una nueva consulta (new WP_Query) mientras que con pre_get_posts añades o modificas valores de la actual consulta, que es la inicial por defecto.

    Tanto para una como para la otra necesitas pasarle el número de posts a mostrar en caso de que sea diferente al que eliges en Ajustes – Lectura. Pensaba que querías poner un número diferente, pero si vas a utilizar el mismo número de posts pues no lo necesitas entonces.

    El código quedaría así en el archivo functions.php del tema:

    function my_home_category( $query ) {
     if ( $query->is_home() && $query->is_main_query() ) {
      $query->set( 'cat', '3' );
     }
    }
    add_action( 'pre_get_posts', 'my_home_category' );

    Un saludo

    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.
    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.
    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.

    Creo que no me explico. Por si acaso lo pruebo de nuevo.

    El hecho de que el nº de páginas de la paginación responda a los ajustes o a los parámetros de la función es irrelevante. Ese no es el problema y funciona tal como dices, es decir, siguiendo la configuración marcada en general desde «Ajustes» mientras no se especifique otra cosa mediante código.

    El problema era que, teniendo 10 entradas en la categoria ID = 3, de las 30 entradas que tenia el blog en total, el nuevo query ceñido a mostrar la categoria ID = 3 se paginaba fabricando espacio para las 30 entradas en vez de las 10. Daba igual si en cada página mostraba 3, 6 u 8, eso funcionaba correctamente, pero siempre se paginaban las páginas necesarias para meter las 30 entradas totales del blog, en vez de las 10 entradas que debía mostrar.

    Bueno lo volví a explicar por que con la última respuesta no me quedó claro de que se entendiera. Si no es así y no surgen más aportaciones creo que debería de cerrar esto, no? Dudo por que en realidad, aunque yo lo haya solucionado mediante pre_get_posts, sigo pensando en que hay un error en el códex. Dejo una semanita.

    ¡Y vuelvo a agradeceros las respuestas!
    Un saludo

    Moderador LGrusin

    (@lgrusin)

    Pues estamos diciendo lo mismo:

    …paginaba fabricando espacio para las 30 entradas en vez de las 10…

    En las pruebas que hice eso sólo ocurría cuando no le decías los posts a mostrar, cosa lógica por otro lado. Muestra bien los posts de la categoría pero no sabe cuantas páginas ocupan esos posts de esa categoría, por eso había que pasar ese dato en la consulta para que paginara bien.

    Saludos

    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.

    Pero LGrusin, cómo le vas a especificar el nº de posts a mostrar si eso es algo dinámico que va aumentándose a medida que vas publicando. Puede que algo se me escape pq no controlo el códex pero tp le veo sentido alguno, y el nº de posts por página no tiene nada que ver con el nº de posts a mostrar. Seguro que no estamos confundiendo esos dos términos?

    Moderador LGrusin

    (@lgrusin)

    Está claro que no nos entendemos,

    …nº de posts por página no tiene nada que ver con el nº de posts a mostrar…

    El número de posts por página es el número de posts a mostrar en cada página, precisamente para eso está ese parámetro.

    Ejemplos:
    – 10 posts de la categoría 3 y le dices en ‘posts_per_page’ => 5, mostraría la paginación de dos páginas de 5 posts cada una.
    – Si le dices que muestre ‘posts_per_page’ => 6, te dará paginación para 2 páginas, la primera con 6 posts y la última con 4.
    – Si le dices que muestre ‘posts_per_page’ => 4, te dará paginación para 3 páginas, las dos primeras con 4 posts y la última con 2.

    Así con otros valores, y se adapta la paginación al número de posts totales de esa categoría, por supuesto.

    Saludos

    • Esta respuesta fue modificada hace 1 año, 10 meses por  LGrusin.

    Has dicho 10 posts, ¿cierto? Esos son el nº de posts totales a los que me refiero. Por eso no dije nº de posts por página, dije nº de posts

    siempre se paginaban las páginas necesarias para meter las 30 entradas totales del blog, en vez de las 10 entradas que debía mostrar

    De ahí que siga insistiendo 🙂 ¡por qué no me queda claro que se haya entendido el error!

    Si algo se me escapara ya me diréis.
    Saludos

    Es decir, siguiendo tu ejemplo (no te he respondido del todo bien), y teniendo en cuenta que entre todas las categorias hay los 30 posts, respondo entre líneas…

    – 10 posts de la categoría 3 y le dices en ‘posts_per_page’ => 5, mostraría la paginación de dos páginas de 5 posts cada una. Incorrecto, mostraria esas 2 páginas más las 4 páginas vacías de los 20 posts restantes.
    – Si le dices que muestre ‘posts_per_page’ => 6, te dará paginación para 2 páginas, la primera con 6 posts y la última con 4. Incorrecto, mostraria 5 páginas, a partir de la 2da página estarian vacías.
    – Si le dices que muestre ‘posts_per_page’ => 4, te dará paginación para 3 páginas, las dos primeras con 4 posts y la última con 2. No, mostrará 8 páginas, las 3 primeras como tu dijiste y el resto vacías.

    Lo volveré a probar otra vez (¡por 5ta vez! :D), no sea que se me escaa algo, pero eso de

    se adapta la paginación al número de posts totales de esa categoría

    es lo que a mi no me sucede. Se adapta a los posts totales del blog, no totales de la categoría.

    Moderador LGrusin

    (@lgrusin)

    Yo te he explicado cómo funciona y lo que te debería salir. Si sale otra cosa igual has cometido algún error o hay algo que se nos escapa.

    Funciona así, no es algo que me esté inventando…

    Procura eliminar temporales del navegador cada vez que hagas pruebas.

    Un saludo

    Buenas,

    Disculpen que me haga pesado y cambie el estado del debate en «sin resolver«. Supongo que si tenia la opción era por qué podia cambiarlo y, desde luego, sigo sin pensar que es un tema resuelto. Yo si lo he resuelto por otro camino pero esta función sigue mostrando errores. Me quedo sin herramientas para explicarme pero… ¡voy a intentarlo de nuevo!

    ———– INICIO ————————-

    Partiendo de 0: Caché, cookies y polvo limpio. WordPress v.4.8. Xampp actualizado v.7.1.7. 0 plugins. Base de datos nueva. Todo nuevo y recién instalado en local. Ajustes > Lectura > Número máximo de entradas a mostrar en el sitio: 5. Nada cambiado. NADA.

    Contenido creado: 3 categorias con 10 entradas cada una. Total: 30 entradas (10 + 10 + 10).

    ———— COMPROBACIONES —————–

    Modificación 1 del Loop en el archivo index.php:

    $misEntradas = new WP_Query('cat=1');
    if ( $misEntradas->have_posts() ) :		
      while ( $misEntradas->have_posts() ): 
        $misEntradas->the_post();

    RESULTADO: Contenido filtrado (ok). El contenido se repite en cada página (error). La paginación crea páginas para mostrar las 30 entradas en vez de las 10 (error).

    Modificación 2 del Loop en el archivo index.php:

    $misEntradas = new WP_Query(array( 'cat' => 1, 'posts_per_page' => 6 ));
    if ( $misEntradas->have_posts() ) :		
      while ( $misEntradas->have_posts() ): 
        $misEntradas->the_post();

    RESULTADO: Contenido filtrado (ok). Entradas por página modificadas a 6 (ok). El contenido se repite en cada página (error). La paginación crea páginas para mostrar las 30 entradas en vez de las 10 (error).

    Modificación 3 del Loop en el archivo index.php:

    $misEntradas = new WP_Query(array( 'cat' => 1, 'posts_per_page' => 6, 'paged' => $paged ));
    if ( $misEntradas->have_posts() ) :		
      while ( $misEntradas->have_posts() ): 
        $misEntradas->the_post();

    RESULTADO: Contenido filtrado (ok). Entradas por página modificadas a 6 (ok). El contenido no se repite (ok). La paginación crea páginas para mostrar las 30 entradas en vez de las 10 (error).

    Si alguien hace la prueba, por favor, que la haga creando las 3 categorias con varios posts en cada una, no con una sola categoria. Yo lo probé antes y durante la publicación de este debate con los mismos resultados. Ya son 5 intentos y si el fallo es mio no se me ocurre por donde lo puedo cometer. Como consecuencia interpreto que estas modificaciones del Loop, incluso siguiendo las instrucciones del Códex, son erróneas o incompletas.

    Ánimo y paciencia, y saludos 🙂
    SerGi

    Moderador LGrusin

    (@lgrusin)

    En el CODEX lo explican, en inglés claro.

    Para nuevos Loops usar WP_Query y para modificar el existente usar query_posts.

    El caso es que la paginación no va bien y se obtienen resultados inesperados. Por eso aconsejan usar ‘pre_get_posts’ en el archivo functions.php del tema. Traducción literal «Es totalmente recomendado usar ‘pre_get_posts’ en su lugar».

    Pues nada, incluso hay hilos similares en el Foro sobre este tema que funcionaban a la perfección y que se pueden consultar.

    Por tanto, este es el código que funciona con total seguridad:

    function my_home_category( $query ) {
     if ( $query->is_home() && $query->is_main_query() ) {
      $query->set( 'cat', '3' );
     }
    }
    add_action( 'pre_get_posts', 'my_home_category' );

    Saludos

    Ok

    Sí, eso es lo que uso ahora. Entonces, con paginación es lo único que funciona. No hacia nada mal… 🙁 Bueno sí: no dominar el inglés y no dedicar más tiempo leyendo el códex 🙂 Ya navegué por el códex en versión inglesa y no leí eso, pero todavía me pierdo. Encuentro la estructura un poco caótica…

    Ok, doy el tema por zanjado. ¡Muchas gracias por la ayuda!
    Sergi

Viendo 15 respuestas - 16 de 30 (de 30 total)
  • El debate ‘Paginación que repite las mismas entradas’ está cerrado a nuevas respuestas.