0

I'm trying to offset my main blog query by 3 posts whilst trying to get the pagination to function correctly. I've been following the codex reference here but I'm struggling to get it working as I want.

Basically I have 3 loops on my blog page, one to get the recent posts, the main loop that I want to offset by 3 and a popular posts loop. I currently have it working and everything is displaying correctly on the front end, however, in the backend it is offsetting my posts by 3 so 3 of them are missing (I assume because I'm targeting the main query). Here is my functions.php code:

// Offset Posts

function wpsites_exclude_latest_post( $query ) {
    if ( $query->is_home() && $query->is_main_query()) {
        $query->set( 'offset', '1' );
    }
}
add_action( 'pre_get_posts', 'wpsites_exclude_latest_post', 1 );

add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

    //Before anything else, make sure this is the right query...
    if ( ! $query->is_main_query()) {
        return;
    }

    //First, define your desired offset...
    $offset = 3;

    //Next, determine how many posts per page you want (we'll use WordPress's settings)
    $ppp = get_option('posts_per_page');

    //Next, detect and handle pagination...
    if ( $query->is_paged ) {

        //Manually determine page query offset (offset + current page (minus one) x posts per page)
        $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );

        //Apply adjust page offset
        $query->set('offset', $page_offset );

    }
    else {

        //This is the first page. Just use the offset...
        $query->set('offset',$offset);

    }
}

add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {

    //Define our offset again...
    $offset = 3;

    //Ensure we're modifying the right query object...
    if ( $query->is_home() && $query->is_main_query() ) {
        //Reduce WordPress's found_posts count by the offset... 
        return $found_posts - $offset;
    }
    return $found_posts;
}

Here is my code for the blog page:

<div class="container">
    <div class="slider-recent-posts" id="recent-posts">
        <?php $args= array (
            'posts_per_page' => 3
        ); ?>
        <?php $recent = new WP_QUERY($args); while($recent->have_posts()): $recent->the_post(); ?>
        <div class="slide">
            <div class="post">
                <div class="content">
                    <div class="blog-info">
                        <p><?php the_category(', '); ?></p>
                        <h3><?php the_title(); ?></h3>
                        <p><?php echo the_excerpt(); ?></p>
                        <a href="<?php the_permalink(); ?>" class="wo-btn full">Read more</a>
                    </div>
                </div>
                <div class="image">
                    <?php the_post_thumbnail('entry', array('class' => 'blog-img') ); ?>
                </div>
            </div>
        </div>
        <?php endwhile; wp_reset_postdata(); ?>
    </div>
</div>

<div class="container main-blog">
    <div class="row">
        <div class="col-md-8">
            <div class="row">

                    <?php while (have_posts()): the_post(); ?>
                    <div class="col-md-6">
                        <div class="blog-card">
                            <?php the_post_thumbnail('entry', array('class' => 'blog-img') ); ?>

                            <div class="entry-content">
                                <p class="category"><?php the_category(', '); ?></p>
                                <h3><?php the_title(); ?></h3>

                                <p><?php echo the_excerpt(); ?></p>

                                <a href="<?php the_permalink(); ?>" class="wo-btn full">Read more</a>
                            </div>
                        </div>
                    </div>

                    <?php endwhile; wp_reset_postdata();?>
            </div>



            <?php understrap_pagination(); ?>
        </div>
        <div class="col-md-4">
            <?php get_template_part( 'custom-side-bar' ); ?>
        </div>
    </div>
</div>

How can I get this working so it only targets the main loop on the blog page without affecting other queries or anything in the backend?

Any thoughts would be much appreciated!!

  • You can use is_admin() - e.g. if ( is_admin() || ! $query->is_main_query() ) { return; } in your myprefix_query_offset() function. – Sally CJ Mar 8 at 2:42
  • why do you have 2 filters that are setting offset? The first one is setting offset to 1 for home and the second one is setting it to 3 for every query? Is this intentional? – Krzysiek Dróżdż Mar 8 at 6:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.