Tag Archives: WordPress

Breadcrumbs based on WordPress menus

Here’s a quick and dirty function for generating breadcrumbs based on pages in a WordPress menu. Please note that I have not tested this with menu items based on post types other than pages.

function jki_get_nav_menu_id_for_post($post_id)
{
	$items = wp_get_nav_menu_items('Huvudmeny');
	
	$menu_item_id = -1;
	
	// Find menu item
	foreach ((array)$items as $menu_item) {
		if($menu_item->object_id == $post_id) {
			$menu_item_id = $menu_item->ID;
			break;
		}
	}
	
	return $menu_item_id;
}

function jki_get_nav_menu_item($item_id)
{
	$args = array( 'post_type' => 'nav_menu_item', 
	    'post_status' => 'publish', 
	    'output' => ARRAY_A, 
	    'p' => $item_id);
	
	$query = new WP_Query($args);
	$items = $query->get_posts();
	$items = array_map( 'wp_setup_nav_menu_item', $items );
	
	if(count($items) > 0) {
		return $items[0];
	}	
	else {
		return null;
	}
}

function jki_wp_menu_breadcrumbs()
{	
	global $post;

	$menu_item_id = jki_get_nav_menu_id_for_post($post->ID);
	
	if($menu_item_id == -1) return;
	
	$current_menu_item = jki_get_nav_menu_item($menu_item_id);
	
	if($current_menu_item == null) return;
	
	$delimiter = '<span> // </span>';
	$crumbs = array();
	
	$crumbs[] = $delimiter . $current_menu_item->title;
	
	if($current_menu_item->menu_item_parent != 0) {
		$is_top = false;
		while($is_top == false) {
			$current_menu_item = jki_get_nav_menu_item($current_menu_item->menu_item_parent);
			$crumbs[] = $delimiter . '<a href="' . $current_menu_item->url . '">' . $current_menu_item->title . '</a>';
			
			if($current_menu_item->menu_item_parent == 0) {
				$is_top = true;
			}
		}
	}
	
	$crumbs = array_reverse($crumbs);
	
	echo "<div id=\"breadcrumbs\">\n";
	echo '<a href="/">Home</a>';
	foreach ($crumbs as $crumb) {
		echo $crumb;
	}
	echo "\n</div>\n";
}

Clean WordPress tag cloud

The default WordPress tag cloud includes nasty stuff like inline styling. I needed to be able to style the tags with a single class that included the tag weight in its name. It also needed the tags to be displayed in a list. The result turned the separate tag markup from

<a href="http://randomsite.com/tag/lolcats/" class="tag-link-5" title="3 tag" style="font-size: 32pt">Lolcats</a>

into

<li class="tag-10">
	<a href="http://randomsite.com/tag/lolcats/">Lolcats</a>
</li>

First we create a simple value object representing a tag.

class Custom_Tag
{
	var $name, $link, $class;
	
	public function Custom_Tag($name, $link, $class)
	{
		$this->name = $name;
		$this->link = $link;
		$this->class = $class;
	}
}

Then we go through all the tags and assign each a class depending on its weight. Those occurring the least will get the class tag-1 and those occurring most frequent will get the class tag-10. The function will return an array of Custom_Tag objects.

function custom_generate_tag_cloud($tags)
{
	if($tags) {
		$smallest_class = 1;
		$largets_class = 10;
		
		$counts = array();
		foreach ($tags as $key => $tag) {
			$counts[$key] = $tag->count;
		}
		
		$min_count = min($counts);
		$spread = max($counts) - $min_count;
		if ( $spread <= 0 )
			$spread = 1;
		
		$class_spread = $largets_class - $smallest_class;
	        if ( $class_spread < 0 )
	                $class_spread = 1;
	        $class_step = $class_spread / $spread;
		
		$cloud_tags = array();
		foreach ($tags as $key => $tag) {
			$count = $counts[$key];
			$class = 'tag-' . round($smallest_class + ( ( $count - $min_count ) * $class_step ));
			$cloud_tags[] = new Custom_Tag($tag->name, $tag->link, $class);
		}
	}
	
	return $cloud_tags;
}

Finally we collect the tag objects created in the function above and output some html. We also add a filter hook for “wp_generate_tag_cloud”.

function custom_tag_cloud($return, $tags, $args)
{
	$tag_array = custom_generate_tag_cloud($tags);
	$cloud_tags = array();
	
	$return = "<ul>\n";
	foreach ($tag_array as $tag) {
		$cloud_tags[] = '<li class="' . $tag->class . '"><a href="' . $tag->link . '">' . $tag->name . "</a></li>\n";
	}
	$return .= join('', $cloud_tags);
	$return .= "</ul>\n";
	
	return $return;
}

add_filter('wp_generate_tag_cloud', 'custom_tag_cloud', 10, 3);

Google analytics

Då jag är rätt grön på WordPress (notera standardtemat) får de första trevande inläggen bli små how-tos rörande inställningar och anpassningar av systemet. Det första som måste in är script-taggar så att Google analytics kan samla in matig data om den förväntade besökaranstormningen.

Det finns vad jag kan se två olika sätt att göra detta på. Antingen “hårdkodar” man in script-blocket i en fil tillhörande det tema man använder på bloggen eller så installerar man någon av de plugins som enligt uppgift löser detta åt en. Fördelen med plugin-lösningen är att statistikinsamlingen funkar oavsett vilket tema man väljer att använda sig av, vid hårdkodningen krävs det att ändringen görs varje gång man byter tema.

Det jag tänkte försöka mig på till att börja med är den hårdkodade varianten.

Taggarna ska läggas in precis innan den avslutande body-taggen på sidan och det verkar som om denna hittas i footer.php tillhörandes valt tema. Denna kan redigeras i WPs admin under “Apprearance -> Editor”. Väl där klickar vi på “footer.php” och letar upp </body>. Därefter är det bara att klistra in script-blocket som google tillhandahåller och så:

footer.php skärmdump

Sen är det klart, det inklistrade kodblocket ligger nu med i alla sidor som använder valt tema på bloggen.