Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I've been using get_adjacent_post() to determine the previous and next posts. How would I go about determining the next and previous links to posts matching the same tag as the current post? It seems this function allows you to do this with posts in the same category, but not with the same tag.

share|improve this question
add comment

2 Answers 2

get_adjacent_posts() has several filters for components of generated SQL query, including:

  • get_{$adjacent}_post_join
  • get_{$adjacent}_post_where

Where $adjacent can be next or previous. Source.

So there is no easy way to flip it from categories to tags, but you can manipulate SQL query and add own conditions (or change to them completely).

share|improve this answer
    
+1 for this one. –  kaiser Feb 13 '11 at 15:28
add comment

This function is just modified get_adjacent_post:

/* better get_adjacent_post */
function get_adjacent_post_by_taxonomy($tagID, $previous){
    global $wpdb;

    if ( ! $post = get_post() )
        return null;

    $current_post_date = $post->post_date;

    $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.term_id IN (" . $tagID . ")";

    $adjacent = $previous ? 'previous' : 'next';
    $op = $previous ? '<' : '>';
    $order = $previous ? 'DESC' : 'ASC';

    $join  = apply_filters( "get_{$adjacent}_post_join", $join );
    $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish'", $current_post_date, $post->post_type));
    $sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );

    $query = "SELECT p.ID FROM $wpdb->posts AS p $join $where $sort";
    $query_key = 'adjacent_post_' . md5($query);
    $result = wp_cache_get($query_key, 'counts');
    if ( false !== $result ) {
                if ( $result )
                        $result = get_post( $result );
                return $result;
        }

        $result = $wpdb->get_var( $query );
        if ( null === $result )
                $result = '';

        wp_cache_set($query_key, $result, 'counts');

        if ( $result )
                $result = get_post( $result );

        return $result;
}

Pass a category or tag's term_taxonomy_id to this functions $tax_id to use for a tag or a category. I use it like:

$tags = get_the_tags();
        if($tags) :
            foreach($tags as $tag) : ?>
...
                    <?php $prevTagPost = get_adjacent_post_by_taxonomy($tag->term_taxonomy_id,true); if (!empty( $prevTagPost )): ?>

etc.

Just like get_adjacent_post, the bool $previous toggles between previous/next.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.