Soporte » Plugins y Hacks » Error en la paginación de un archive de CPT en WordPress

  • Resuelto pablodelgadoflores

    (@lk2_89)


    Tengo implementado en mi WordPress un CPT de tipo podcast. He tenido que hacer una redirección de tipo 301 ya que el plugin que gestiona los podcast (Seriously Simple Podcasting) no me dejaba modificar el aspecto del archive, así que me creé uno personalizado e hice la mencionada redirección de podcasts a podcast.

    El código que rescata los podcasts publicados es:

    
    $args = array(
     'post_type' => 'podcast',
     'orderby' => 'date',
     'order' => 'DESC',
     'posts_per_page'=> '1',
     'paged' => get_query_var( 'paged' ),
     );
     $loop = new WP_Query( $args );
     if( $loop->have_posts() ):
    
     while( $loop->have_posts() ): $loop->the_post(); global $post;
     echo '<div id="podcast_archive">';
        echo '<a href="' . get_the_permalink() . '"><div class="img_episode">' . get_the_post_thumbnail( $id, array(200,200) ) . '</div></a>';
        echo '<a href="' . get_the_permalink() . '"><h2 class="title_episode">' . get_the_title() . '</h2></a>';
        echo '<a href="' . get_the_permalink() . '"><div class="excerpt_episode"><p>' . get_the_excerpt() . '</p></div></a>' ;
     echo '</div>';
    
     endwhile;
    
     next_posts_link( 'Older Entries', $loop->max_num_pages );
     previous_posts_link( 'Newer Entries' );
     endif;
    

    Tengo actualmente dos capítulos publicados y para probar la paginación, he puesto que cada página solo contenga un episodio.

    El problema es que al darle a Older entries me da un error 404. La url que intenta sacarme es https://misitio.com/podcast/page/2/.

    ¿Cómo podría solucionar este error en la paginación? No me gustaría que se cargaran todos los episodios en la misma página.

