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.
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
brbrp 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;
}
Topic offsets pre-get-posts wp-query pagination Wordpress
Category Web