Creando una paginación simple para plantillas de tipos de contenido personalizados

1 feb 2015, 15:23:55
Vistas: 52.8K
Votos: 0

Tengo un tipo de contenido personalizado llamado 'news' y estoy teniendo dificultades para hacer que la paginación funcione correctamente. Busco unos enlaces simples de anterior y siguiente, no me preocupan los números de página en el medio.

En page-news.php este es mi código:

<?php
    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    $args = array('post_type' => 'news', 'posts_per_page' => 2, 'paged' => $paged);
    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
?>

// Bucle

<?php endwhile; wp_reset_postdata(); ?>

<div id="pagination" class="clearfix">
    <?php posts_nav_link(); ?>
</div>

El código anterior está mostrando 2 entradas, pero no muestra los enlaces de paginación

Este es mi código del tipo de contenido personalizado:

function custom_post_news() {
    register_post_type( 'news',
        array('labels' => array(
            'name' => __('Noticias', 'nombre general del tipo de contenido'), /* Este es el Título del Grupo */
            'singular_name' => __('Noticia', 'nombre singular del tipo de contenido'), /* Este es el tipo individual */
            'add_new' => __('Añadir Nueva', 'elemento de tipo de contenido personalizado'), /* El elemento del menú añadir nuevo */
            'add_new_item' => __('Añadir Nueva'), /* Título Añadir Nuevo */
            'edit' => __( 'Editar' ), /* Diálogo de Edición */
            'edit_item' => __('Editar'), /* Título de Edición */
            'new_item' => __('Nueva '), /* Título Nuevo */
            'view_item' => __('Ver'), /* Título Ver */
            'search_items' => __('Buscar noticias'), /* Título de Búsqueda de Tipo Personalizado */
            'not_found' =>  __('Nada encontrado en la Base de Datos.'), /* Esto se muestra si no hay entradas aún */
            'not_found_in_trash' => __('Nada encontrado en la Papelera'), /* Esto se muestra si no hay nada en la papelera */
            'parent_item_colon' => ''
        ), /* fin de los arrays */
            'description' => __( 'Este es el ejemplo de tipo de contenido personalizado' ), /* Descripción del Tipo Personalizado */
            'public' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'show_ui' => true,
            'query_var' => true,
            'menu_position' => 2, /* este es el orden en que quieres que aparezca en el menú del lado izquierdo */
            'capability_type' => 'post',
            'hierarchical' => false,
            'rewrite' => array('slug' => 'news', 'with_front' => true ),
            /* el siguiente es importante, indica qué está habilitado en el editor de entradas */
            'supports' => array( 'title', 'editor', 'thumbnail')
        )
    );

}


// REGISTRAR TAXONOMÍAS

add_action( 'init', 'custom_post_news');
register_taxonomy( 'custom_news',
    array('news'), /* si cambias el nombre de register_post_type( 'movies', entonces tienes que cambiar esto */
    array('hierarchical' => true,
        'labels' => array(
            'name' => __( 'Categorías de Noticias' ), /* nombre de la taxonomía personalizada */
            'singular_name' => __( 'Categoría de Noticia' ), /* nombre singular de taxonomía */
            'search_items' =>  __( 'Buscar Categorías de Noticias' ), /* título de búsqueda para taxonomía */
            'all_items' => __( 'Todas las Categorías de Noticias' ), /* título para todas las taxonomías */
            'parent_item' => __( 'Categoría de Noticia Padre' ), /* título padre para taxonomía */
            'parent_item_colon' => __( 'Categoría de Noticia Padre:' ), /* título de taxonomía padre */
            'edit_item' => __( 'Editar Categoría de Noticia' ), /* título de edición de taxonomía personalizada */
            'update_item' => __( 'Actualizar Categoría de Noticia' ), /* título de actualización para taxonomía */
            'add_new_item' => __( 'Añadir Nueva noticia' ), /* título añadir nuevo para taxonomía */
            'new_item_name' => __( 'Nueva Noticia Personalizada' ) /* título de nombre para taxonomía */
        ),
        'show_ui' => true,
        'query_var' => true,
    )
);

Este es un tema personalizado (comenzado desde cero) así que no hay nada en mi functions.php que se refiera a una paginación. He buscado exhaustivamente en Internet respuestas, pero obtengo una solución diferente y nada parece funcionar.

Tampoco tengo un archive-news.php ya que no estoy seguro si esto necesita ser implementado o no.

0
Todas las respuestas a la pregunta 1
7

posts_nav_link() no funcionará aquí

Útil para proporcionar navegación "paginada" en páginas de índice, categorías y archivos.

Tendrás que usar las funciones más genéricas next_posts_link() y previous_posts_link(). Solo asegúrate de configurar el parámetro $max_pages para next_posts_links() de lo contrario no funcionará, y ten en cuenta que, si por casualidad estás usando esta página como página frontal estática, entonces debes usar page, no paged

EDIT 1

Usa los enlaces mencionados anteriormente de la siguiente manera

