This worked…
function list_cats_with_desc() {
$base = wp_list_categories('echo=0&hide_empty=0&title_li=0&orderby=ID&order=ASC&taxonomy=CUSTOM-TAXONOMY-SLUG');
// wp_list_categories adds a "cat-item-[category_id]" class to the <li> so let's make use of that!
// Shouldn't really use regexp to parse HTML, but oh well.
// (for the curious, here's why: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 )
$get_cat_id = '/cat-item-[0-9]+/';
preg_match_all($get_cat_id, $base, $cat_id);
// Let's prepare our category descriptions to be injected.
// Format will be <a>category-name<span>category-desc</span></a>
$inject_desc = array();
$i = 0;
foreach($cat_id[0] as $id) {
$id = trim($id,'cat-item-');
$id = trim($id,'"');
$desc = trim(strip_tags(category_description($id)),"\n"); // For some reason, category_description returns the
// description wrapped in an unwanted paragraph tag which
// we remove with strip_tags. It also adds a newline
// which we promptly trim out.
if($desc=="") $desc = " • --- ";
$inject_desc[$i] = '</a> <span class="cat-desc">' . $desc . '</span>';
$i++;
}
// Now we inject our descriptions
$base_arr = explode("\n", $base);
$base_i = 0;
foreach($inject_desc as $desc) {
// We check whether there's an occurence of "</a>"
while(strpos($base_arr[$base_i], "</a>") === false) {
$base_i++;
}
// If we find one, inject our description <span>
$base_arr[$base_i] = str_replace("</a>", $desc, $base_arr[$base_i]);
$base_i++;
}
$base = implode("\n", $base_arr);
echo $base;
}