Pagine di archivio dei custom post type con paginazione

Vediamo com’è possibile creare una pagina di archivio personalizzata per custom post type.

Per la pagina di archivio usiamo un template di pagina. All’interno creiamo un loop personalizzato che richiama i custom post type, nel nostro esempio il custom post type si chiama classified.

<?php
/**
 * Template Name: Classified
 */
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
?>

<?php get_header(); ?>

    <div id="container" class="row-inner">
        <div id="content">

         <?php
            if( ! is_paged() ) :
            while ( have_posts() ) : the_post(); ?>


                <?php if ( has_post_thumbnail() ) :?>
                    <div class="post-preview"><?php the_post_thumbnail('large') ?></div>
                <?php endif; ?>
                <article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix' ); ?> role="article">
                    <div class="entry-content clearfix">
                  <?php the_content(); ?>
                    </div>
                </article>
         <?php endwhile;
         endif;
         ?>
            <div class="archive-classified">
         <?php
         $classified_post = new WP_Query( array(
            'posts_per_page' => get_option( 'posts_per_page' ),
            'post_type'      => 'classified',
            'paged' => $paged
         ) );
         $max_pages = $classified_post->max_num_pages;
         $args = array(
            'base'               => get_pagenum_link() . '%_%',
            'format'             => 'page/%#%',
            'total'              => $max_pages,
            'current'            => $paged,
            'show_all'           => false,
            'end_size'           => 1,
            'mid_size'           => 2,
            'prev_next'          => true,
            'prev_text'          => __('« Annunci Nuovi'),
            'next_text'          => __('Annunci vecchi »'),
            'type'               => 'list',
            'add_args'           => false,
            'add_fragment'       => '',
            'before_page_number' => '',
            'after_page_number'  => ''
         );
         ?>
                <nav class="post-navigation" role="navigation">
                  <?php echo paginate_links($args ) ?>
                </nav>
         <?php if ( $classified_post->have_posts() ) :
            while ( $classified_post->have_posts() ) : $classified_post->the_post(); ?>
                    <article id="post-<?php the_ID(); ?>" <?php post_class('post-entry clearfix'); ?> role="article">
                  <?php mnky_post_links(); ?>
                        <header class="post-entry-header">
                            <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'care' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
                           <?php the_title(); ?>
                                </a>
                            </h2>
                            <span class="meta-date"><?php echo get_the_date() ?></span>
                            <span class="meta-category"><?php the_category( ', ' ) ?></span>
                        </header><!-- .entry-header -->
                        <div class="entry-summary">
                            <a href="<?php the_permalink() ?>">Vedi annuncio</a>
                        </div>
                    </article>
            <?php endwhile;

         else :
            get_template_part( 'content', 'none' );
         endif;
         wp_reset_postdata();
         ?>

            <nav class="post-navigation" role="navigation">
              <?php echo paginate_links($args ) ?>
            </nav>
        </div>

        </div><!-- #content -->
    </div><!-- #container -->

<?php get_footer(); ?>

Quando definiamo i custom post type tramite la funzione register_post_type il valore has_archive deve essere impostato a true come nel codice di esempio qui sotto.

$args    = array(
   'label'               => __( 'Classified', 'TEXTDOMAIN' ),
   'description'         => __( 'Classified post', 'TEXTDOMAIN' ),
   'labels'              => $labels,
   'supports'            => array( 'title', 'editor', 'thumbnail' ),
   'taxonomies'          => array( 'category' ),
   'hierarchical'        => false,
   'public'              => true,
   'show_ui'             => true,
   'show_in_menu'        => true,
   'menu_position'       => 5,
   'menu_icon'           => 'dashicons-screenoptions',
   'show_in_admin_bar'   => true,
   'show_in_nav_menus'   => true,
   'can_export'          => true,
   'has_archive'         => true,
   'exclude_from_search' => false,
   'publicly_queryable'  => true,
   'rewrite'             => $rewrite,
   'capability_type'     => 'page',
   'show_in_rest'        => false,
);
register_post_type( 'classified', $args );

Ora basta creare un pagina, assegnare il template di pagina classified e pubblicare.