My goal was to have a list of recent posts that are in the same category as the post being viewed. I found plenty of information for hard coding a list using the category slug or name. This is great if you are organizing your blog by set categories and you have that architecture all figured out. I don’t. I just want to make categories on the fly, and see where it leads. Eventually if I see a clear pattern I may hard code, but for now I want a dynamic solution.
I had 2 problems to contend with:
- My templates were based on the parent category ‘blog’ so archive.php was redirecting to archive-blog.php if the page was in the blog category. If I wanted my Dynamic menu to be created for a subcategory I had to be able to un-check ‘blog’ and still have archive.php redirect.
- Get the recent post list from the current category on single posts, archive and category pages to show up on my sidebar.
I cobbled together various blocks of code knowing very little PHP but through trial and error I got the results I was after. For now it works on my sub categories if I do not check off the parent categories.
Here is the code:
Problem 1: For all my blog template re-directs I added code to basically include all descendants (link to more info):
<?php if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { // get_term_children() accepts integer ID only $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } } ?> post; if ( in_category( '13' ) || post_is_in_descendant_category( 13 ) ){ include(TEMPLATEPATH . '/archive-blog.php'); } else { include(TEMPLATEPATH . '/archive-portfolio.php'); } ?>
Problem 2: This is the code I placed in my sidebar template to generate the recent posts in each current category:
I hope this saves someone some time!
<ul> <?php if(is_single() || is_category || is_archive): global $post; $categories = get_the_category(); foreach ($categories as $category) : ?> <li> More <?php echo $category->name; ?> Posts </li> <?php $posts = get_posts('numberposts=-1&category='. $category->term_id); foreach($posts as $post) : ?> <li> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <?php the_excerpt(); ?> <?php the_time(' M j, Y') ?> </li> <?php endforeach; ?> <?php endforeach; endif ; wp_reset_query(); ?> </ul>