Archived posts from the 'Blogging' Category

Cat post: Life’s getting better!

Even the cat says life's getting betterSince I’ve moved this blog here my traffic has nicely improved. Skip the bragging, hop into the grub. During the past three weeks my feed subscriptions went up by 17%, and daily uniques by 460% (I never got stumbled at blogspot).

Thanks to Google’s newish BlitzIndexing my SERP referrers went up from 1 (August/24/2007) to 40 yesterday, naturally all long tail searches by the way. I didn’t count the bogus MSN referrer spam suggesting I rank for “yahoo”, “pontiac” and whatnot.

The search engine crawlers are quite buzzy too. When Ms. Googlebot was ready fetching all URLs 3-5 times each, Slurp and MSNbot wholehearted joined the game. Google has indexed roughly 500 pages, my Webmaster Central account counts 2,000 inbound links, shows PageRank, anchor text stats and all the other neat stuff. Yahoo has indexed 90 pages and 1,000 inbound links. Although MSN has crawled a lot, they’ve indexed a whopping 2 pages. Wow.

I’d be quite happy since my blog’s life is getting better, if there weren’t that info from Google via Matt Cutts’s blog telling me that 80% of my pages are considered useless crap, at least from Google’s perspective. That’s not a joke. Google dislikes 80% of this wonderful blog, although it contains only 20% Google bashing. Weird.

I repeated the searches below multiple times, so what I’ve spotted is not an isolated phenomenon, nor coincidence. Here’s what the standard site search query shows, 494 indexed pages:
Google site search for Sebastian's Pamphlets

Next I’ve used Matt’s power toy limiting the results to pages Google discovered within the past 30 days (&as_qdr=d30). Please note that 30 days ago this domain didn’t exist. I’ve installed WordPress on August/16/2007, the day I’ve registered the domain, that means 29 days ago I’ve created the very first indexable page. The rather astonishing result is 89 indexed pages:
Google site search for Sebastian's Pamphlets for the past 30 days

Either Matt’s time tunnel for power searchers is only 20% accurate, or 80% of my stuff went straight into the supplemental index from where advanced search can’t pull it.

The latter presumption is plausible, because the site is new, 99% or so of my deep links came in 2-3 weeks ago via 301 redirects so that the pages have no PageRank yet, and for most of the URLs Google noticed near duplicates with source bonus from my old blogspot outlet, not to speak of scraped stuff on low-life servers. Roughly 90 pages can have got noticable PageRank yet, judging from my understanding of my fresh inbound links and my internal linkage. Interestingly, those 90 pages on my blog have a real world timestap after the funeral of the blogspot thingy, and content that didn’t exist over there. That could lead to interesting theories, however I guess that indeed <speculation>time restricted searches don’t pull pages from the supplemental hell</speculation>. Reminds me of the fact that Google’s link stats show nofollow’ed links and all that, but not a single link from a page buried in the supp index.

Did Matt by accident reveal a sure-fire procedure to identify supplemental results? I mean they can’t make timely searches defunct like /& and undocumented stuff like that. I’ve tested the method with two sites where I know the supp ratio and the results were kinda plausible, but that’s no proof. Of course I couldn’t resist to post this vague piece of speculation before doing solid research. Maybe I’m dead wrong.

What do you guys think? Flame me in the comments. :)

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

Free WordPress Add-on: Categorized Sitemaps

In How to feed all posts on a WordPress blog with link love I’ve outlined a method to create short and topically related paths to each and every post even on a large blog. Since not every blogger is PHP savvy enough to implement the concept, some readers asked me to share the sitemaps script.

Ok, here it is. It wasn’t developed as a plugin, and I’m not sure that’s possible (actually, I didn’t think about it), but I’ll do my best to explain the template hacks necessary to get it running smoothly. Needless to say it’s a quick hack and not exactly elegant, however it works here with WordPress 2.2.2. Use it as is at your own risk, yada yada yada, the usual stuff.

I’m a link whore, so please note: If you implement my sitemap script, please link out to any page on my blog. The script inserts a tiny link at the bottom of the sitemap. If you link to my blog under credits, powered by, in the blogroll or whereever, you can remove it. If you don’t link, the search engines shall ban you. ;)


You should be able to do guided template hacks.

You need a WordPress plugin that enables execution of PHP code within the content of posts and pages. Install one from the list below and test it with a private post or so. Don’t use the visual editor and deactivate the “WordPress should correct invalidly nested XHTML automatically” thingy in Options::Writing. In the post editor write something like
Q: Does my PHP plugin work?
print "A: Yep, It works.";
and check “enable PHP on this page” (labels differ from plug-in to plug-in), save and click preview. If you see the answer it works. Otherwise try another plug-in:

(Maybe you need to quote your PHP code with special tags like <phpcode></phpcode>, RTFM.)

Consider implementing my WordPress-SEO tweaks to avoid unnecessary code changes. If your permalink structure is not set to custom /%postname%/ giving post/page URLs like you need to tweak my code a little. Not that there’s such a thing as a valid reason to use another permalink structure …


Don’t copy and paste PHP code from this page, it might not work because WordPress prettifies quotes etcetera. Everything you need is on the download page.


Copy list_categories.php to your template directory /wp-content/themes/yourtemplatename/ on your local disk and upload it to your server.

Create a new page draft, title it “Category Index” or so, and in page content put
<?php @include(TEMPLATEPATH . "/list_categories.php"); ?>
then save and preview it. You should see a category links list like this one. Click the links, check whether the RSS icons show or not, etcetera.

If anything went wrong, load list_categories.php with your preferred editor (not word processor!). Scroll down to edit these variables:
// Customize if necessary:
//$blogLocaction = “”;
// “”, “” …
// without “http://” and no trailing slash!
//$rssIconPath = “/img/feed-icon-16×16.gif”;
// get a 16*16px rss icon somewhere and upload it you your server,
// then change this path which is relative to the domain’s root.
$rssIconWidth = 16;
$rssIconHeight = 16;
If you edit a variable, remove its “//“. If you use the RSS icon delivered with WordPress, change width and height to 14 pixels. Save the file, upload it to your server, and test again.