next_posts_link( 'Entradas más antiguas', $loop->max_num_pages );
previous_posts_link( 'Entradas más recientes' );

EDIT 2

Creo que hay un pequeño malentendido. Intenta lo siguiente:

  • En los argumentos de tu tipo de entrada personalizada donde registras tu tipo de entrada personalizada, agrega lo siguiente: 'has_archive' => true. Tu función debería verse así

    function custom_post_news() {
        register_post_type( 'news',
            array('labels' => array(
                'name' => __('Noticias', 'post type general name'), /* Este es el Título del Grupo */
                'singular_name' => __('Noticia', 'post type singular name'), /* Este es el tipo individual */
                'add_new' => __('Agregar nueva', 'custom post type item'), /* El ítem del menú agregar nuevo */
                'add_new_item' => __('Agregar nueva'), /* Título de visualización de Agregar nueva */
                'edit' => __( 'Editar' ), /* Diálogo de edición */
                'edit_item' => __('Editar'), /* Título de visualización de Editar */
                'new_item' => __('Nueva '), /* Título de visualización de Nueva */
                'view_item' => __('Ver'), /* Título de visualización de Ver */
                'search_items' => __('Buscar noticias'), /* Título de búsqueda de tipo personalizado */
                'not_found' =>  __('No se encontró nada en la base de datos.'), /* Esto se muestra si no hay entradas aún */
                'not_found_in_trash' => __('No se encontró nada en la papelera'), /* Esto se muestra si no hay nada en la papelera */
                'parent_item_colon' => ''
            ), /* fin de arrays */
                'description' => __( 'Este es un ejemplo de tipo de entrada personalizada' ), /* Descripción del tipo personalizado */
                'public' => true,
                'publicly_queryable' => true,
                'exclude_from_search' => false,
                'show_ui' => true,
                'query_var' => true,
                'menu_position' => 2, /* este es el orden en que quieres que aparezca en el menú del lado izquierdo */
                'capability_type' => 'post',
                'hierarchical' => false,
                'rewrite' => array('slug' => 'news', 'with_front' => true ),
                'has_archive' => true,
                /* el siguiente es importante, indica lo que está habilitado en el editor de entradas */
                'supports' => array( 'title', 'editor', 'thumbnail')
            )
        );
    
    }
    
  • Actualiza tus enlaces permanentes después de esta adición y luego visita la página de inicio

  • Crea un archive-news.php. Debería verse así

    <?php
        while ( have_posts() ) : the_post();
    ?>
    
    // Loop
    
    <?php endwhile; ?>
    
    <div id="pagination" class="clearfix">
        <?php posts_nav_link(); ?>
    </div>
    
  • A continuación, en tu functions.php, usa pre_get_posts para modificar la consulta principal según sea necesario.

    add_action( 'pre_get_posts', function ( $q ) {
    
        if( !is_admin() && $q->is_main_query() && $q->is_post_type_archive( 'news' ) ) {
    
            $q->set( 'posts_per_page', 2 );
    
        }
    
    });
    
  • Elimina la página que has creado en el backend. Todo debería funcionar perfectamente ahora

1 feb 2015 16:57:09
Comentarios

Lo siento, veo que acabas de comentar justo cuando lo resolví, así que los borré. De todos modos, gracias por las actualizaciones. Funciona en términos de mostrar el enlace 'Entradas antiguas', pero enlaza de vuelta a la página index.php

Jack Barham Jack Barham
1 feb 2015 20:51:30

Eso tiene que ver con tus reglas de reescritura. ¿Has actualizado tus enlaces permanentes?

Pieter Goosen Pieter Goosen
1 feb 2015 20:52:51

Ups, pensé que se formatearía

Jack Barham Jack Barham
1 feb 2015 20:55:51

Ese código (segundo bloque de código en la pregunta) ya está en mi functions.php - He hecho otro flush guardando nuevamente la página de ajustes de permalinks y aún no funciona.

Jack Barham Jack Barham
1 feb 2015 21:13:09

Claro, ya he eliminado ese comentario. He separado el endwhile y lo he colocado después del bucle, luego he añadido mis enlaces next y prev post_links y lo he cerrado con wp_reset_postdata(); he vaciado la caché y sigue llegando al index.php

Jack Barham Jack Barham
1 feb 2015 21:28:01

¡Eres un crack! Ha funcionado. Esto es lo que hice (para ayudar a otros). Usé tu código de next/prev. Añadí has_archive => true a register_post_type y luego moví todo el código de page-news.php a archive-news.php y ha funcionado. Agradezco tu ayuda.

Jack Barham Jack Barham
1 feb 2015 21:53:27

Revisa mi actualización, acabo de hacer lo mismo en una edición con la forma correcta de hacerlo. Me voy a dormir ahora. Espero que mi actualización también te ayude. Disfruta :-)

Pieter Goosen Pieter Goosen
1 feb 2015 21:54:13
Mostrar los 2 comentarios restantes