Category 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.

WordPress och iPhone

Fick efter mycket om och men igång WordPress-applikationen på min iPhone. Har försökt och misslyckats med detta gång efter annan sedan version 1.0 av appen släpptes i somras någon gång, och varje gång jag försökt ansluta mig till bloggen har jag fått följande felmeddelande:

Communication Error
Operation could not be completed
(NSXMLParserErrorDomain error 5.)

Den här gången lyckades jag dock hitta en lösning via ett spansktalande blogginlägg; lägg till följande i .htaccess:

<Files xmlrpc.php>
SecFilterInheritance Off
</Files>