I think the best way to implement this is to use pre_get_posts
hook. Take a look at this code
function customize_query( $query ) {
$post = get_posts(array(
'post_type' => 'projects',
'taxonomy' => 'featured',
'numberposts' => 1
));
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'post_type', 'projects' );
$query->set( 'posts_per_page', 6 );
if($post && !empty($post))
$query->set( 'post__not_in', array($post[0]->ID) );
}
}
add_action( 'pre_get_posts', 'customize_query' );
Then in your home page
$post = get_posts(array(
'post_type' => 'projects',
'taxonomy' => 'featured',
'numberposts' => 1
));
// display the post just retrieved, it must be coming from cache
// we can use the global query since now it contains the 6 posts we want
while(have_posts()) :
the_post();
// display the post
endwhile;
You’ll need to modify it a lot but it might help you achieve what you want. In here the pagination should wotrk as normal since you just modified the main page query