Creare una semplice paginazione per i template dei tipi di post personalizzati

1 feb 2015, 15:23:55
Visualizzazioni: 52.8K
Voti: 0

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?

0
Tutte le risposte alla domanda 1
7

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

1 feb 2015 16:57:09
Commenti

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

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

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

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

Ops, pensavo che si formattasse

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

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.

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

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

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

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.

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

Controlla il mio aggiornamento, ho appena fatto la stessa cosa in una modifica con il modo corretto per farlo. Ora vado a letto. Spero che il mio aggiornamento ti sia utile anche. Buon divertimento :-)

Pieter Goosen Pieter Goosen
1 feb 2015 21:54:13
Mostra i restanti 2 commenti