Creare una semplice paginazione per i template dei tipi di post personalizzati
Ho un tipo di post personalizzato chiamato 'news' e sto avendo difficoltà a farlo paginare correttamente. Sto cercando dei semplici link precedente e successivo, non mi interessano i numeri di pagina nel mezzo.
Nel file page-news.php questo è il mio codice:
<?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();
?>
// Loop
<?php endwhile; wp_reset_postdata(); ?>
<div id="pagination" class="clearfix">
<?php posts_nav_link(); ?>
</div>
Il codice sopra mostra 2 post, ma nessun link di paginazione
Questo è il mio codice per il tipo di post personalizzato:
function custom_post_news() {
register_post_type( 'news',
array('labels' => array(
'name' => __('Notizie', 'nome generale del tipo di post'), /* Questo è il Titolo del Gruppo */
'singular_name' => __('Notizia', 'nome singolare del tipo di post'), /* Questo è il tipo individuale */
'add_new' => __('Aggiungi Nuovo', 'elemento tipo di post personalizzato'), /* La voce di menu aggiungi nuovo */
'add_new_item' => __('Aggiungi Nuovo'), /* Titolo Aggiungi Nuovo */
'edit' => __( 'Modifica' ), /* Finestra di dialogo Modifica */
'edit_item' => __('Modifica'), /* Titolo Modifica */
'new_item' => __('Nuovo '), /* Titolo Nuovo */
'view_item' => __('Visualizza'), /* Titolo Visualizza */
'search_items' => __('Cerca notizie'), /* Titolo Cerca Tipo Personalizzato */
'not_found' => __('Nessun elemento trovato nel Database.'), /* Questo viene mostrato se non ci sono ancora elementi */
'not_found_in_trash' => __('Nessun elemento trovato nel Cestino'), /* Questo viene mostrato se non c'è nulla nel cestino */
'parent_item_colon' => ''
), /* fine degli array */
'description' => __( 'Questo è l\'esempio del tipo di post personalizzato' ), /* Descrizione Tipo Personalizzato */
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'query_var' => true,
'menu_position' => 2, /* questo è l'ordine in cui vuoi che appaia nel menu laterale sinistro */
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'news', 'with_front' => true ),
/* il prossimo è importante, indica cosa è abilitato nell'editor dei post */
'supports' => array( 'title', 'editor', 'thumbnail')
)
);
}
// REGISTRA LE TASSONOMIE
add_action( 'init', 'custom_post_news');
register_taxonomy( 'custom_news',
array('news'), /* se cambi il nome di register_post_type( 'movies', allora devi cambiare anche questo */
array('hierarchical' => true,
'labels' => array(
'name' => __( 'Categorie Notizie' ), /* nome della tassonomia personalizzata */
'singular_name' => __( 'Categoria Notizia' ), /* nome singolo tassonomia */
'search_items' => __( 'Cerca Categorie Notizie' ), /* titolo ricerca per tassonomia */
'all_items' => __( 'Tutte le Categorie Notizie' ), /* tutti i titoli per le tassonomie */
'parent_item' => __( 'Categoria Notizia Genitore' ), /* titolo genitore per tassonomia */
'parent_item_colon' => __( 'Categoria Notizia Genitore:' ), /* titolo tassonomia genitore */
'edit_item' => __( 'Modifica Categoria Notizia' ), /* modifica titolo tassonomia personalizzata */
'update_item' => __( 'Aggiorna Categoria Notizia' ), /* aggiorna titolo per tassonomia */
'add_new_item' => __( 'Aggiungi Nuova notizia' ), /* aggiungi nuovo titolo per tassonomia */
'new_item_name' => __( 'Nuova Notizia Personalizzata' ) /* nome titolo per tassonomia */
),
'show_ui' => true,
'query_var' => true,
)
);
Questo è un tema personalizzato (iniziato da zero) quindi non c'è nulla nel mio functions.php che si riferisca alla paginazione. Ho cercato su Internet delle risposte, ma trovo soluzioni diverse e niente sembra funzionare.
Inoltre non ho un archive-news.php poiché non sono sicuro se questo debba essere implementato o meno?

