Offset Page Loops and Pagination

I have really been struggling with getting the main loop for the index.php to work properly with WP_Query functions. I need the grid array of 6 featured images at the top to not be offset at all, while offsetting the main posts loop below it by 6 posts.

Anything involving query_posts() inevitably ends up breaking the pagination. Using a single loop fixes the pagination issue, but undesirably applies the offset to the featured grid section. I have managed to get the pagination main loop to work using WordPress codex’s recommended fix of pre_get_posts https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination.
However, this fix overwrites the featured posts loop settings by 6 as well.

The offset/pagination dilemma seems to be a well known issue to WordPress developers, and I’ve browsed dozens of articles, forums, and tutorials but I can’t find much documentation on what to do when the pre_get_posts fix overrides other custom loop settings on the index. The pre_get_posts works to a degree, I just want the formatting to only apply to the main posts loop on the home page, not the top 6 posts.

I have attempted using a custom WP_Query class and even tried splitting the main loop into two separate queries against recommended best practice standards, but I can’t seem to get the offset arguments to apply to individual sections of the loop, even when putting the grid loop into a separate php template file referenced into the index.

I don’t know if I just made a dumb mistake with declaring the if/while statements and wp_queries or if I am doing something else completely wrong.

Here is the code. Thanks for taking the time to read this.

index.php:

<?php get_header();
do_shortcode( ‘[mg-masonry_js]’ );
$options = get_option(‘mg_options’);
$option_cats = $options[‘mg-posts-categories’];
$option_pg_number = $options[‘mg-posts-post-per-page’];
$args = array(
‘post_type’ => ‘post’,
‘post_status’ => array( ‘publish’ ),
‘posts_per_page’ => $option_pg_number,
‘orderby’ => ‘date’,
‘order’ => ‘DESC’,
‘cat’ => $option_cats,
‘offset’ => 0,
);
?>

<div id=”all-content-wrapper”>
<div id=”home-content” >
<div id=”grid”>

<?php if ($paged < 1 ) {
$paged = get_query_var(‘paged’); ?>

<?php // initialize main loop ?>

<?php $grid_query = new WP_Query( $args );

if ( $grid_query->have_posts() ) :
while ( $grid_query->have_posts()) : $grid_query->the_post();
?>

<?php switch ( $grid_query->current_post ) {
case 0 :
?>
<?php // First featured image code here ?>
<?php echo get_template_part(‘grid_featured’); ?>

<?php break; ?>

<?php // Grid image array code here ?>
<?php default : ?>
<?php echo get_template_part(‘grid’); ?>

<?php } ?> <?php // end switch ?>

<?php endwhile;

wp_reset_postdata();
rewind_posts();
else : ?>
<h2><?php _e(‘No posts.’, ‘news portal’ ); ?></h2>
<br><br><p class=”lead”><?php _e(‘No posts to display.’, ‘news portal’ ); ?></p>
<?php endif; ?>

<?php } // end paged switch ?>
</div> <?php // end grid ?>

<div id=”primary” class=”content-area”>
<main id=”main” class=”site-main” role=”main”>

<?php
$args = array(
‘post_type’ => ‘post’,
‘posts_per_page’ => 10,
‘offset’ => 6,
);
?>

<?/* Start the Loop */?>
<? $main_query = new WP_Query( $args );
if ( have_posts() ) :

while ( have_posts() ) : the_post();

get_template_part( ‘template-parts/blog’, get_post_format() );

endwhile;

echo regular_pagination();

else :

get_template_part( ‘template-parts/content’, ‘none’ );

endif; ?>

</main><!– #main –>
</div><!– #primary –>

<?php news_portal_get_sidebar();?>

</div><!– #all_content_wrapper –>

<?php get_footer();?>

functions.php:

/*–Offset Pre_Get_Posts pagination fix–*/
add_action(‘pre_get_posts’, ‘myprefix_query_offset’, 1 );
function myprefix_query_offset(&$query) {

if ( ! $query->is_home() ) {
return;
}

$offset = 6;

$ppp = get_option(‘posts_per_page’);

if ( $query->is_paged ) {

$page_offset = $offset + ( ($query->query_vars[‘paged’]-1) * $ppp );

$query->set(‘offset’, $page_offset );

}
else {

$query->set(‘offset’,$offset);

}
}

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

$offset = 6;

if ( $query->is_home() ) {
return $found_posts – $offset;
}
return $found_posts;
}

Read more here:: Offset Page Loops and Pagination

Leave a Reply

Your email address will not be published. Required fields are marked *