Related Posts with Thumbnails in Genesis – Reloaded

Posted on
5/5 - (434 votes)

The code below when added to child theme’s functions.php will print 5 posts related to the current entry above the comments on single posts in Genesis.

add_action( 'genesis_before_comments', 'sk_related_posts', 12 );
/**
* Outputs related posts with thumbnail
*
* @author Nick the Geek
* @url http://designsbynickthegeek.com/tutorials/related-posts-genesis
* @global object $post
*/
function sk_related_posts() {

global $do_not_duplicate;

if ( ! is_singular ( 'post' ) ) {
return;
}

$count = 0;

$related = '';

$do_not_duplicate = array();

$tags = wp_get_post_tags( get_the_ID() );

$cats = wp_get_post_categories( get_the_ID() );

// If we have some tags, run the tag query.
if ( $tags ) {
$query = sk_related_tag_query( $tags, $count );
$related .= $query['related'];
$count = $query['count'];
}

// If we have some categories and less than 5 posts, run the cat query.
if ( $cats && $count <= 4 ) {
$query = sk_related_cat_query( $cats, $count );
$related .= $query['related'];
$count = $query['count'];
}

// End here if we don't have any related posts.
if ( ! $related ) {
return;
}

// Display the related posts section.
echo '<div class="related">';
echo '<h3 class="related-title">You might also enjoy...</h3>';
echo '<div class="related-posts-list" data-columns>' . $related . '</div>';
echo '</div>';

}

function sk_related_tag_query( $tags, $count ) {

global $do_not_duplicate;

if ( ! $tags ) {
return;
}

$postIDs = array( get_the_ID() );

foreach ( $tags as $tag ) {
$tagID[] = $tag->term_id;
}

$tax_query = array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote'
),
'operator' => 'NOT IN'
)
);
$args = array(
'tag__in' => $tagID,
'post__not_in' => $postIDs,
'showposts' => 5,
'ignore_sticky_posts' => 1,
'tax_query' => $tax_query,
);

$related = '';

$tag_query = new WP_Query( $args );

if ( $tag_query->have_posts() ) {
while ( $tag_query->have_posts() ) {
$tag_query->the_post();

$do_not_duplicate[] = get_the_ID();

$count++;

// $title = genesis_truncate_phrase( get_the_title(), 35 );
$title = get_the_title();

$related .= '<div class="related-post">';
$related .= '<a class="related-post-title" href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . $title . '">' . $title . '</a>';
$related .= '<a class="related-image" href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . $title . '">' . genesis_get_image( array( 'size' => 'related' ) ) . '</a>';
$related .= '</div>';
}
}

wp_reset_postdata();

$output = array(
'related' => $related,
'count' => $count
);

return $output;
}

function sk_related_cat_query( $cats, $count ) {

global $do_not_duplicate;

if ( ! $cats ) {
return;
}

$postIDs = array_merge( array( get_the_ID() ), $do_not_duplicate );

$catIDs = array();

foreach ( $cats as $cat ) {
if ( 3 == $cat ) {
continue;
}
$catIDs[] = $cat;
}

$showposts = 5 - $count;

$tax_query = array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote'
),
'operator' => 'NOT IN'
)
);
$args = array(
'category__in' => $catIDs,
'post__not_in' => $postIDs,
'showposts' => $showposts,
'ignore_sticky_posts' => 1,
'orderby' => 'rand',
'tax_query' => $tax_query,
);

$related = '';

$cat_query = new WP_Query( $args );

if ( $cat_query->have_posts() ) {
while ( $cat_query->have_posts() ) {
$cat_query->the_post();

$count++;

// $title = genesis_truncate_phrase( get_the_title(), 35 );
$title = get_the_title();

$related .= '<div class="related-post">';
$related .= '<a class="related-post-title" href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . $title . '">' . $title . '</a>';
$related .= '<a class="related-image" href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . $title . '">' . genesis_get_image( array( 'size' => 'related' ) ) . '</a>';
$related .= '</div>';

}
}

wp_reset_postdata();

$output = array(
'related' => $related,
'count' => $count
);

return $output;

}