Previous Next Post Navigation for Multiple Post Types at once
WordPress has a great action hook that allows to change WHERE statement and affects all of the prev/next navigation functions.
add_action( 'get_previous_post_where', 'misha_posts_and_page', 20 );
add_action( 'get_next_post_where', 'misha_posts_and_page', 20 );
function misha_posts_and_page( $where ){
// $where looks like WHERE p.post_date < '2017-08-02 09:07:03' AND p.post_type = 'post' AND ( p.post_status = 'publish' OR p.post_status = 'private' )
// In code $where looks like $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s $where", $post->post_date, $post->post_type )
// Parameters $op and another $where can not be passed to this action hook
// So, I think the best way is to use str_replace()
return str_replace(
array( "p.post_type = 'post'", "p.post_type = 'page'" ),
"(p.post_type = 'post' OR p.post_type = 'page')",
$where
);
}
For three post types the str_replace()
part of the code will look like this:
return str_replace(
array( "p.post_type = 'post'", "p.post_type = 'page'", "p.post_type = 'product'" ),
"(p.post_type = 'post' OR p.post_type = 'page' OR p.post_type = 'product')",
$where
);
This action hook affects all the post prev/next navigation functions, such as next_post_link()
, previous_post_link()
, get_previous_post_link()
, get_next_post_link()
, adjacent_post_link()
, get_adjacent_post_link()
, the_post_navigation()
, get_previous_post()
, get_next_post
, get_adjacent_post()

Misha Rudrastyh
Hey guys and welcome to my website. For more than 10 years I've been doing my best to share with you some superb WordPress guides and tips for free.
Need some developer help? Contact me
This is awesome. Just what I was looking for. Thanks heaps for sharing…