If you use Feedburner then click the links to the category feeds, Feedburner shouldn’t redirect them to your blog’s entries feed. I’ve used feed URLs which the Feedburner plug-in doesn’t redirect, but if the shit hits the fan search for the variable $catFeedUrl and experiment with the category-feed URLs.

Your sitemap’s URL is (respectively or so when the sitemap has a parent page).

In theory you’re done. You could put a link to the sitemap in your sidebar and move on. In reality you want to prettify it, and you want to max out the SEO effects. Here comes the step by step guide to optimized WordPress sitemaps / topical hubs.

Category descriptions

On your categorized sitemap click any “[category-name] overview” link. You land on a page listing all posts of [category-name] under the generic title “Category Index”, “Sitemap”, or whatever you’ve put in the page’s title. Donate at least a description. Your visitors will love that and when you install a meta tag plugin the search engines will send a little more targeted traffic because your SERP listings look better (sane meta tags don’t boost your rankings but should improve your SERP CTR).

On your dashboard click Manage::Categories and write a nice but keyword rich description for each category. When you reference other categories by name my script will interlink the categories automatically, so don’t put internal links. Now the category links lists (overview pages) look better and carry (lots of) keywords.

The sitemap URL above will not show the descriptions (respectively only as tooltip), but the topical mini-hubs linked as “overview” (category links lists) have it. Your sitemap’s URL with descriptions is ( or so when the sitemap has a parent page).

