Wordpress - Custom Taxonomy Pagination
Solution 1
Put this into your "functions.php" and then regenerate permalinks. It works to me!
function taxonomy_rewrite_fix($wp_rewrite) {
$r = array();
foreach($wp_rewrite->rules as $k=>$v){
$r[$k] = str_replace('catalog=$matches[1]&paged=','catalog=$matches[1]&page=',$v);
}
$wp_rewrite->rules = $r;
}
add_filter('generate_rewrite_rules', 'taxonomy_rewrite_fix');
The key is to replace "paged" to "page" into the rewrite rule for your custom taxonomy.
This is my first contribution here. Hope I help you.
Solution 2
What helped me is to set "Blog pages show at most" in Reading Settings to 1. Then it works.
With the default 10, it throws 404 error on page 2. On page 1 it's all perfect.
So given this works, the solution is to set "Blog pages show at most" to 1 only for those taxonomies or categories you need. The code you should place inside functions.php is here: https://forums.envato.com/t/wordpress-custom-page-type-taxonomy-pagination/76549/12
Solution 3
Once I have faced problem about this and passed hard times hrs to hrs by pulling hair. I googled and didn't found any specific solution about the topics. I found several talents' article but they weren't satisfying my problems. Actually custom taxonomy archive page pagination is depends on some settings of arguments of related functions. So I am actually going here sharing my thoughts of solving the taxonomy archive pagination problem.
Five things you need for custom taxonomy archive page pagination working perfectly :
( 1 ) Don't put exclude_from_search
parameter key as register_post_type
argument parameter or
if mention set it 'exclude_from_search' => false
. By default it is set false
if not mentioned.
( 2 ) The taxonomy that will be use with the custom post type set
'taxonomies' => 'custom_taxonomy_name'
as register_post_type
argument parameter or
use register_taxonomy_for_object_type()
directly.
Custom taxonomies still need to be registered with register_taxonomy()
.
( 3 ) While querying within new WP_Query ($args)
i ) If not set in admin `static front page` use before `new WP_Query($args)`
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
and use $query = new WP_Query( array( 'paged' => $paged ) );
ii ) If set in admin static front page use before 'new WP_Query($args)'
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
and use $query = new WP_Query( array( 'page' => $paged ) );
Remember to use posts_per_page
and paged
parameter in new WP_Query($arg)
argument array.
If not set static front page
then you should use page
parameter in new WP_Query ($arg)
argument array
( 4 ) Use Wordpress paginate_links( $args )
function like the example below to render pagination in archive template file.
<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%', or '/paged=%#%', // if using pretty permalink
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
?>
( 5 ) The paginate_links()
function output the ul li
listing with page-numbers
class.
If you use bootstrap inject pagination
class to the ul
with the help of javascript or jquery and a nice fancy pagination will be output.
Hope you can now enjoy pagination in the taxonomy archive template without any 404 problem :-)
Comments
-
Fredmat almost 2 years
I'm using:
- Wordpress 3.4
- WP-PageNavi 2.82
I register custom taxonomy (catalog)
<?php add_action('init', 'pca_register_taxonomy', 0); function pca_register_taxonomy() { register_taxonomy('catalog', null, array( 'label' => __('Catalogs', __), 'labels' => array( 'name' => __('Catalogs', __), 'singular_name' => __('Catalog', __), 'search_items' => __('Search Catalogs', __), 'popular_items' => __('Popular Catalogs', __), 'all_items' => __('All Catalogs', __), 'parent_item' => __('Parent Catalog', __), 'parent_item_colon' => __('Parent Catalog', __), 'edit_item' => __('Edit Catalog', __), 'update_item' => __('Update Catalog', __), 'add_new_item' => __('Add New Catalog', __), 'new_item_name' => __('New Catalog Name', __), 'separate_items_with_commas' => __('Separate catalogs with commas', __), 'add_or_remove_items' => __('Add or remove catalogs', __), 'choose_from_most_used' => __('Choose from the most used catalogs', __), 'menu_name' => __('Catalogs', __) ), 'public' => true, 'show_in_nav_menus' => true, 'show_ui' => true, 'show_tagcloud' => false, 'hierarchical' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'catalog', 'with_front' => true, 'hierarchical' => true ), 'capabilities' => array( 'manage_terms', 'edit_terms', 'delete_terms', 'assign_terms' ) ) ); } ?>
I register custom post type (product)
<?php add_action('init', 'pca_register_post_type'); function pca_register_post_type() { register_post_type('product', array( 'label' => __('Products', __), 'labels' => array( 'name' => __('Products', __), 'singular_name' => __('Product', __), 'add_new' => __('Add New', __), 'add_new_item' => __('Add New Product', __), 'edit_item' => __('Edit Product', __), 'new_item' => __('New Product', __), 'all_items' => __('All Products', __), 'view_item' => __('View Product', __), 'search_items' => __('Search Products', __), 'not_found' => __('No products found', __), 'not_found_in_trash' => __('No products found in Trash', __), 'parent_item_colon' => '', 'menu_name' => __('Products', __) ), 'description' => '', 'public' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_nav_menus' => true, 'show_in_menu' => true, 'show_in_admin_bar' => true, 'menu_position' => 20, 'capability_type' => 'post', 'meta_cap' => true, 'hierarchical' => false, 'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'post-formats' ), 'taxonomies' => array('catalog'), 'has_archive' => false, 'rewrite' => array( 'slug' => 'products', 'with_front' => true, 'feeds' => false, 'pages' => true ), 'query_var' => true, 'can_export' => true ) ); } ?>
Then I create a new file for tax -> taxonomy-catalog.php
In this file, I query all products (custom post type) from specified catalog (tax):
<?php $paged = get_query_var('paged'); $paged = ($paged) ? $paged : 1; $products = new WP_Query(array( 'catalog' => $catalog_data->slug, // $catalog_data is the current taxonomy (woman) 'post_type' => 'product', 'posts_per_page' => 12, 'paged' => $paged )); ?> <?php while ($products->have_posts()) : $products->the_post(); ?> // Show title, content ... everything ok <?php endwhile; ?> <?php if (function_exists('wp_pagenavi')) wp_pagenavi(array('query' => $products)); ?> <?php wp_reset_postdata(); ?>
Pagination is displayed correctly but when I click on page 2 or over I have a 404 error.
- Works -> mywebsite.com/catalog/woman
- Works not -> mywebsite.com/catalog/woman/page/2
I already refreshed permalinks.
Any idea to fix this ? thanks
-
Fredmat almost 12 yearsI just tried with default permalinks and website.com/?catalog=woman&page=2 works contrariwise website.com/?catalog=woman&paged=2 not
-
Logic Wreck almost 12 yearsAs far as i know wp-pagenavi is not used well with the recreated WP_Query. Did you try to use $query_string ?
-
Khodadad almost 8 yearsI have exact same problem but still getting 404 page.
-
Marko over 5 yearsDaymn, you've saved my DAYS. But let me suggest maybe better solution I came up a little bit latter: add_action('init', function() { add_rewrite_rule( '^catalog/(.+)/page/?([0-9]{1,})/?$', 'index.php?catalog=$matches[1]&page=$matches[2]', 'top' ); });
-
RydelHouse almost 4 yearsGive him a medal!