简体   繁体   中英

Pagination : Page 3 Not Found in a WordPress installation

My problem is pagination which I am using in Wordpress. I used the plugin WP Pagenavi . I'm not really sure what is wrong with it.

I found the answer to my problem using this code :

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=15'.'&paged=' . $paged); ?>

But to my disappointment, when I reduced the posts_per_page to 5, I CAN get the pagination to work until page 2 but when I click page 3 and so on, WordPress can't find it. I used another solution from my research:

<?php
$limit = '5';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('cat=4&showposts=' . $limit . '&paged=' . $paged);
$wp_query->is_archive = true; $wp_query->is_home = false;
?>

It still didn't help. I don't want to touch functions.php . I'm only editing category.php .

Check my block of code below :

    <?php if (is_category('category1')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=1&posts_per_page=15'.'&paged=' . $paged); ?>

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

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category2')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=2&posts_per_page=15'.'&paged=' . $paged); ?>

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

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category3')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=3&posts_per_page=5'.'&paged=' . $paged); ?>

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

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category4')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=5'.'&paged=' . $paged); ?>

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

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else { ?>

<!-- SOME CODE -->

<?php } ?>

Please note that category1 and category2 display 5 posts while the other 2 categories will display 15 posts. And these are all in the category.php.I don't want to use the # of posts set in the Settings > Reading.

If you think the if statement and putting also the cat ID is redundant, well, it does not get posts of that category name.

UPDATE

I used this code:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php $args = array ('post_type' => 'post','cat' => '4','posts_per_page' => '5','paged' => $paged);?>
<?php $my_query = new WP_Query ($args);?>

Again, it worked BUT it only shows two pages! I don't even know where the 3rd page is, supposedly there should be a 3rd page.

Your code has some serious issues

  • Never ever use query_posts , ever. It breaks the main query object on which so many plugins and functionalities rely, it also breaks pagination and fails silently, so it is really hard to debug pagination when it does fail. If you really really have to use a custom query, use WP_Query instead. You should take your time to read this post and all of the linked posts. It is really helpful as it tells you why you should not use query_posts and when should you use custom queries and when not

  • This point are coupled to the first one and the linked post. You must never change the main query to use a custom one on the homepage or any type of archive page. This always causes much more issues than what is actually solves. Always use pre_get_posts to alter the main query before it runs. This way, you lets the main query handle all the heavy lifting correctly without you breaking a sweat.

Now, to fix your issue:

  • First of all, remove all your queries, and just add this code in your category.php ( Remember to replace your pagination function, wp_pagenavi() )

     if ( have_posts() ) { while ( have_posts() ) { the_post(); // Your loop with template tags and html mark up } wp_pagenavi(); } 

    You will immediately see that your category posts are showing correctly, but the amount of posts will be the same as what you set in the back end under reading

  • We will now use pre_get_posts to alter the amount of posts per category. For this, add the following code to your functions.php ( Requires PHP 5.3+ and the code is untested )

     add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Very important, otherwise back end queries will be affected as well && $q->is_main_query() // Very important, we just need to modify the main query && $q->is_category() // Only target category pages ) { // Check on which category page we are and set posts_per_page accordingly if ( $q->is_category( array( 1, 2 ) ) ) $q->set( 'posts_per_page', 15 ); if ( $q->is_category( array( 3, 4 ) ) ) $q->set( 'posts_per_page', 5 ); } }); 

This should basically do it.

We have finally arrived to a final answer and working code!

If you read Mr. Pieter Goosen's answer above, it will help you. It really helped me. So, I'm going to give you the final answers. This is actually custom number of post in every category disregarding what is set in the settings.

So in my category.php

    <?php if (is_category('category1')) { ?>
    <?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category2')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category3')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category4')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } ?>

WHERE category1 and category2 will display 5 posts , category3 and category4 will display 15 posts .

This is what you're going to place in your functions.php.

add_action( 'pre_get_posts', function($q) {
    if (!is_admin() && $q->is_main_query() && $q->is_category()) {
        if ($q->is_category( array(1,2) )) {
            $q->set('posts_per_page', 5);
        }
        if ($q->is_category( array(3,4) )) {
            $q->set('posts_per_page', 15);
        }
    }
    return;
});

WHERE the numbers inside the array are category IDs.

If you compare my code and Sir Pieter's, it's almost the same BUT I added a return; before the add_action() is closed. But I'm quoting what Sir Pieter said:

It is really strange that you should return. pre_get_posts is a action, not a filter. But any way, glad it is solved

If it still doesn't work for you, my permalink is set to:

http://www.example.com/sample-post/[/%postname%/] .

I also have a WP No Category Base plugin to eliminate /category/ in my category URL. So instead of www.example.com/category/category1 , it will be www.example.com/category1 .

Assuming this could help for those who, like me, use a DIVI CHILD THEME !

I finally found the solution by searching divi pagination .

In fact, in my case, I built a divi child theme. However, the post per page in my custom category page is set to 3, but into my divi > theme option the Number of Posts displayed on Category page were set to 6 .

That why the page 3 was displaying an error 404. So, I set it to 1.

I read on a post that the " Blog pages show at most " into the settings > reading option have to be under the post_per_page custom query (for the home page), or else, it create a 404 page.

However, it look like that the Number of Posts displayed into the Divi option, overwrite the Blog pages show at most . Here why into my category.php page, I was stuck on page 3.

I leave you my tiny code about my custom category.php page for divi theme child :

<?php 
//query{
    //print_r(get_queried_object());
    $category = get_queried_object();
    $the_cat_nicename = $category->slug;
    $the_cat_name = $category->name;

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args_s = new WP_Query(array(
    'post_type' => 'post',
    'category_name' => $the_cat_nicename,
    'posts_per_page' => 3,
    'paged' => $paged,
    'orderby'=>'date',
    'order'=>'DESC'));
//query}
if ( $args_s->have_posts())
{
    echo $the_cat_name;
    echo '<br/>';
    while ( $args_s->have_posts())
    {
        $args_s->the_post();
        $the_id=get_the_ID($post->ID);
        echo $the_id.'<br/>';
    }
    if ($args_s->max_num_pages > 1) 
    {
        echo get_next_posts_link( $GLOBALS['older_post_lang'], $args_s->max_num_pages );
        echo get_previous_posts_link( $GLOBALS['newer_post_lang'] );
    }
}
//wordpress _have_posts}
?>

Do not forget to set your Number of Posts displayed on Category page to 1 into your Divi > theme option .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM