I’m trying to display the related posts using functions.php:
function posts_related($related){ if (is_single()) {
global $post;
// Build basic custom query arguments
$custom_query = new WP_Query( array(
'posts_per_page' => 8, // Number of related posts to display
'post__not_in' => array($post->ID), // Ensure that the current post is not displayed
'orderby' => 'rand', // Randomize the results
));
// Run the loop and output data for the results
if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post();
if ( has_post_thumbnail()
) {
$permalink = the_permalink();
$post_thumbnail = the_post_thumbnail('medium');
$title = the_title();
$related .= '<a href="' . $permalink . '"><img src="' . $post_thumbnail . '/></a>';
}
$related .= '<a href="' . $permalink . '"><b>' . $title . '</b></a>';
endwhile;
else :
$related .= '<p>Nothing to show.</p>';
endif;
// Reset postdata
}
echo '<pre>'; var_dump( has_post_thumbnail() ); echo '</pre>';
return $related;
} //wp_reset_postdata();
add_filter( "the_content", "posts_related", 99 );
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 100, 50, true );
But I’m not being able to handle the output properly. I need it to display below the post (single post).
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I slightly modified your code and tested on my WordPress installation.
If you using a filter, like ‘the_content’, which recieves a content as an argument,
you must also return this content back.
Here is working version of your function with comments.
//this filter recieves $content, which you should always return,
//otherwise you will not see the content
function posts_related($content){
if (is_single()){
$custom_query = new WP_Query( array(
'posts_per_page' => 8,
'post__not_in' => array(get_queried_object_id()),
'orderby' => 'rand',
));
//lets define $related variable outside of while loop
// and if statement to make it visible
$related = '';
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) : $custom_query->the_post();
//use functions with "get_" to recieve a value
// and not echo it
$permalink = get_the_permalink();
$title = get_the_title();
if ( has_post_thumbnail() ) {
//here we receiving just url with
//get_the_post_thumbnail_url()
$related .= '<a href="' . $permalink . '">
<img src="' . get_the_post_thumbnail_url() . '" />
</a>';
}else{
$related .= '<a href="' . $permalink . '"><b>' . $title . '</b></a>';
}
endwhile;
wp_reset_postdata();
//return content + related posts
//if is_singular and we have related post
return $content . $related;
else :
//if is_singular but no posts were found
$related .= '<p>Nothing to show.</p>';
endif;
//if is_singular and we have related posts
//return content + related posts
//or content + "nothing to show"
return $content . $related;
}
//if page is not a single,
//just return content
return $content;
}
P.S. Usually related posts are posts with the same category or tag, just orderby with rand will return random posts, but I guess you know this.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0