Opened 11 years ago
Closed 11 years ago
#32409 closed defect (bug) (invalid)
paginate_links() shows 404 on custom post type archive
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Priority: | normal | |
| Severity: | normal | Version: | 4.3 |
| Component: | Query | Keywords: | |
| Focuses: | Cc: |
Description
This is happening only on custom post type archive pages.
The scenario is this:
- If I remove the
posts_per_pageargument fromWP_Queryit reads the value fromSettings > Readingand works fine. - If the value of
posts_per_pageinWP_Queryis bigger or equal than the value inSettings > Readingit works fine. - The problem: If the value of
posts_per_pageinWP_Queryis smaller than the value inSettings > Readingit shows page not found on every/page/x.
| Settings | WP_Query | |
|---|---|---|
| OK | 5 | / |
| OK | 5 | 5 or 5+ |
| NOT OK | 5 | 4 or smaller |
Here is my query:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$wp_query = new WP_Query( array(
'post_type' => 'custom_post_type_name',
'post_status' => 'publish',
'paged' => $paged,
'posts_per_page' => 5,
) );
And here is the pagination:
global $wp_query;
$total = $wp_query->max_num_pages;
if ( $total > 1 ) {
// get the current page
if ( !$current_page = get_query_var('paged') ) {
$current_page = 1;
}
echo paginate_links(array(
'current' => $current_page,
'format' => '/page/%#%',
'total' => $total,
'mid_size' => 4,
'type' => 'list',
'next_text' => 'next posts',
'prev_text' => 'prev posts'
));
}
Change History (4)
#2
@
11 years ago
- Component changed from General to Query
If you're overriding the main query, I'd suggest using pre_get_posts action instead of a custom WP_Query instance.
See also some related tickets in 13:ticket:20758.
#3
in reply to:
↑ 1
@
11 years ago
This is my whole $wp_query code and yes, it's the first query that appears in the template file (custom-post-type-archive.php).
Replying to boonebgorges:
Can you provide more complete details about exactly how you are overloading the query? Does your first snippet (
$wp_query = ...) appear in a theme template file?
#4
@
11 years ago
- Milestone Awaiting Review deleted
- Resolution set to invalid
- Status changed from new to closed
Thanks for the details, Kuzmanov. Based on this, I'd say that the problem is in fact unrelated to paginate_links(), and is caused by overriding the $wp_query global. If you need to modify params like 'posts_per_page', I'd recommend using the 'pre_get_posts' action, as suggested by SergeyBiryukov.
I've spent some time trying to reproduce this, given the info you've provided here. I'm able to reproduce some weird behavior, but I don't think this is the fault of
paginate_links(). I think the problem has something to do with the way that you are overriding the$wp_queryglobal - it's likely that you're doing it after the main query has already run (seeWP::main()to get a sense of the load order).To put the same point another way: When your posts_per_page is greater than 5,
/page/3/works. When posts_per_page is less than 5, the same URL,/page/3, does not work. This has nothing to do withpaginate_links().Can you provide more complete details about exactly how you are overloading the query? Does your first snippet (
$wp_query = ...) appear in a theme template file?