Paginación en una plantilla de página personalizada

25 oct 2011, 21:23:15
Vistas: 13.9K
Votos: 3

He configurado un tipo de publicación personalizado llamado 'Eventos'. Por razones que no voy a detallar, decidí no usar archive-events.php como plantilla de archivo para mis Eventos. En su lugar, opté por crear una plantilla de página personalizada, page-upcoming-events.php, para usarla como archivo.

Escribí una consulta personalizada en esta plantilla para mostrar los eventos. También estoy limitando posts_per_page a 4. He agregado con éxito enlaces de paginación usando las funciones previous_posts_link() y next_posts_link().

Estas funciones están generando enlaces a las URLs esperadas: /upcoming-events/page/2/, etc.

En la página 1, obtengo los primeros 4 eventos y el enlace a los siguientes eventos.

El problema que tengo es que cuando voy a la página 2, obtengo un error 404, no los eventos 5-8.

¿Cómo puedo agregar correctamente la paginación a una plantilla de página personalizada?

0
Todas las respuestas a la pregunta 2
1

Esto es lo que hago para la paginación. Espero que te ayude a encaminarte, puede ser excesivo para lo que estás intentando hacer...

Primero establezco $paged:

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

Luego construye tu array $args, asegúrate de incluir:

'paged' => $paged

Ejecuta tu consulta incluyendo las funciones necesarias para la paginación (este es un ejemplo, cambia lo que necesites para adaptarlo a tu caso):

        //la consulta usando los argumentos anteriores
        $wp_query = new WP_Query( $args );

        //usa la consulta para paginación
        $wp_query->query_vars[ 'paged' ] > 1 ? $current = $wp_query->query_vars[ 'paged' ] : $current = 1;

        //configura el array "paginate_links" para que haga lo que queremos. Consulta el codex para ver ejemplos http://codex.wordpress.org/Function_Reference/paginate_links
        $pagination = array(
            'base' => @add_query_arg( 'paged', '%#%' ),
            //'format' => '',
            'showall' => false,
            'end_size' => 4,
            'mid_size' => 4,
            'total' => $wp_query->max_num_pages,
            'current' => $current,
            'type' => 'plain'
        );

        //construye los enlaces de paginación
        if ( $wp_rewrite->using_permalinks() )
            $pagination[ 'base' ] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );

        //más enlaces de paginación
        if ( !empty( $wp_query->query_vars[ 's' ] ) )
            $pagination[ 'add_args' ] = array( 's' => get_query_var( 's' ) );

        //ejecuta la consulta
        if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();

Todo lo que queda es indicar en la página dónde quieres los enlaces de paginación:

        //imprime los enlaces de paginación en la página
        echo '<div class="pydPaging">' . paginate_links($pagination) . '</div>';

De nuevo, esto puede ser excesivo, pero funciona bien.

1 dic 2011 19:56:39
Comentarios

la función paginate_links($pagination) me está devolviendo vacío

AGrush AGrush
14 abr 2022 17:05:33
0

¿Estás seguro de que no tienes una página con el mismo nombre que el tipo de entrada personalizada? Si es así, las reglas de reescritura de los enlaces permanentes se confundirán y generarán un error 404.

Una solución muy sencilla es: La página que lista los tipos de entradas personalizadas se llama en plural (por ejemplo, productos) y el nombre real del tipo de entrada está en singular (por ejemplo, producto). Así no entran en conflicto y todo funciona correctamente.

También asegúrate siempre de reescribir tu archivo .htaccess cuando crees un nuevo Tipo de Entrada Personalizada.

19 abr 2022 11:40:08