13

In my gallery site i want to show other pictures under the current picture (in single post). I seen more codes but it i asks to specify the category, but i dont want want specify the category manually in the code I want the code itself to get the category ID or name.It would be much easier for me if i get full posts instead of post title so that I can display it as in home and category

2

3 Answers 3

34

The question has already been asked and the answer has been posted too,

How to display related posts from same category?

Add this code inside your single.php after a loop wherever you want to show related post,

<?php

$related = get_posts( array( 'category__in' => wp_get_post_categories($post->ID), 'numberposts' => 5, 'post__not_in' => array($post->ID) ) );
if( $related ) foreach( $related as $post ) {
setup_postdata($post); ?>
 <ul> 
        <li>
        <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
            <?php the_content('Read the rest of this entry &raquo;'); ?>
        </li>
    </ul>   
<?php }
wp_reset_postdata(); ?>

It will display related post from the same category with the post excerpt and title , however if want this code to display just the title of related post then remove this line,

<?php the_content('Read the rest of this entry &raquo;'); ?>
12
  • sorry I am noob in wordpress and PHP.If yu dont mind, could yu tell me how to put that code in my single.php??
    – Felix
    Commented Feb 5, 2012 at 17:01
  • 1
    read my answer again i have added few more details (TESTED) Commented Feb 5, 2012 at 17:15
  • 1
    sorry, replace 'ODD' with 'the' in the above code Commented Feb 5, 2012 at 17:34
  • 1
    the error is removed from the code and now it is working perfectly fine (Tested), copy the modified code from my answer Commented Feb 5, 2012 at 17:39
  • 1
    it means you have removed this line of code, <?php the_excerpt('Read the rest of this entry &raquo;'); ?>, add it back where it was Commented Feb 5, 2012 at 17:50
8

Here is another clean and very flexible option:

Put this code in your functions.php file

function example_cats_related_post() {

    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );

    if(!empty($categories) && !is_wp_error($categories)):
        foreach ($categories as $category):
            array_push($cat_ids, $category->term_id);
        endforeach;
    endif;

    $current_post_type = get_post_type($post_id);

    $query_args = array( 
        'category__in'   => $cat_ids,
        'post_type'      => $current_post_type,
        'post__not_in'    => array($post_id),
        'posts_per_page'  => '3',
     );

    $related_cats_post = new WP_Query( $query_args );

    if($related_cats_post->have_posts()):
         while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?>
            <ul>
                <li>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                    <?php the_content(); ?>
                </li>
            </ul>
        <?php endwhile;

        // Restore original Post Data
        wp_reset_postdata();
     endif;

}

Now you can simply call the function anywhere in your site using:

<?php example_cats_related_post() ?>

You may want to remove the list elements or style them as per your need.

1
  • I think this solution is the best because it's reusable. Add the function in functions.php then call the function anywhere in an active them. I tried it on my own and it works. Commented May 12, 2022 at 22:55
2

This is an advanced example for developers. It supports custom post types and custom taxonomies, including matches by multiple taxonomies.

// $post pointing to a WP_Post instance of the current post.

$query = new WP_Query(
    [
        'post_type'      => $relatedPostType,
        'posts_per_page' => 6,
        'tax_query'      => buildTaxonomyForRelatedPosts($post),
        'post__not_in'   => [$post->ID],
    ]
);

// The array of related posts
$relatedPosts = $query->get_posts();

function buildTaxonomyForRelatedPosts(WP_Post $post) {
    switch ($post->post_type) {
        case 'post':
            $taxonomies = ['category', 'post_tag'];
            break;
        case 'news':
            $taxonomies = ['newscategory', 'newstags'];
            break;
        default:
            return [];
    }

    $taxQuery = [
        'relation' => 'OR',
    ];

    foreach ($taxonomies as $taxonomy) {
        $taxQuery[] = [
            'taxonomy' => $taxonomy,
            'field'    => 'slug',
            'terms'    => array_filter(wp_get_object_terms($post->ID, $taxonomy, ['fields' => 'slugs']), function($termSlug) {
                return strtolower($termSlug) !== 'uncategorized';
            }),
        ];
    }

    return $taxQuery;
}

The function buildTaxonomyForRelatedPosts essentially builds an array with this structure:

'tax_query' => [
    'relation' => 'OR',
    [
        'taxonomy' => 'movie_genre',
        'field'    => 'slug',
        'terms'    => ['action', 'comedy', 'drama'],
    ],
    [
        'taxonomy' => 'actor',
        'field'    => 'slug',
        'terms'    => ['foo', 'bar', 'baz'],
    ],
];

https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters

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