Recently I have faced a pagination problem with the custom post type on the custom archive page. It was showing a 404 page when I select page/2. I have Googled a lot and didn’t find the exact solution. Finally, I fixed the problem and I am sharing the code maybe it could help you.
My custom post type name: testimonials and my category name: testimonial-cat.
Plugin I used: SuperCPT and WP-PageNavi.
function.php
// function.php
// Testimonial Pages
$testimonial = new Super_Custom_Post_Type( 'testimonial', 'Testimonial', 'Testimonials', ['hierarchical'=> true, 'publicly_queryable' => true, 'query_var' => true, 'rewrite' => ['slug' => 'testimonials', 'with_front' => false, 'pages' => true]] );
$testimonial_cat = new Super_Custom_Taxonomy( 'testimonial-cat', 'Testimonial Category', 'Testimonial Categories', 'category' );
$testimonial->add_to_columns( 'trip_code' );
$testimonial->add_to_columns( 'testimonial-cat' );
$testimonial->set_icon( 'comments' );
connect_types_and_taxes($testimonial,array($testimonial_cat));
}
add_action( 'after_setup_theme', 'custom_post_type' );
// Flush rewrite rules for custom post types
add_action( 'after_switch_theme', 'flush_rewrite_rules' );
function flush_rewrite_rules() {
flush_rewrite_rules();
}
// Fix 404 issue
function testimonialPagination( $query ) {
if( $query->is_main_query() && !$query->is_feed() && !is_admin() ) {
$query->set( 'paged', str_replace( '/', '', get_query_var( 'page' ) ) );
}
}
add_action('pre_get_posts','testimonialPagination');
I created a custom archive page(archive-testimonial.php) to show my posts.
<?php
//archive-testimonial.php
//$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // Did'nt work
global $wp;
$url = home_url(add_query_arg(array($_GET), $wp->request));
if(preg_match("/\/(\d+)$/",$url,$matches))
{
$paged=$matches[1];
}
else
{
$paged = 1;
}
//$args = array( 'post_type' =>'testimonial', 'posts_per_page' =>3 , 'page' => $paged, 'paged' => $paged );
$args = array( 'post_type' => 'testimonial', 'posts_per_page'=>get_option('posts_per_page'), 'paged' => $paged );
$the_query = new WP_Query($args);
?>
<section class="archive-posts" >
<?php if (!have_posts()) : ?>
<div class="alert alert-warning constrained">
<?php _e('Sorry, no results were found.', 'roots'); ?>
</div>
<?php endif; ?>
<div class="posts__inner">
<?php
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<?php get_template_part('templates/list-testimonial', get_post_type()); ?>
<?php endwhile; ?>
</div><?php wp_pagenavi( array( 'query' => $the_query ) ); ?>
</section>
<?php wp_reset_postdata(); ?>
That’s it! Hope it will help you.