Creando una paginación simple para plantillas de tipos de contenido personalizados
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.

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

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

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

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.

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

¡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.