If you want to put a different introduction or footer depending on the appearance of descriptions you can replace the code in your page by:
// introduction:
if (strtoupper($_GET["definitions"]) == "TRUE") {
print "<p><strong>All categories with descriptions.</strong> (Example)</p>”;
else {
if (!isset($_GET[”cat”])) {
print “<p><strong>All categories without descriptions.</strong> (Example)</p>”;
@include(TEMPLATEPATH . “/list_categories.php”);
// footer as above
(If you use quotes in the print statements then prefix them with a slash, for example: print "<em>yada \"yada\" <a href=\"url\" title=\"string\">yada</a></em>."; will output yada “yada” yada.)

Title tags

The title of the page listing all categories with links to the category pages and feeds is by design used for the category links pages too. WordPress ignores input parameters in URLs like

To give each category links list its own title tag, replace the PHP code in the title tag. Edit header.php:
// 1. Everything:
$pageTitle = wp_title(“”,false);
if (empty($pageTitle)) {
$pageTitle = get_bloginfo(”name”);
$pageTitle = trim($pageTitle);
// 2. Dynamic category pages:
$input_catName = trim($_GET[”cat”]);
if ($input_catName) {
$input_catName = ucfirst($input_catName);
$pageTitle = $input_catName .” at ” .get_bloginfo(”name”);
// 3. If you need a title depending on the appearance of descriptions
$input_catDefs = trim($_GET[”definitions”]);
if ($input_catDefs) {
$pageTitle = “All tags explained by ” .get_bloginfo(”name”);
print $pageTitle;

The first statements just fix the obscene prefix crap most template designers are obsessed about. The second block generates page titles with the category name in it for the topical hubs (if your category slugs and names are identical). You need 1. and 2.; 3. is optional.

Page headings

Now that you’ve neat title tags, what do you think about accurate headings on the category hub pages? To accomplish that you need to edit page.php. Search for a heading (h3 or so) displaying the_title(); and replace this function by:
<h3 class=”entrytitle” id=”post-<?php the_ID(); ?>”> <a href=”<?php the_permalink() ?>” rel=”bookmark”>
// 1. Dynamic category pages
$input_catName = trim($_GET[”cat”]);
if ($input_catName) {
$input_catName = ucfirst($input_catName);
$dynTitle = “All Posts Tagged ‘” .$input_catName .”‘”;
// 2. If you need a heading depending on the appearance of descriptions
$input_catDefs = trim($_GET[”definitions”]);
if ($input_catDefs) {
$dynTitle = “All tags explained”;
// 3. Output the heading
if ($dynTitle) print $dynTitle; else the_title();

(The surrounding XHTML code may look different in your template! Replace the PHP code leaving the HTML code as is.)

The first block generates headings with the category name in it for the topical hubs (if your category slugs and names are identical). The last statement outputs either the hub’s heading or the standard title if the actual page doesn’t belong to the script. You need 1. and 3.; 2. is optional.

Feeding the category hubs

With most templates each post links to the categories its tagged with. Besides the links to the category archive pages you want to feed your hubs linking to all posts of each category with a little traffic and topical link juice. One method to accomplish that is linking to the category hubs below the comments. If you don’t read this post on the main page or an archive page, click here for an example. Edit single.php, a line below the comments_template(); call insert something like that:
<br />
<p class="post-info" id="related-links-lists">
<em class="cat">Find related posts in
$catString = "";
foreach((get_the_category()) as $catItem) {
if (!empty($catString)) $catString .= ", ";
$catName = $catItem->cat_name;
$catSlug = $catItem->category_nicename;
$catUrl = ""
$catString .= "<a href=\"$catUrl\">$catName</a>";
} // foreach
print $catString;
(Study your template’s “post-info” paragraph and ensure that you use the same class names!)

Also, if your descriptions are of glossary quality, then link to your category hubs in your posts. Since most of my posts are dull as dirt, I decided to make the category descriptions an even duller canonical SEO glossary. It’s up to you to become creative and throw together something better, funnier, more useful … you get the idea. If you blog in english and you honestly believe your WordPress sitemap is outstanding, why not post it in the comments? Links are dofollowed in most cases. ;)


Test everything before you publish the page and link to the sitemaps.

If you have category descriptions and on the sitemap pages links to other categories within the description are broken: Make sure that the sitemap page’s URL does not contain the name or slug of any of your categories. Say the page slug is “sitemaps” and “links” is the parent page of “sitemaps” (URL: /links/sitemaps/), then you must not have a category named “links” nor “sitemaps”. Since a “sitemap” category is somewhat unusual, I’d say serving the sitemaps on a first level page named “sitemap” is safe.


I hope this post isn’t clear as mud and everybody can install my stuff without hassles. However, every change of code comes with pitfalls, and I can’t address each and every possibility, so please backup your code before you change it, or play with my script in a development system. I can’t provide support but I’ll try to reply to comments. Have fun at your own risk! ;)

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

SEO-sanitizing a WordPress theme in 5 minutes

When you start a blog with , you get an overall good crawlability like with most blogging platforms. To get it ranked at search engines your first priority should be to introduce it to your communities acquiring some initial link love. However, those natural links come with disadvantages: canonicalization issues.

“Canonicalization”, what a geeky word. You won’t find it in your dictionary, you must ask Google for a definition. Do the search, the number one result leads to Matt’s blog. Please study both posts before you read on.

Most bloggers linking to you will copy your URLs from the browser’s address bar, or use the neat FireFox “Copy link location” thingy, what leads to canonical inbound links so to say. Others will type in incomplete URLs, or “correct” pasted URLs by removing trailing slashes, “www” prefixes or whatever. Unfortunately, usually both your Web server as well as WordPress are smart enough to find the right page, says your browser at least. What happens totally unseen in the background is that some of these page requests produce a 302-Found elsewhere response, and that search engine crawlers get feeded with various URLs all pointing to the same piece of content. That’s a bad thing with regard to search engine rankings (and enough stuff for a series of longish posts, so just trust me).

Lets begin the WordPress SEO-sanitizing with a fix of the most popular canonicalization issues. Your first step is to tell WordPress that you prefer sane and meaningful URLs without gimmicks. Go to the permalink options, check custom, type in /%postname%/ and save. Later on give each post a nice keyword rich title like “My get rich in a nanosecond scam” and a corresponding slug like “get-rich-in-a-nanosecond”. Next create a plain text file with this code

# Disallow directory browsing:
Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine On
# Fix www vs. non-www issues:
RewriteCond %{HTTP_HOST} !^your-blog\.com [NC]
RewriteRule (.*)$1 [R=301,L]
# WordPress permalinks:
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

and upload it in ASCII mode to your server’s root as “.htaccess” (if you don’t host your blog in the root or prefer the “www” prefix change the code accordingly). Change your-blog to your domain name respectively www\.your-domain-name.

This setup will not only produce user friendly post URLs like, it will also route all server errors to your theme’s error page. If you don’t blog in the root, learn here how you should handle HTTP errors outside the /blog/ directory (in any case you should use ErrorDocument directives to capture stuff WordPress can’t/shouldn’t handle, e.g. 401, 403, 5xx errors). Load 404.php in an ASCII editor to check whether it will actually send a 404 response. If the very first lines of code don’t look like

@header("HTTP/1.1 404 Not found", TRUE, 404);

then insert the code above and make absolutely sure that you’ve not a single whitespace (space, tab, new line) or visible character before the <?php (grab the code). It doesn’t hurt to make the 404 page friendlier by the way, and don’t forget to check the HTTP response code. Consider calling a 404grabber before you send the 404 header, this is a neat method to do page by page redirects capturing outdated URLs before the visitor gets the error page.

Next you need to hack header.php to fix canonicalization issues which the rewrite rule in the .htaccess file above doesn’t cover. By default WordPress delivers the same page for both the canonical URL and the crappy variant without the trailing slash. Unfortunately many people who are unaware of Web standards as well as scripts written by clueless assclowns remove trailing slashes to save bandwidth (lame excuse for this bullshit by the way, although even teeny search engines suffer from brain dead code monkeys implementing crap like that).

At the very top of header.php add this PHP code:

$requestUri = $_SERVER[”REQUEST_URI”];
$uriArr = explode(”#”, $requestUri);
$requestUriBase = $uriArr[0];
$requestUriFragment = $uriArr[1];
$uriArr = explode(”?”, $requestUriBase);
$requestUriBase = $uriArr[0];
$queryString = $_SERVER[”QUERY_STRING”];
if ( substr($requestUriBase, strlen($requestUriBase) -1, 1) != “/” ) {
$canonicalUrl = “”;
$canonicalUrl .= $requestUriBase .”/”;
if ($queryString) {
$canonicalUrl .= “?” .$queryString;
@header(”HTTP/1.1 301 Moved Permanently”, TRUE, 301);
@header(”Location: $canonicalUrl”);
(Again, not a single whitespace (space, tab, new line) or visible character before the <?php! Grab this code.)

Of course you need to change my URL in the canonicalUrl variable to yours but I don’t mind when you forget it. There’s no such thing as bad traffic. Beyond the canonicalization done above, at this point you can perform all sorts of URL checks and manipulations.

Now you understand why you’ve added the trailing slash in the permalink settings. Not only does the URL look better as a directory link, the trailing slash also allows you to canonicalize your URLs with ease. This works with all kind of WordPress URLs, even archives (although they shall not be crawlable), category archives, pages, of course the main page and whatnot. It can break links when your template has hard coded references to “index.php”, what is quite popular with the search form and needs a fix anyway, because it leads to at least two URLs serving identical contents.

It’s possible to achieve that with a hack in the blog root’s index.php, respectively a PHP script called in .htaccess to handle canonicalization and then including index.php. The index.php might be touched when you update WordPress, so that’s a file you shouldn’t hack. Use the other variant if you see serious performance issues by running through the whole WordPress logic before a possible 301-redirect is finally done in the template’s header.php.

While you’re at the header.php file, you should fix the crappy post titles WordPress generates by default. Prefixing title tags with your blog’s name is downright obscene, irritates readers, and kills your search engine rankings. Hence replace the PHP statement in the TITLE tag with
$pageTitle = wp_title(“”,false);
if (empty($pageTitle)) {
$pageTitle = get_bloginfo(”name”);
$pageTitle = trim($pageTitle);
print $pageTitle;
(Grab code.)

Next delete the references to the archives in the HEAD section:
<?php // wp_get_archives(’type=monthly&format=link’); ?>
The “//” tells PHP that the line contains legacy code, SEO wise at least. If your template comes with “index,follow” robots meta tags and other useless meta crap, delete these unnecessary meta tags too.

Well, there are a few more hacks which make sense, for example level-1 page links in the footer and so on, but lets stick with the mere SEO basics. Now we proceed with plugins you really need.

  • Install automated meta tags, activate and forget it.
  • Next grab Arne’s sitemaps plugin, activate it and uncheck the archives option in the settings. Don’t generate or submit a sitemap.xml before you’re done with the next steps!
  • Because you’re a nice gal/guy, you want to pass link juice to your commenters. Hence you install nofollow case by case or another dofollow plugin preventing you from nofollow insane.
  • Stephen Spencer’s SEO title tag plugin is worth a try too. I didn’t get it to work on this blog (that’s why I hacked the title tag’s PHP code in the first place), but that was probably caused by alzheimer light (=lame excuse for either laziness or goofiness) because it works fine on other blogs I’m involved with. Also, meanwhile I’ve way more code in the title tag, for example to assign sane titles to URLs with query strings, so I can’t use it here.
  • To eliminate the built-in death by pagination flaw –also outlined here–, you install PagerFix from Richard’s buddy Jaimie Sirovich. Activate it, then hack your templates (category-[category ID].php, category.php, archive.php and index.php) at the very bottom:
    // posts_nav_link(’ — ‘, __(’« Previous Page’), __(’Next Page »’));
    (Grab code.) The pager_fix() function replaces the single previous/next links with links pointing to all relevant pages, so that every post is maximal two clicks away from the main page respectively its categorized archive page. Clever.

Did I really promise that applying basic SEO to a WordPress blog is done in five minutes? Well, that’s a lie, but you knew that beforehand. I want you to change your sidebar too. First set the archives widget to display as a drop down list or remove it completely. Second, if you’ve more than a handful of categories, remove the categories widget and provide another topically organized navigation like category index pages. Linking to every category from every page dilutes relevancy with regard to search engine indexing, and is –with long lists of categories in tiny sidebar widgets– no longer helpful to visitors.

When you’re at your sidebar.php, go check whether the canonicalization recommended above broke the site search facility or not. If you find a line of HTML code like
<form id="searchform" method="get" action="./index.php">

then search is defunct. You should replace this line by
<form id="searchform" method="post” action=”<?php
$searchUrl = get_bloginfo(’url’);
if (substr($searchUrl, -1, 1) != “/”) {
$searchUrl .= “/”;
print $searchUrl; ?>”>
(grab code)
and here is why: The URL canonicalization routine adds a trailing slash to ./index.php what results in a 404 error. Next if the method is “get” you really want to replace that with “post” because firstly with regard to Google’s guildelines crawlable search results are a bad idea, and secondly GET-forms are a nice hook for negative SEO (that means that folks not exactly on your buddy list can get you ranked for all sorts of naughty out-of-context search terms).

Finally fire up your plain text editor again and create a robots.txt file:

User-agent: *
# …
Disallow: /2005/
Disallow: /2006/
Disallow: /2007/
Disallow: /2008/
Disallow: /2009/
Disallow: /2010/
# …
(If you go for the “www” thingy then you must write “” in the sitemaps-autodiscovery statement! The robots.txt goes to the root directory, change the paths to /blog/2007/ etcetera if you don’t blog in the root.)

You may ask why I tell you to remove all references to the archives. The answer is that firstly nobody needs them, and secondly they irritate search engines with senseless and superfluous content duplication. As long as you provide logical, topically organized and short paths to your posts, none of your visitors will browse the archives. Would you use the white pages to lookup a phone number when entries aren’t ordered alphabetically but by date of birth instead? Nope, solely blogging software produces crap like that as sole or at least primary navigation. There are only very few good reasons to browse a blog’s monthly archives, thus a selection list is the perfect navigational widget in this case.

Once you’ve written a welcome post, submit your sitemap to Google and Yahoo!, and you’re done with your basic WordPress SEOing. Bear in mind that you don’t receive shitloads of search engine traffic before you’ve acquired good inbound links. However, then you’ll do much better with the search engines when your crawlability is close to perfect.

Updated 09/03/2007 to add Richard’s pager_fix tip from the comments.

Updated 09/05/2007 Lucia made a very good point. When you copy the code from this page where WordPress “prettifies” even <code>PHP code</code>, you end up with crap. I had to learn that not every reader knows that code must be changed when copied from a page where WordPress replaces wonderful plain single as well as double quotes within code/pre tags with fancy symbols stolen from M$-Word. (Actually, I knew it but sometimes I’m bonelazy.) So here is the clean PHP code from above (don’t mess with the quotes, especially don’t replace double quotes with single quotes!).

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

If you free-host your blog flee now!

Run away as fast as you can!Dear free hosted blogger, here is food for thoughts, err my few good reasons to escape the free-hosted blogging hell.

If you don’t own the domain, you don’t own your content. In other words: all free hosts steal content, skim traffic, share your reputation, and whatnot indulging the evil side of life 2.0. You get what you pay for, and you pay with your contents, your reputation, and a share of your traffic.

Of course you’ve the copyrights, but not the full power of disposition. Sooner or later –rather sooner if your blogging experiment becomes a passion and your blog an asset– you want to leave the free host, at least if you don’t decide to abandon your blog. At this point you’ll spot that your ideal blogging world is a dungeon in reality, from which you can’t escape saving your bacon.

For the sake of this discussion I don’t need to argue with worst case scenarios like extremely crappy free hosts which skim a fair amount of your traffic to sell it or feed their cash cows with, plaster your pages with their ads, don’t offer content export interfaces, and more crap like that. I’m talking about a serious operation, the free blogging service from the very nice folks at Google.

Web content is more than a piece of text you wrote. A piece of text anywhere on the ‘net has absolutely no value without the votes which make it findable. Hence the links pointing to a blog post, the feed subscriptions, the comments, and your text build the oneness we refer to as content.

Your text lives in Blogger’s database, which you can tap through the API. Say you want to move your blog to WordPress, what can you pull using the WordPress Blogger importer? Posts and comments, but not all properties of the comments, and some comments are damaged.

  • Many of your commenters are signed in with Blogger, commenting under their blogger account, so you don’t get their email addresses and URLs.
  • Even comments where the author typed in an email addy and URL come in with the author’s name only. I admit that may be a flaw in the WordPress script, but it sucks.
  • Blogger castrates links on save, so links embedded in comments are nofollow’ed. Adding nofollow crap to moderated comments on the fly is evil enough, but storing and exporting condomized comments contributed to your posts counts as damage to property.

According to Google’s very own rules the canonical procedure to move a page to another URL is a permanent redirect. Blogger like most “free” platforms doesn’t allow server sided scripting, so you can’t 301-redirect your posts from to your new blog’s pages. Blogger’s technical flaws (the permalink variable is not yet populated in the HEAD section of the template, hence it can’t be used to redirect to the actual posts’s new location with a zero meta refresh) dilute each post’s PageRank because it can’t be transferred to its new location directly. Every hop (internal link on the new blog pointing to the post from the meta redirect’s destination page) devours a portion of the post’s PageRank.

The missing capability to redirect properly, that is page by page, from blogspot to another blog hinders traffic management a blogger should be able to do, and results in direct as well as indirect traffic losses. It’s still your content, but you’ve not the full power of disposition, and that’s theft, err part of your payment for hosting and services.

PageRank is computed based on a model emulating surfing behavior. Following this theory a loss of PageRank equals a loss of human traffic. The reality is, that you don’t lose traffic in theory. You lose a fair amount of visitors who have clicked a link to a particular post and land through the all pages to one URL redirect on a huge page carrying links pointing to all kind of posts, exactly there, on the links page. A surfer not getting the expected content hits the back button faster than you can explain why this shabby redirect is not your fault. And yes, PageRank is a commodity. The post’s new location will suffer from a loss of search engine traffic, because PageRank is a ranking factor too.

As defined above, a post’s inbound links as well as the PageRank gained thereof belongs to the post, and Blogger steals takes away a fair amount of that when you move away from blogspot. Blogger also steals collects the fee (link love and, in case you move, click throughs from the author’s link) you owe your commenters for contributing content to your blog, regardless whether you stay or go away.

Of course you can jump through overcomplicated hoops by first transferring the blogger blog to its own domain, publishing it there for a while before you install WordPress over the Blogger blog. Blogger’s domain mapping will then do page by page redirects, but you’re stuck with the crappy url structure (timestamp fragments in post URLs). I mean, when I want to cross a street, is it fair to tell me that I can do that anytime but if I’d like to arrive unhurt then I must take the long route, that is a turnabout for an orbit around the earth?

Having said that, there are a few more disadvantages with Blogger even before you move to another platform on your own domain.

  • Blogger inserts links seducing your visitors into leaving your blog, and links to itself (powered by Blogger images) sucking your PageRank.
  • If you have to change a post’s title, Blogger changes the URL too. You can’t avoid that, so all exisiting traffic lands on Blogger’s very own 404 page on The 404 page should be part of the template, hosted on, so that you can keep your visitors.
  • Commenting on a Blogger blog is a nightmare with regard to usability, so you miss out on shitloads of user contributed contents.
  • Blogger throws nofollow crap on your comments like confetti, even when you’ve turned comment moderation and captchas on, what should prove that you’ve control over outgoing links in the comments.
  • There is a saboteur in Google’s Blogger team. Every now and then Blogger inserts “noindex” meta tags, even on Google’s very own blogs, or silently deindexes your stuff at all search engines in other ways.
  • Often the overcrowded servers of and/or are so slow, that you can’t post nor approve comments, and your visitors don’t get more than the hourglass for 30 minutes and then all of a sudden a fragment of broken XML. This unreliable behavior does not exactly support your goal of building a loyal readership and keeping recurring visitors happy. You suffer when by accident a few blogs on your shared box get slashdotted, digged, stumbled …, and Blogger can’t handle those spikes.
  • Ok, better don’t get me started on a Blogger rant … ;)

By the way we’re in the same boat. When I started my blogging experiment in 2005 I was lazy enough to choose Blogger, although after many years of webmastering, providing Webmaster support and rescuing contents from (respectively writing off contents on) free hosts I should have known that I was going to run into serious troubles. So do yourself a favor and flee now. Blogger is not meant as a platform for professional blogs. It’s Google’s content generator for AdSense. That’s a fair deal with personal blogs, but unacceptable for corporate blogs.

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

The technical side of moving a blog from Blogger to WordPress

Recently I had to manage an exodus of Blogger driven posts to this WordPress blog. During the move I learned a few new things, developed a few pieces of code, and thought it might be a good idea to share my experiences. Probably there are other bloggers who want to leave but don’t do it because they are afraid of the aftermaths.

Such a move comes with pitfalls and unavoidable traffic losses, so here is my try to minimize the downsides which you please don’t read as kinda move-Blogger-blog-to-WordPress-guru tutorial.

Loading WordPress with Blogger posts and comments

After installing WordPress on this brand new domain, one of my first steps was to feed it with content, and to announce this content to search engines. Search engines don’t care to index posts totally fucked up due to formating issues, but every indexed URL is an asset I can fine tune later on. I figured that Google would need at least a week or so to index the whole blog and didn’t care much about the other engines, which never sent much visitors to my pamphlets. This week gave me enough time to find the broken pages and to remove PRE tags and HTML comments causing the mess.

I’ve imported my Blogger posts and comments into WordPress using the standard import functionality. Pretty neat script by the way (if it can’t access the Blogger database, look at this plugin). Without even looking at the imported stuff I created an XML sitemap and submitted it to Google (you should submit it to Yahoo! too). In the sitemaps settings I’ve disabled the archives because I really don’t want any engine to index them. Then I created a robots.txt, blocked the archives, and added the sitemap autodiscovery statement so that Yahoo!, MSN and Ask can pick up my new blog too. Replacing the uncrawlable archive pages I’ve created categorized links pages like this one later on.

Now I needed to connect my old blogger posts to the new canonical URLs in order to route the human traffic as well as crawlers to the right pages.

    Here are six technical bits which could be helpful:

  1. The first step was getting the mappings from the blogspot URLs to the new pages. Extracting this info from formatted sources was no option, so I connected to my WordPress database and submitted this query to get the raw data:

    SELECT wp_posts.ID,
    FROM wp_posts
    LEFT OUTER JOIN wp_postmeta ON (wp_postmeta.post_id = wp_posts.ID)
    WHERE wp_posts.ID > 1 AND wp_posts.ID < 176
    AND wp_posts.post_status = 'publish'
    AND wp_posts.post_type = 'post'
    AND wp_postmeta.meta_key = 'blogger_permalink'
    ORDER BY wp_posts.ID
    LIMIT 176
    (ID #1 was the generated welcome post, and #175 was the ID of the last post imported from Blogger)

  2. Next I wanted a flexible and persistent data source to make use of the Blogger-URL relations for various purposes, so I created a routing table (joins are too expensive, VIEWs were introduced by MySQL 5.1 and I run an older version) to store the URL mappings (Blogger to WordPress) and populated it from the query above:

    CREATE TABLE IF NOT EXISTS `wp_blogger_url_maps` (
    `post_id` BIGINT( 20 ) NOT NULL ,
    `post_title` VARCHAR( 255 ) NOT NULL ,
    `post_name` VARCHAR( 255 ) NOT NULL ,
    `guid` VARCHAR( 255 ) NOT NULL ,
    `bum_blogger_rel_url` VARCHAR( 255 ) NOT NULL ,
    UNIQUE ( `post_id` ) ,
    INDEX ( `post_title` ) ,
    INDEX ( `post_name` ) ,
    INDEX ( `guid` ) ,
    INDEX ( `bum_blogger_rel_url` )
    COLLATE utf8_general_ci

    Of course you should do that with a script written in a way that you can repeat this procedure. While you’re working on your new blog you’ll still post at blogspot, and visitors will comment. Also, the search engines need to pick up your new blog and that takes a while, so no rush at all.

    Please note that when you perform repeated Blogger imports into a WordPress database which stores imported Blogger posts already, new comments to old posts lose their connection to the post and get assigned to the blog’s main page. There’s no official way to move a comment from there to the post it belongs to. So better copy these comments manually, that’s doable with Better Comments Manager, where you can reply from the comments list and edit the author. However, it may be a good idea to do the final import as one of the last steps to prevent you from too many manual tasks like that.

    Unfortunately the WordPress Blogger import does not change links pointing to blogspot URLs in your posts. I’ve parsed the post_content column for these links as well as image locations at and created a list of posts to edit. It is possible to automate that further, at least for the links to other posts, but I had to edit many posts due to formatting issues anyway and didn’t link much to my other posts, so I did that manually (respectively will do over time). It makes sense to parse the imported posts for HTML comments and PRE tags which work fine with Blogger but can break the layout under WordPress.

  3. Here are a few ideas what one can do with such a mapping table. To accomplish it you need a plugin that allows the execution of PHP code within the content of posts and pages.

    Looping the wp_blogger_url_maps table you can create for example an index page of all imported blogspot posts and their new locations.

    Or you could write a mapping tool which delivers new URLs and ask your friends to use it to update their posts linking to you.

  4. What you really should do is writing a redirect script to “link” from your old blogspot posts to the new URLs. Make sure that the redirect code is 301, not 302! If you only set the location you get an unwanted 302 redirect:

    @header(”HTTP/1.1 301 Moved Permanently”, TRUE, 301);
    @header(”Location: $guid”);

    Say the script is and accepts an input variable src used to locate the new canonical URL. In your blogger template’s post section you can add this link a while before you move, so that search engines become comfortable with the new locations:

    <em>posted by <a href="
    <$BlogItemPermalinkUrl$>"><$BlogItemAuthorNickname$></a> @ <a href="<$BlogItemPermalinkUrl$>" title="permanent link"><$BlogItemDateTime$> · PERMANENT LINK</a></em>
    (Remove the “~\n” when you copy the code!)

    Another possible issue you might solve with these links is that you can transfer the source bonus in search engine indexes from the old posts to the new URLs. One indicator used by the engines to figure out which one of two identical page contents is the source is an unidirectional link. The major search engines do that silently, Technorati even documents it with “NEW URL !” as the linked post title (of the old location) when you put a textual hint like “moved to” or so on the old pages.

  5. Later on when you actually move you should change the nickname link to your new blog’s root index page, and put the redirect script in the permalink’s href. Then insert a robots meta tag “noindex,follow” in the blogger template and add prominent links to the new URLs to each post.

    Monitor the traffic on blogspot (use any free blog stats package or tools like MBL). When most visitors populate your new blog and the search engines have indexed it completely, you can redirect all blogspot URLs to your new address by inserting a zero refresh redirect meta tag:

    <meta http-equiv=refresh content="0; url=" />

    That will transfer PageRank as well as human visitors to the URL above. It does not route directly to the posts the visitors expected to see when clicking a link on another blog or a SERP (in the HEAD section of the blogger template the variable <$BlogItemPermalinkUrl$> is not yet populated with the permalink so you’ve to use a hard coded URL in the meta refresh directive).

    The redirects from blogspot to my blog come with disadvantages because it’s not possible to map each and every URL to a corresponding page on this site. From a few pages like archives and so on I can link out to my exodus page or the root, but can’t map a post-URL or so. So I’ve not yet decided whether I’ll do the final redirect or not.

    Of course it would transfer the PageRank from my old blog to this site, but it certainly would confuse visitors who click a link to any post on blogspot and land on the exodus page or the main page here. I guess that’s a sure-fire procedure to lose visitors. I tend to leave the ugly blogspot thingy as it is now, plastered with links pointing here. I’d rather miss out on a few folks who read my old stuff at blogspot and don’t click through to this blog, than piss off way more visitors with a zero meta refresh. Also, the old blog’s main page only showed a toolbar PR 4 and I’m not afraid to write that off, especially because the very nice folks linking to me in their blogrolls have changed the URL already, and a few friends have even edited their posts — THANKS!– linking to me.

  6. Redirecting folks consuming my stuff in their feed readers was quite easy. I’ve burned this blog’s feed with Feedburner’s MyBrand (free, you get a feed URL like When I was ready to move my still buggy blog I wrote a farewell Blogger post, waited a day to reach most if not all readers, then I redirected my old blogger feed to feedburner resulting in a nice spike (from zero to 150 subscribers) in my Feedburner stats. In Blogger go to Settings/Feed, enter the new feed’s URL and you’re done. You can do that without burning your feed too, but then you miss out on the stats.

Well, a few days after the move everything runs smoothly and as expected. Google has indexed and ranked 60 pages and still counting, I spotted my very first SERP referrer, and the number of indexed pages from decreases slowly caused by the noindex robots meta tag. The other engines are still crawling, only Yahoo has indexed 3 pages and 100 inbound links so far. StumbleUpon users liked my not that serious canonical SEO definitions and created more buzz than Sphinn so far. I feel lucky.

My to-do list is here and if you’re interested in my scripts drop me a message in the comments.

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

Google is neat

August/16/2007: I’ve installed WordPress 8 days ago on this brand new domain.
August/17/2007: I’ve submitted an XML sitemap to Google.
August/18/2007: I’ve (somewhat hidden) linked to this domain from my old blog.
August/23/2007: Ms. Googlebot has crawled 749 pages from this blog, 9 pages made it in the Web search index so far.
August/24/2007: I got the very first hit from a Google SERP for [Google is neat]:
Google is neat - my first SERP referrer
Considering the number of results for this search term I think my #4 spot is not too bad, although it’s purely based on BlitzIndexing and certainly not to stay for long. The same post from my old blog ranks #22 for this search, probably caused by its link (via a 301 redirect script) to the new URL.

Interestingly the search query URL in my referrer stats is too clean, it lacks all the gimmicks Google adds when one searches with a browser. So who did that to alert me on the indexing? Thanks for choosing such a neat search term! :)

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

Welcome back at Sebastian’s Pamphlets!

Dear friends and loyal readers,

I didn’t post for a while because I was working on this blog in my spare time. Not a big loss by the way, since SES in San Jose floods the SEOsphere with enough tidbits from the Google Dance and other events like paid link sermons currently. Ok, back to the breaking news: a week ago I got (unfortunately the owner of was not willing to sell the domain, although he has no Web site and I promised to keep his email addresses intact and working) and started my Blogger exodus. Meanwile I’ve imported the old stuff from, and hopefully I’ve solved all the various issues breaking my layout here.

Actually, I’m launching a buggy blog, but I can’t stand my ugly free hosted outlet any more. So please save your comments before you hit submit, because the AJAXed comment script erases it if you forget to type in the spam protection stuff, or the answer is wrong, or whatnot. There are more open items on my to-do list, but nothing that critical.

Please update your blogrolls: (without the world wide wait prefix)
and your feed readers: (I’ll redirect the old feed when my Blogger farewell post has hit most if not all feed readers). If you’d like to update your links to particular posts too, here is a tool to find the new URLs. ;)

WordPress is kinda plug ‘n play thingy, at least that’s how I’ve used it before. Installing and configuring WordPress for my personal blog was a completely other story. I looked at more details, and found many things I wanted to change or optimize. Now I’m the proud owner of the most hacked template ever. Some things weren’t doable with plugins and template-hacks, so I wrote a couple scripts too, producing enough fodder for a soon to write blog post or two. And of course I had to enhance the WordPress link structure.

At least temporarily I’ll get rid of all my search engine traffic, because I can’t redirect properly from Blogger and must noindex the old blog to avoid dupe issues. It would be nice when you dear readers could feed me with links until the engines rediscover me! ;)

I’m eager to get feedback on this blog, so please don’t hesitate to leave your dofollowed comments despite the AJAX pitfall mentioned above. I really hope you’ll like it, but I do appreciate your critiques very much because they’ll help me to improve things for your convenience.

Thank you and happy commenting!

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

How to feed old WordPress posts with link love

WordPress phases old posts out. That’s fine with timely contents, but bloggers publishing persistent stuff suffer from a loss of traffic to evergreens by design. If you’re able to hack your template, you can enhance your link structure in a way that funnels visitors and link love to old posts.

For the sake of this case study, lets assume that the archives are uncrawlable, that is blocked in robots.txt and not linked anywhere in a way that search engine crawlers follow the links. To understand the problem, lets look at the standard link structure of WordPress blogs:
Standard WordPress link structure
Say your category archives display 10 posts per page. The first 10 posts gain a fair amount of visibility (for visitors and search engines), but the next 10 posts land on category archive page #2, which is linked solely from the archive pages #1 and #3. And so on, the freshest 10 posts per category are reachable, older posts phase out.

Lets count that in clicks from the main page. The freshest 10 posts are 2 clicks away. The next bunch of 10 posts is 3 clicks away. Posts on category archive page #3 are 4 clicks away. Consider a link level depth greater than 3 crap. Search engines may index these deeply buried posts on popular blogs, but most visitors don’t navigate that deep into the archives.

Now let me confuse you with another picture. This enhanced link structure should feed each and every post on your blog with links:
Standard WordPress link structure
The structure outlined in the picture is an additional layer, it does not replace the standard architecture.

You get one navigational path connecting any page via one hop (category index page #2 on the image) to any post. That’s two clicks from any page on your blog to any post, but such a mega hub (example) comes with disadvantages when you’ve large archives.

Hence we create more paths to deeply buried posts. Both new category index pages provide links to lean categorized links pages which list all post by category (”[category name] overview” in this example corresponding to category index page #1 on the image above). If both category index pages are linked in the sidebar of all pages, you get a couple two-hop-links to all posts from all pages. That means that via a category index page and a lean category links page (example) each and every post is 3 clicks away from any other page.

Now we’ve got a few shorter paths to old posts, but that’s not enough. We want to make use of the lean category links pages to create topical one-hop-links to related posts too. With most templates every post links to one or more category pages. We can’t replace these links because blog savvy readers clicking these category links expect a standard category page. I’ve added my links to the lean categorized links pages below the comments, and there are many more ways to put them, not only on single post pages.

It’s possible to tweak this concept by flooding pages with navigational links to swipe a click level here and there, but that can dilute topical relevancy because it leads to “every page links to every page” patterns which are not exactly effective nor useful. Also, ornate pages load awfully slow and that’s a sure fire way to lose visitors. By the way that’s the reason why I don’t put a category links widget onto my sidebar.

To implement this concept I hacked the template and wrote a PHP script to output the links lists which is embedded in a standard page (/links/categories/). At the moment this experiment is just food for thoughts, because this blog is quite new (I’ve registered the domain a few days ago). However, I expect it will work.

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

Hello world!

Howdy! I’m in the process of moving my blog from blogspot to this domain. As long as you see a ToDo List here, I’m not yet ready. Ok, there’s no such thing as a blog that’s “ready”. Hence the ToDo list is here to stay. Probably forever. More on the bugs & flaws page.

    Unordered & unprioritized ToDo List

  • OK: dofollow plugin
  • OK: feedburner
  • OK: navigation in sidebar
  • OK: links + OK:blogroll
  • OK: remove “be the first …” on pages w/o comments
  • OK: Twitter and other gadgets
  • OK: configure titles (<title><?php wp_title(”",true); ?></title> (actually that’s more code coz wp_title(”",true) delivers nil for the home page)) and meta tags
  • tag old blogger posts
  • OK: 301
  • OK: post background color too dark (blockquotes) and other CSS hacks
  • OK: XML sitemap
  • credits on links page
  • enhance site search when Google has indexed everything
  • links list blogspot commenters
  • OK: friendlier 404 page which actually sends a 404
  • contact page
  • edit blogspot links in imported posts and comments (when you get pings because I’ve edited an old post of mine, I’m sorry.)
  • OK: edit categories to enable nice categorized links lists feeding old posts with link juice
  • OK: Feed buttons
  • OK: Share/bookmark links
  • OK: change author links
  • OK: linking from blogspot posts to new URLs
  • OK: sitemaps/categories page with feed links/list of articles
  • fix the disabled button + text area after AJAXed comment submissions
  • advertising? Ynot.
  • OK: think about testing vs. launching early (Hi Marissa!)
  • OK: bait crawlers (Ms. Googlebot grabbed her milk & cookies a day after I’ve registered the domain, but is confused because I’ve changed the IP address a few days later)
  • OK: ask friends for href changes
  • wait for something unspecified
  • OK: push the red button, publish the moved-draft at blogger, redirect the blogger feeds to feedburner, and turn this thingy to public
  • FINALLY: redirect the blogspot url

I’ll write a post on a few technical aspects of the move in a few days.

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

5 Reasons why I blog

So since Matt Cutts tagged by Vanessa Fox cat-tagged me 5 times ;) I add my piece.

    Napping cats don't listen
  1. Well, I’ve started this blog because every dog and his grandpa blogs, but the actual reason was, that I couldn’t convince my beloved old cat listening my rants any more. Sadly my old comrade died years ago in the age of 15, leaving alone a gang of two legged monsters rampage in house and garden.
  2. Since then I’ve used my blogs for kidding, bollocks, and other stuff not suitable for more or less static sites where I publish more seriously. However, I’ve scraped some wholehearted posts from the blog to put them on the consulting platform, because this site is way more popular. Vice versa I’ve blogged announced my other articles and projects here. This blog is somewhat a playground to test the waters and concurrently a speaking tube. I still find it difficult to do that with another platform, the timely character of blogging perfectly allows burying of half-baked things.
  3. Every now and then I write an open letter to Google, for example my series of pleas to revamp rel=nofollow. Perhaps a googler is listening ;)
    Also, a blog is a neat instrument to get the attention of folks who don’t seem to listen.
  4. Frankly I like to share ideas and knowledge. Blogging is the perfect platform to raise rumors or myths too. Also, writing helps me to structure my thoughts, this works even better in a foreign language.
  5. Last but not least I use my blog as reference. While providing Google user support sometimes I just drop a link, particulary as answer to repetitive questions. By the way Google’s Webmaster Forum is a nice place to chase SEO tidbits straight from the horse’s mouth.

Although I admit I’ve somewhat tag-baited my way in here, I’m tagging you:
Thu Tu
John Müller
John Honeck
Jim Boykin
Gurtie & Chris

Share/bookmark this: del.icio.usGooglema.gnoliaMixxNetscaperedditSphinnSquidooStumbleUponYahoo MyWeb
Subscribe to      Entries Entries      Comments Comments      All Comments All Comments

« Previous Page  1 | 2 | 3 | 4  Next Page »