Get Previous & Next posts by Post ID

Take a look at get_previous_post() and get_next_post() and you’ll see they both use the get_adjacent_post() to find the previous or next post.

Let’s say you want to fetch the ID of the immediately previous post based on the current post’s ID. This is what you’d do:

function get_previous_post_id( $post_id ) {
    // Get a global post reference since get_adjacent_post() references it
    global $post;

    // Store the existing post object for later so we don't lose it
    $oldGlobal = $post;

    // Get the post object for the specified post and place it in the global variable
    $post = get_post( $post_id );

    // Get the post object for the previous post
    $previous_post = get_previous_post();

    // Reset our global object
    $post = $oldGlobal;

    if ( '' == $previous_post ) {
        return 0;
    }

    return $previous_post->ID;
}

You can do a similar thing to fetch the next post’s ID … and you can do this recursively if you need to get the previous previous post:

$two_posts_ago = get_previous_post_id( get_previous_post_id( $post->ID ) );

TL;DR

Essentially, both get_previous_post() and get_next_post() reference a global $post object to do their selection. You need to set this object up before calling either function or they won’t know what post to use as a reference for next/previous.

The wrapper function above just sets up the global $post for you based on a passed-in ID. You could have it return the entire object for the previous post rather than the ID, it’s entirely up to you.

Leave a Comment