Viendo 15 respuestas - de la 1 a la 15 (de un total de 15)
  • Moderador LGrusin

    (@lgrusin)

    No es necesario eso, con pre_get_posts le puedes decir el número de entradas del post type que quieres mostrar y te conserva la paginación.

    Aquí tienes ejemplos
    https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts#Changing_the_number_of_posts_per_page.2C_by_post_type

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    Perdona @lgrusin. Exactamente, ¿qué no es necesario de mi código?

    Aún así, la parte de obtener solo un post por página funciona. El problema es cuando le doy a ver anteriores, que cuando debería salir la página nº 2, me sale un error 404

    Moderador LGrusin

    (@lgrusin)

    Lo que quiero decir es que no es necesario modificar ningún archivo del tema o crear una nueva consulta.

    Según el ejemplo del enlace anterior, algo asi en el functions.php, o plugin de funciones propias, debería funcionar:

    function hwl_home_pagesize( $query ) {
     if ( is_admin() || ! $query->is_main_query() )
      return;
    
     if ( is_post_type_archive( 'podcast' ) ) {
     // Display 1 posts for a custom post type called 'podcast'
     $query->set( 'posts_per_page', 1 );
     return;
     }
    }
    add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

    Incluso la redirección no me parece necesaria.

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin tal como menciono en el primer post, el motivo de crear un archive-podcast es porque el plugin que utilizo no permite la personalización y, siguiendo su documentación oficial, esa era la única forma.

    He probado ese código que me mencionas pero sigue sin funcionar. He liberado también la caché de los enlaces permanentes y tampoco ha dado resultado.

    Moderador LGrusin

    (@lgrusin)

    En condiciones normales si accedes mediante ‘tudominio.com/podcast’ ya salen todos los posts que pertenecen al Custom Post Type podcast, con paginación.

    el motivo de crear un archive-podcast es porque el plugin que utilizo no permite la personalización

    El plugin no debería intervenir para nada. Es cuestión de plantillas del tema.

    Si quieres una página personalizada de los podcasts crea un archivo llamado archive-podcast.php (tal como creo que has hecho) con tus modificaciones (suponiendo que el Custom Post Type se llame podcast). Puedes partir del archivo archive.php que viene con el tema.

    El código anterior que he puesto modifica el número de posts a mostrar manteniendo la paginación. No es necesario crear una una nueva consulta (query), porque pierdes la paginación.

    Es posible si has estado haciendo pruebas que debas actualizar los permalinks.

    Deberías quitar la redirección y partir desde el principio.

    • Esta respuesta fue modificada hace 3 años por LGrusin.
    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin Pero para aplicar los ajustes de CSS y demás que quiero implementar, necesito utilizar una query para indicarle que quiero realizar por cada capítulo, ¿no? Es decir, si no hago una nueva query, ¿cómo aplico lo siguiente?

    if( $loop->have_posts() ):
    
     while( $loop->have_posts() ): $loop->the_post(); global $post;
     echo '<div id="podcast_archive">';
        echo '<a href="' . get_the_permalink() . '"><div class="img_episode">' . get_the_post_thumbnail( $id, array(200,200) ) . '</div></a>';
        echo '<a href="' . get_the_permalink() . '"><h2 class="title_episode">' . get_the_title() . '</h2></a>';
        echo '<a href="' . get_the_permalink() . '"><div class="excerpt_episode"><p>' . get_the_excerpt() . '</p></div></a>' ;
     echo '</div>';
    
     endwhile;
    Moderador LGrusin

    (@lgrusin)

    No importa, el bucle while se conserva pero con tus modificaciones:

    if ( have_posts() ) :
     while ( have_posts() ) :
     the_post();
     echo '<div id="podcast_archive">';
        echo '<a href="' . get_the_permalink() . '"><div class="img_episode">' . get_the_post_thumbnail( $id, array(200,200) ) . '</div></a>';
        echo '<a href="' . get_the_permalink() . '"><h2 class="title_episode">' . get_the_title() . '</h2></a>';
        echo '<a href="' . get_the_permalink() . '"><div class="excerpt_episode"><p>' . get_the_excerpt() . '</p></div></a>' ;
     echo '</div>';
     endwhile;

    Otra cosa es que esté bien hecho, creo que te sobra y te falta algo. Fijate del archive.php de tu tema. Si nos dices el tema igual iríamos más rápido, que no sea comercial claro.

    Por cierto, ¿has leído la documentación del plugin?
    https://support.castos.com/article/29-creating-custom-podcast-templates

    • Esta respuesta fue modificada hace 3 años por LGrusin.
    • Esta respuesta fue modificada hace 3 años por LGrusin.
    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin Si, precisamente de la documentación del plugin entendí que debía crear un archive-podcast.

    Respecto al theme, es comercial. Es un child theme de Genesis Framework (business-pro-theme, para ser más exacto).

    Estoy intentando aplicar eso que me dices pero no lo consigo. He visto que la paginación funciona porque en Ajustes>Lectura he indicado que solo salga una entrada por página, pero no es lo que busco. Este es el código que tengo actualmente en archive-podcast:

    
    add_action( 'business_page_header','tituloPodcast',1 );
    function tituloPodcast() {
            echo '<h1>Podcast</h1>'; 
    }
    
    //------------------------------------------------------------------------------
    
    remove_action ('genesis_loop', 'genesis_do_loop'); // Remove the standard loop
    add_action( 'genesis_loop', 'custom_do_grid_loop' ); // Add custom loop
    
    add_action( 'genesis_before_loop', 'nombre_archivo' );
    function nombre_archivo(){
        echo '<p class="title_archive">Todos los capítulos</p>';
    }
    
    function hwl_home_pagesize( $query ) {
     if ( is_admin() || ! $query->is_main_query() )
      return;
    
     if ( is_post_type_archive( 'podcast' ) ) {
     // Display 1 posts for a custom post type called 'podcast'
     $query->set( 'posts_per_page', 1 );
     return;
     }
    }
    add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
    
    function custom_do_grid_loop() {
    if ( have_posts() ) :
     while ( have_posts() ) :
     the_post();
     echo '<div id="podcast_archive">';
        echo '<a href="' . get_the_permalink() . '"><div class="img_episode">' . get_the_post_thumbnail( $id, array(200,200) ) . '</div></a>';
        echo '<a href="' . get_the_permalink() . '"><h2 class="title_episode">' . get_the_title() . '</h2></a>';
        echo '<a href="' . get_the_permalink() . '"><div class="excerpt_episode"><p>' . get_the_excerpt() . '</p></div></a>' ;
     echo '</div>';
     endwhile;
     endif;
    }
     
    /** Remove Post Info */
    remove_action('genesis_before_post_content','genesis_post_info');
    remove_action('genesis_after_post_content','genesis_post_meta');
     
    genesis();
    

    Esto me sigue mostrando más de un capítulo del podcast en el archive.

    Moderador LGrusin

    (@lgrusin)

    @lk2_89 como te dije antes el código que he puesto va en el archivo functions.php del tema, en este caso del tema hijo.

    Te aconsejo que empieces por lo más fácil:
    1 – Olvida el archivo archive-podcast.php
    2 – Añade el código en el functions.php del tema hijo.

    Una vez veas que la paginación de los posts va según lo que has puesto en Ajustes – Lectura, y que la paginación de los podcast va según lo que indiques en el código añadido al functions.php entonces creas el archive-podcast.php y vas haciendo pequeños cambios en él.

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin Tienes toda la razón, ha sido fallo mío al estar ya liado entre el archive-podcsat y el fichero de funciones personalizadas que creé.

    Ahora me muestra correctamente la paginación. Solo me queda seguir peleándome para que el loop muestre los episodios como yo quiero ^^

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin nada, no consigo la manera de mostrar el loop como yo quiero…

    Moderador LGrusin

    (@lgrusin)

    Es que no sé lo que quieres hacer exactamente. Tienes todas las configuraciones en el menú Podcast – Ajustes – General.

    Si solo es aplicar estilos, igual lo solucionas añadiendo estilos CSS desde el menú Apariencia – Personalizar – CSS adicional.

    Por cierto, hay una extensión para Genesis Framework, no sé en qué te puede afectar.

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    @lgrusin Lo que intento hacer es mostrar el archive con este estilo, tal como tenía antes:

    echo '<div id="podcast_archive">';
        echo '<a href="' . get_the_permalink() . '"><div class="img_episode">' . get_the_post_thumbnail( $id, array(200,200) ) . '</div></a>';
        echo '<a href="' . get_the_permalink() . '"><h2 class="title_episode">' . get_the_title() . '</h2></a>';
        echo '<a href="' . get_the_permalink() . '"><div class="excerpt_episode"><p>' . get_the_excerpt() . '</p></div></a>' ;
     echo '</div>';

    Ya que me interesa a nivel SEO que cada capítulo esté en h2 con su extracto, de ahí que originalmente modificara la query para sacar así la información.

    Moderador LGrusin

    (@lgrusin)

    Es imposible ayudarte sin tener acceso al código del tema. El mismo soporte del tema puede indicarte como personalizar los archivos, ¿has consultado al autor del mismo?

    Iniciador del debate pablodelgadoflores

    (@lk2_89)

    Creo que no voy a poder contactar con el autor, dado que el theme está sacado de una comunidad en la que se paga una cuota mensual y se tiene acceso a los distintos themes de Genesis.

    Al final, tengo el paginado pero no la estructura que necesito… Y antes tenía justo lo contrario.

    ¡Muchas gracias @lgrusin por tu ayuda y paciencia!

    Lo marco como resuelto, dado que la paginación ya funciona.

Viendo 15 respuestas - de la 1 a la 15 (de un total de 15)
  • El debate ‘Error en la paginación de un archive de CPT en WordPress’ está cerrado a nuevas respuestas.