I believe a sitemap should show posts under categories, and maintain the category hierarchy.
wp_list_categories cannot be asked to include posts.
And if you follow this suggestion and try and use get_posts, you will get a nasty surprise; it will get all posts in all sub categories of the one you want. and this WILL NOT DO!
I found that you need this query and that you can inherit the category walker and pass that to the wp_list_categories method. Am impressed!
select object_id, p.post_status from wp_term_relationships r join wp_posts p on r.object_id = p.ID where p.post_status = 'publish' and r.term_taxonomy_id = (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'category' and term_id = 4)
So to hook the walker's end_el, we add
//USAGE:
//wp_list_categories( array( 'title_li' => '', 'echo' => false , 'walker' => new PCWalker() ) ) .
class PCWalker extends Walker_Category {
function end_el(&$output, $page, $depth, $args) {
global $wpdb;
$output .= "called with: " . $page->term_id;
$posts = $wpdb->get_results("select object_id as ID from wp_term_relationships r "
. "join wp_posts p on r.object_id = p.ID where p.post_status = 'publish' and r.term_taxonomy_id = "
. "(SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'category' and term_id = " . $page->term_id . ")");
if($posts) :
$output .= '<ul class="posts">'; foreach($posts as $post) { $output .= '
<li>'; $output .= '<a title="link to ' . get_the_title($post->ID) . '" href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a>'; $output .= '</li>
'; } $output .= '</ul>
';
endif;
parent::end_el(&$output, $page, $depth, $args);
}
}