posts_nav_link()
non funzionerà in questo caso
Utile per fornire una navigazione "impaginata" per pagine di indice, categorie e archivi.
Dovrai utilizzare le funzioni più generiche next_posts_link()
e previous_posts_link()
. Assicurati solo di impostare il parametro $max_pages
per next_posts_links()
altrimenti non funzionerà, e tieni presente che, se per caso stai usando questa pagina come pagina frontale statica, allora dovresti usare page
, non paged
MODIFICA 1
Usa i link sopra menzionati come segue
next_posts_link( 'Articoli più vecchi', $loop->max_num_pages );
previous_posts_link( 'Articoli più recenti' );
MODIFICA 2
Penso ci sia un piccolo malinteso. Prova quanto segue:
Negli argomenti del tuo custom post type dove registri il tipo di contenuto personalizzato, aggiungi il seguente parametro:
'has_archive' => true
. La tua funzione dovrebbe apparire cosìfunction custom_post_news() { register_post_type( 'news', array('labels' => array( 'name' => __('News', 'post type general name'), /* Questo è il Titolo del Gruppo */ 'singular_name' => __('News', 'post type singular name'), /* Questo è il tipo individuale */ 'add_new' => __('Aggiungi Nuovo', 'custom post type item'), /* Voce di menu Aggiungi nuovo */ 'add_new_item' => __('Aggiungi Nuovo'), /* Titolo visualizzato per Aggiungi Nuovo */ 'edit' => __( 'Modifica' ), /* Finestra di dialogo Modifica */ 'edit_item' => __('Modifica'), /* Titolo visualizzato per Modifica */ 'new_item' => __('Nuovo '), /* Titolo visualizzato per Nuovo */ 'view_item' => __('Visualizza'), /* Titolo visualizzato per Visualizza */ 'search_items' => __('Cerca news'), /* Titolo per la ricerca del tipo personalizzato */ 'not_found' => __('Nessun risultato trovato nel database.'), /* Visualizzato se non ci sono ancora voci */ 'not_found_in_trash' => __('Nessun risultato trovato nel Cestino'), /* Visualizzato se non c'è nulla nel cestino */ 'parent_item_colon' => '' ), /* fine degli array */ 'description' => __( 'Questo è un esempio di custom post type' ), /* Descrizione del tipo personalizzato */ 'public' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'show_ui' => true, 'query_var' => true, 'menu_position' => 2, /* ordine di apparizione nel menu laterale sinistro */ 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => array('slug' => 'news', 'with_front' => true ), 'has_archive' => true, /* il prossimo è importante, indica cosa è abilitato nell'editor di post */ 'supports' => array( 'title', 'editor', 'thumbnail') ) ); }
Aggiorna i permalink dopo questa aggiunta e poi visita la homepage
Crea un file
archive-news.php
. Dovrebbe apparire così<?php while ( have_posts() ) : the_post(); ?> // Loop <?php endwhile; ?> <div id="pagination" class="clearfix"> <?php posts_nav_link(); ?> </div>
Successivamente, nel tuo functions.php, usa
pre_get_posts
per modificare la query principale come necessario.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 pagina che hai creato nel backend. Ora tutto dovrebbe funzionare perfettamente

Scusa, vedo che hai appena commentato proprio mentre capivo il problema e li ho cancellati. Comunque, grazie per gli aggiornamenti. Funziona in termini di visualizzazione del link 'Articoli più vecchi', ma il link rimanda alla pagina index.php

Questo ha a che fare con le tue regole di riscrittura. Hai resettato i tuoi permalink?

Quel codice (il secondo blocco di codice nella domanda) è già nel mio functions.php - Ho fatto un altro flush salvando nuovamente la pagina delle impostazioni dei permalink ma ancora non funziona.

Certo, ho eliminato quel commento ora. Ho separato l'endwhile e l'ho posizionato dopo il loop, poi ho aggiunto i miei link next e prev post_links e l'ho chiuso con wp_reset_postdata(); ho svuotato la cache ma continua a caricare index.php

Sei un mito! Ha funzionato. Ecco cosa ho fatto (per aiutare altri). Ho usato il tuo codice next/prev. Aggiunto has_archive => true a register_post_type e poi ho spostato tutto il codice da page-news.php a archive-news.php e ha funzionato. Apprezzo il tuo aiuto.
