[wp-hackers] wp_list_categories()

Daiv Mowbray daiv at daivmowbray.com
Thu Jan 1 18:21:57 GMT 2009


On Jan 1, 2009, at 12:45 AM, Mike Schinkel wrote:

> That said, if Daiv Mowbray will post an example similar to the  
> example I
> posted of what he wants his markup to look like down to, say, the  
> 4th level
> I'll write the recursive login for him. Just not tonight as I'm  
> leaving for
> an NYE party soon. :-)

Hey Mike, hope the party was great!
We had a family party here at home.
Lots of fun with the kids.

Re your offer...I'd really appreciate a hand with this, been going  
around in circles
for a couple of weeks, If you're willing and able,  I've added bellow  
the relevant functions.
As for what I'm trying to do...
I have an array of categories, and an array of posts .

The desired result down to the 4th level is ;
<dl>
     <dt class="dtL1">Cat level1</dt>
     <dd class="ddL1">
         <dl>
         <dt class="dtL2">Cat level2</dt>
         <dd class="ddL2">
             <dl>
             <dt class="dtL3">Cat level3</dt>
             <dd class="ddL3">
                 <dl>
                 <dt class="dtL4">Cat level4</dt>
                 <dd class="ddL4"><span>post level4</span>
                 </dd>
                 </dl>
             <span>post level3</span>
             </dd>
             <dt class="dtL3">Cat level3-B</dt>
             <dd class="ddL3"><span>post level3-B</span>
             </dd>
             </dl>
         <span>post level2</span>
         </dd>
         </dl>
     <span>post level1</span>
     </dd>
</dl>


Here are the functions, I think I'm doing pretty well so far for a non  
phper.

function getDepth( array &$items, $node,  $depth = 0)
{
		if ($node->parent == 0) {
			// Root node, return current depth
			return $depth;
		} else {
			// Search for matching parent node
			$parent = array_filter(
				$items,
				create_function(
					'$item',
					'return ($item->term_id == ' . $node->parent . ');'
				)
			);
			$parent = array_pop($parent);
			return getDepth($items, $parent, ++$depth);
		}
}
function make_def_list($categories, $posts, $options ) {
		global $showPostCount, $linkToCat, $catfeed, $showPosts ;	
		$parents =array();

		echo "\n<div id='ssMenuHolder'><dl id='ssMenuList'>\n";
	

	foreach( $categories as $cat ) {
			$my_depth = (getDepth( $categories, $cat) +1);
			$cat->depth = $my_depth;
		
			array_push ($parents , ($cat->parent) );
	if ($cat->depth == 1) // equals level 0 , Start top level
     {
			$rssLink=add_feedlink($catfeed,$cat);
			$sub_cat_post_count=0;
			$sub_cat_count=0;
			
			list ($sub_cat_links,$sub_cat_count,$sub_cat_post_count, 
$sub_cat_posts)=
			get_ssmsub_cat($cat, $categories, $parents, $posts, $sub_cat_count,  
$sub_cat_post_count, $number);

			$theCount=$cat->count;//$cat->count is num of posts
			
			cat_bar($cat, $showPostCount, $theCount, $rssLink);
			
         	echo( "\n\t<dd class='showme_".$my_depth." ".$cat->slug." '> 
\n" );
			
		if ($sub_cat_count > 0)
			{ // this top level cat has sub cats
				echo "\n\t<dl>\n".$sub_cat_links."\t\n</dl>\n ";
			}
		
		// Now print out the posts
		if( ! empty($posts)  || ($showPosts=='yes'))
				
			add_posts($posts, $cat, $sub_cat_posts);
	
		echo "\t</dd><!-- ending first level category -->\n";
		
	        }
       } // end if theCount>0

       echo "\n</dl></div>\n";
  }
function get_ssmsub_cat($cat, $categories, $parents, $posts,  
$sub_cat_count, $sub_cat_post_count, $number) {
		
		global $showPostCount, $linkToCat, $catfeed, $showPosts ;		
		$sub_cat_posts=array();		
		$link2 = '';
		
	  if (in_array($cat->term_id, $parents)) {
		
		foreach ($categories as $cat2) {

			$sub_cat_link2=''; // clear info from sub_cat_link2

			if ($cat->term_id == $cat2->parent)
			{
				// check to see if there are more subcategories under this one
				$sub_cat_post_count=$sub_cat_post_count+$cat2->count;

					if (!in_array($cat2->term_id, $parents)) {

						$sub_cat_count = 0;
						
						$sub_cat_links = cat_bar($cat2, $showPostCount, $theCount,  
$rssLink);
							
					 } else {			
					  list ($sub_cat_link2, $sub_cat_count,$sub_cat_post_count, 
$sub_cat_posts)=
							get_ssmsub_cat($cat2, $categories, $parents, $posts,  
$sub_cat_count, $sub_cat_post_count, $number);
					
						$sub_cat_count=1;					
						$sub_cat_links = cat_bar($cat2, $showPostCount, $theCount,  
$rssLink);
					}
			}
			$sub_cat_links.="\n\t<dd class='showme_".$my_depth."' >\n";
			
			if ($showPosts=='yes')
			{
				add_posts ($posts, $cat2, $sub_cat_posts);

			}

		$sub_cat_links.= "</dd><!-- ending subcategory dd -->\n";
	}
   }
   return array($sub_cat_links,$sub_cat_count,$sub_cat_post_count, 
$sub_cat_posts);
}
function cat_bar( $cat, $showPostCount, $theCount, $rssLink)	{
		global $showPostCount, $linkToCat, $catfeed, $showPosts ;	
		
		echo "\n\t<dt class='ssmToggleBar ".$cat->slug."'><span  
class='show_".$cat->depth." subsym'>&nbsp;</span>";
				
		$catbarlink = "\n\t\t<span class='catlink'><a  
href='".get_category_link($cat->term_id)."' class='tool' title='".  
sprintf(__("View all entries filed under %s"), wp_specialchars($cat- 
 >name))."'";
								
			if ( !empty($cat->description) )
			{
				$catbarlink .= 'rel="' .  
wp_specialchars(apply_filters('description',$cat->description,$cat)) .  
'"';
			}
		
		$catbarlink .= '>'.apply_filters('list_cats', $cat->name, $cat).'</ 
a></span>';
						
		if( $showPostCount=='yes')
			{
				$catbarlink .= " (" . $theCount.")".$rssLink."\n\t</dt><!--this is  
catbar with post count -->";
			
			} else {
				
				$catbarlink .= $rssLink."\n\t</dt><!--this is catbar no post count  
-->";
			}
		echo $catbarlink ;		
	
}
function add_posts ($posts, $cat, $sub_cat_posts) {

		foreach ($posts as $post) {
							
			if ($post->term_id == $cat->term_id) {				

				echo "\n\t<span class='ssMenuPost'>\n\t<a href='".
					get_permalink($post->id)."'>".strip_tags($post->post_title) . "</ 
a></span>\n";
			}
			if (!in_array($post->id, $sub_cat_posts)) {
				array_push($sub_cat_posts, $post->id);
			}
		}
}
----------
Daiv Mowbray
daiv at daivmowbray.com
----------




More information about the wp-hackers mailing list