You've heard all about it by now: a more stable engine and plugin architecture, the closer-to-valid XHTML that it creates, the fabulousity of stopping spammers dead in their tracks with TypeKey's comment registration and the licensing drama. But does it all seem light-years away from your MT 2.x blog?
Well, there's hope for you yet! Over the past week, I've been sharing the love by converting a couple of blogs for my friends and family. Now I'm going to take you through the changes you'll make to each template, from the Main Index to the Individual Archive to the Comment Pending page. Once you get the hang of it, you won't be able to convert just one!
Breathe and Stop
Okay, see, stop. You're all anxious and sweaty and carrying on. Take a deep breath. *inhale* *exhale* Yeah, that's it. Light some incense for extra effect. I'm going for the least complicated way to get you to the goods, so relax (even though you can REALLY mess things up). I'm assuming two things: 1) that your blog is based on the default 2.x templates and 2) that you've already upgraded from MT 2.x to 3. If your blog is more complicated than that, you might be able to use this entry sporadically, but it won't be a total solution. If you haven't upgraded to MT 3 yet, go do that first.
Set It Off
First, go to TypeKey. You'll be signing up for two things: a TypeKey user that allows you to leave registered comments on TypeKey-powered blogs and a TypeKey token that lets your blog accept comments from TypeKey users. (Make sure you check the Generate a TypeKey token ... box.) Copy that token and be sure to fill out your TypeKey profile with lots of juicy details like a picture and maybe some URLs.
Then come back to your blog's Core Setup page and go to Preferences. Go to Comment Configuration.
Check the Accept Comments from Unregistered Visitors box unless you are absolutely sure you don't want to receive ANY comments from anyone who is not a registered TypeKey user. To force every unregistered visitor to leave a (potentially fake) name and e-mail address, check the Require Name and Email Address Information box. To enable moderation of unregistered comments (meaning that you'll have to approve every unregistered comment before it can be seen on your blog), check the Enable Unregistered Comment Moderation box. Here's a warning about that, though: Comments that are sent by spammers can become e-mail sent by spammers if MT sends you an e-mail every time you get a new comment.
Just below it you'll see the doorway to Movable Type 3's pièce de resistance - the Accept Comments from Registered Visitors checkbox. Check it and paste the TypeKey token in the appropriately named field. Checking Enable Auto-Approval disables moderation of comments from registered TypeKey users - their comments appear immediately on your blog. You can also force TypeKey users to reveal their e-mail addresses to you by checking the Require Email Addresses from TypeKey box - really handy when you want to provide a mailto: link to every commenter's e-mail address.
Now that you have your comments on lockdown from knuckleheads, why not check that Allow HTML in Comments box? Hypertext links (especially relevant ones) from your commenters will make your content that much more rich. And if you really want to receive an e-mail heralding each and every comment you get, check the E-mail New Comments box.
Slowly, Surely
There are many templates within Movable Type and you always have the ability to create more. It can be confusing, even downright daunting, but it's cool - we only need to edit a few of them. Repeat that about 7 times, with incense wafting through the air. Take your time - this is not something you want to rush through. It's not that bad but if you're really apprehensive, maybe you should make copies of each template and edit the copies. If you do this, don't forget to enable these changes in the Archive Files section of your Core Setup.
Also, keep in mind that Movable Type's new default templates for MT 3 are always available either at The Mothership or by creating a new weblog. These templates are a lot closer to valid XHTML Transitional code than their predecessors; I hope your own code reflects the same thoughtfullness.
Main Index and Date-Based Archives
There's not much to change in these templates, really. We're going to be replacing the code that creates those trackback and/or comment pop-up windows in default MT 2.x with a less spastic link to the trackbacks and/or comments section of that entry's solo page - its Individual Archive. This code is identical on the Main Index and Date-Based Archives templates.
First, we're going to scrap all that Javascript in the <head> tags. It looks like this:
<script language="javascript" type="text/javascript"> function OpenComments (c) { window.open(c, 'comments', 'width=480,height=480,scrollbars=yes,status=yes'); }function OpenTrackback (c) { window.open(c, 'trackback', 'width=480,height=480,scrollbars=yes,status=yes'); } </script>
Just get rid of it. Neither the Main Index nor any Date-Based Archive needs it. If you still want pop-ups with MT 3, it is possible, but this is supposed to be easy, right? It's not that kinda party up in here.
The other changes in these two templates are the trackback and comment links after each entry. You may be wondering "Why doesn't he say comment and trackback links? That's the order I'm used to! I'm so confused ..." Well, the page that you'll be linking to now contains all the trackback pings and comments of that entry - in that order. It's here, it's queer - get used to it.
Let me reiterate: now, instead of launching a pop-up window for either trackback or comments listings, you will be linking to an anchor on the entry's Individual Archive page. This should feel like an old friend; you've been linking to those extended part of your entries like this since who knows when. So, instead of http://www.myblog.com/archives/000123.html#more, the URL will look something like http://www.myblog.com/archives/000456.html#trackbacks or http://www.myblog.com/archives/000789.html#comments.
Before:
<MTEntryIfAllowComments> | <a href="<$MTCGIPath$><$MTCommentScript$>?entry_id=<$MTEntryID$>" onclick="OpenComments(this.href); return false">Comments (<$MTEntryCommentCount$>)</a> </MTEntryIfAllowComments> <MTEntryIfAllowPings> | <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">TrackBack</a> </MTEntryIfAllowPings>
After:
<MTEntryIfAllowComments> | <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments (<$MTEntryCommentCount$>)</a> </MTEntryIfAllowComments> <MTEntryIfAllowPings> | <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">TrackBack (<$MTEntryTrackbackCount$>)</a> </MTEntryIfAllowPings>
There! If you rebuild either of these templates now, it will look like you've done absolutely nothing. Mouseover those links just to make sure.
Individual Archives
Now's the time to roll up your sleeves. And praying to a technology god wouldn't hurt, either ...
There are two things you'll be replacing within the <head> section this time: the <link> tags and the Javascript. So we'll start with the links ...
Before:
<link rel="stylesheet" href="<$MTBlogURL$>styles-site.css" type="text/css" /> <link rel="alternate" type="application/rss+xml" title="RSS" href="<$MTBlogURL$>index.rdf" /><link rel="start" href="<$MTBlogURL$>" title="Home" /> <MTEntryPrevious> <link rel="prev" href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>" /> </MTEntryPrevious> <MTEntryNext> <link rel="next" href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>" /> </MTEntryNext>
After:
<link rel="stylesheet" href="<$MTBlogURL$>styles-site.css" type="text/css" /> <link rel="alternate" type="application/rss+xml" title="RSS" href="<$MTBlogURL$>index.rdf" /> <link rel="alternate" type="application/atom+xml" title="Atom" href="<$MTBlogURL$>atom.xml" /><link rel="start" href="<$MTBlogURL$>" title="Home" /> <MTEntryPrevious> <link rel="prev" href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>" /> </MTEntryPrevious> <MTEntryNext> <link rel="next" href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>" /> </MTEntryNext>
... and now the Javascript ...
Before:
<script type="text/javascript" language="javascript"> <!--function OpenTrackback (c) { window.open(c, 'trackback', 'width=480,height=480,scrollbars=yes,status=yes'); }var HOST = '<$MTBlogHost$>';// Copyright (c) 1996-1997 Athenia Associates. // http://www.webreference.com/js/ // License is granted if and only if this entire // copyright notice is included. By Tomer Shiran.function setCookie (name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); document.cookie = curCookie; }function getCookie (name) { var prefix = name + '='; var c = document.cookie; var nullstring = ''; var cookieStartIndex = c.indexOf(prefix); if (cookieStartIndex == -1) return nullstring; var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length); if (cookieEndIndex == -1) cookieEndIndex = c.length; return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex)); }function deleteCookie (name, path, domain) { if (getCookie(name)) document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; }function fixDate (date) { var base = new Date(0); var skew = base.getTime(); if (skew > 0) date.setTime(date.getTime() - skew); }function rememberMe (f) { var now = new Date(); fixDate(now); now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); setCookie('mtcmtauth', f.author.value, now, '', HOST, ''); setCookie('mtcmtmail', f.email.value, now, '', HOST, ''); setCookie('mtcmthome', f.url.value, now, '', HOST, ''); }function forgetMe (f) { deleteCookie('mtcmtmail', '', HOST); deleteCookie('mtcmthome', '', HOST); deleteCookie('mtcmtauth', '', HOST); f.email.value = ''; f.author.value = ''; f.url.value = ''; }//--> </script>
After:
<script type="text/javascript" language="javascript"> <!--var HOST = '<$MTBlogHost$>';// Copyright (c) 1996-1997 Athenia Associates. // http://www.webreference.com/js/ // License is granted if and only if this entire // copyright notice is included. By Tomer Shiran.function setCookie (name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + (expires ? "; expires=" + expires : "") + (path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "secure" : ""); document.cookie = curCookie; }function getCookie (name) { var prefix = name + '='; var c = document.cookie; var nullstring = ''; var cookieStartIndex = c.indexOf(prefix); if (cookieStartIndex == -1) return nullstring; var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length); if (cookieEndIndex == -1) cookieEndIndex = c.length; return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex)); }function deleteCookie (name, path, domain) { if (getCookie(name)) document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; }function fixDate (date) { var base = new Date(0); var skew = base.getTime(); if (skew > 0) date.setTime(date.getTime() - skew); }function rememberMe (f) { var now = new Date(); fixDate(now); now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); if (f.author != undefined) setCookie('mtcmtauth', f.author.value, now, '/', HOST, ''); if (f.email != undefined) setCookie('mtcmtmail', f.email.value, now, '/', HOST, ''); if (f.url != undefined) setCookie('mtcmthome', f.url.value, now, '/', HOST, ''); }function forgetMe (f) { deleteCookie('mtcmtmail', '', HOST); deleteCookie('mtcmthome', '', HOST); deleteCookie('mtcmtauth', '', HOST); f.email.value = ''; f.author.value = ''; f.url.value = ''; }//--> </script>
... and that's that. These two replacements didn't change all that much (basically you added a link to an Atom-flavored main index and tweaked the same cookie-related stuff), but better safe than sorry.
Cool. You still with me? Cool! Okay, there's the little matter of that old Trackback link at the end of the entry. It used to be so cute, launching that little pop-up window. *sigh* Well, since we've utterly destroyed the Javascript it refers to, we don't need it anymore. So, it's goodbye yellow brick road for ye olde Trackback link. See ya, buddy.
Before:
<span class="posted">Posted by <$MTEntryAuthor$> at <$MTEntryDate$> <MTEntryIfAllowPings> | <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">TrackBack</a> </MTEntryIfAllowPings> <br /></span></div>
After:
<span class="posted">Posted by <$MTEntryAuthor$> at <$MTEntryDate$><br /></span></div>
Really, you could chuck that <br /> tag and change that <span> tag to a <p> tag, but, again, you want to change as little as possible. Infusing better XHTML standards within your code is beyond. Way beyond. And well worth the effort.
Right here, following the entry, there's a listing of all trackback pings (from wherever you're being pinged from) and a listing of all comments (from registered and unregistered users). So for our next trick, you'll add something completely new - the listing of trackback pings to this entry. Just pop it in right here. Here ya go:
<MTEntryIfAllowPings> <a id="trackbacks"></a> <div class="comments-head">Trackback Pings</div> <p class="techstuff">TrackBack URL for this entry:<br /> <$MTEntryTrackbackLink$></p><MTIfNonZero tag="MTEntryTrackbackCount"> <p>Listed below are links to weblogs that reference <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>:</p><MTPings> <a id="p<$MTPingID$>"></a> <div class="comments-body"> <p>» <a href="<$MTPingURL$>"><$MTPingTitle$></a> from <$MTPingBlogName$><br /> <$MTPingExcerpt$> <a href="<$MTPingURL$>">[Read More]</a></p> <span class="comments-post">Tracked on <$MTPingDate$></span> </div> </MTPings> </MTIfNonZero> </MTEntryIfAllowPings>
Okay, now the listing of comments of this entry goes here. Very little has changed, but you'll notice the difference immediately - when a registered user leaves a comment.
Before:
<MTComments> <div class="comments-body"> <$MTCommentBody$> <span class="comments-post">Posted by: <$MTCommentAuthorLink spam_protect="1"$> at <$MTCommentDate$></span> </div> </MTComments>
After:
<MTComments> <a id="c<$MTCommentID$>"></a> <div class="comments-body"> <$MTCommentBody$> <span class="comments-post">Posted by: <$MTCommentAuthorLink spam_protect="1"$> <MTCommentAuthorIdentity> at <$MTCommentDate$></span> </div> </MTComments>
*Bonus Round* You want linkable comments? Add this instead:
<MTComments> <a id="c<$MTCommentID$>"></a> <div class="comments-body"> <$MTCommentBody$> <span class="comments-post">Posted by: <$MTCommentAuthorLink spam_protect="1"$> <MTCommentAuthorIdentity> at <a href="<$MTEntryPermalink$>#c<$MTCommentID$>"><$MTCommentDate$></a></span> </div> </MTComments>
Now, we're in the belly of the beast. This is where all that new logic exists that lets you get comments the old way (from unregistered users with a name and e-mail address - if that's what you require) and the new way (from users with registered TypeKey profiles). Remember *squeezes your hand* you're a champ! You can do this! Breathe!
Now, this easiest way to do this is to gut this template from the opening <MTEntryIfCommentsOpen> tag to the closing </MTEntryIfAllowComments> tag. If you have customized your forms, they won't survive. Maybe once you're up and running, you can go back and tweak them, but for now, you want them to work - with your sanity intact.
So, replace that gaping hole you just made in your template with the following code:
<MTEntryIfCommentsOpen><MTIfCommentsAllowed><div class="comments-head">Post a comment</div> <div class="comments-body"><MTIfRegistrationRequired><MTIfNonEmpty tag="MTTypeKeyToken"> <div id="thanks"> <p>Thanks for signing in, <script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script><script>document.write(commenter_name);</script>. Now you can comment. (<a href="<$MTCGIPath$><$MTCommentScript$>?__mode=handle_sign_in&static=1&entry_id=<$MTEntryID$>&logout=1">sign out</a>)</p><p>(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)</p><form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)"> <input type="hidden" name="static" value="1" /> <input type="hidden" name="entry_id" value="<$MTEntryID$>" /><p><label for="url">URL:</label><br /> <input tabindex="1" type="text" name="url" id="url" /> Remember me? <input type="radio" id="remember" name="bakecookie" /><label for="remember">Yes</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">No</label><br style="clear: both;" /></p><p><label for="text">Comments:</label><br /> <textarea tabindex="2" id="text" name="text" rows="10" cols="50"></textarea></p><div align="center"> <input type="submit" tabindex="3" name="preview" value=" Preview " /> <input style="font-weight: bold;" tabindex="4" type="submit" name="post" value=" Post " /> </div> </form></div><script language="javascript" type="text/javascript"> <!-- if (commenter_name) { document.getElementById('thanks').style.display = 'block'; } else { document.write('<p>You are not signed in. You need to be registered to comment on this site. <a href="<$MTSignOnURL$>&<MTIfNeedEmail>need_email=1&</MTIfNeedEmail>t=<MTTypeKeyToken>&_return=<$MTCGIPath$><MTCommentScript>%3f__mode=handle_sign_in%26static=1%26entry_id=<$MTEntryID$>"> Sign in</a></p>'); document.getElementById('thanks').style.display = 'none'; } // --> </script><MTElse> <p>! Comment registration is required but no TypeKey token has been given in weblog configuration!</p> </MTElse> </MTIfNonEmpty><MTElse> <MTIfNonEmpty tag="MTTypeKeyToken"> <script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script> <p><script language="javascript" type="text/javascript"> <!-- if (commenter_name) { document.write('Thanks for signing in, ', commenter_name, '. Now you can comment. (<a href="<$MTCGIPath$><$MTCommentScript$>?__mode=handle_sign_in&static=1&entry_id=<$MTEntryID$>&logout=1">sign out</a>)'); } else { document.write('If you have a TypeKey identity, you can <a href="<$MTSignOnURL$>&<MTIfNeedEmail>need_email=1&</MTIfNeedEmail>t=<MTTypeKeyToken>&_return=<$MTCGIPath$><MTCommentScript>%3f__mode=handle_sign_in%26static=1%26entry_id=<$MTEntryID$>"> sign in</a> to use it here.'); } // --> </script></p> </MTIfNonEmpty><form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)"> <input type="hidden" name="static" value="1" /> <input type="hidden" name="entry_id" value="<$MTEntryID$>" /><div id="name_email"> <p><label for="author">Name:</label><br /> <input tabindex="1" id="author" name="author" /></p><p><label for="email">Email Address:</label><br /> <input tabindex="2" id="email" name="email" /></p> </div><MTIfNonEmpty tag="MTTypeKeyToken"> <script language="javascript" type="text/javascript"> <!-- if (commenter_name) { document.getElementById('name_email').style.display = 'none'; } // --> </script> </MTIfNonEmpty><p><label for="url">URL:</label><br /> <input tabindex="3" type="text" name="url" id="url" /> Remember Me? <input type="radio" id="remember" onClick="rememberMe(this.form)" name="bakecookie" /><label for="remember">Yes</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">No</label><br style="clear: both;" /> </p><p><label for="text">Comments:</label> <MTIfAllowCommentHTML> (you may use HTML tags for style)</MTIfAllowCommentHTML><br/> <textarea tabindex="4" id="text" name="text" rows="10" cols="50"></textarea></p><div align="center"> <input type="submit" name="preview" tabindex="5" value=" Preview " /> <input style="font-weight: bold;" type="submit" name="post" tabindex="6" value=" Post " /> </div> </form></MTElse> </MTIfRegistrationRequired> </div> </MTIfCommentsAllowed><script type="text/javascript" language="javascript"> <!-- if (document.comments_form.email != undefined) document.comments_form.email.value = getCookie("mtcmtmail"); if (document.comments_form.author != undefined) document.comments_form.author.value = getCookie("mtcmtauth"); if (document.comments_form.url != undefined) document.comments_form.url.value = getCookie("mtcmthome"); if (getCookie("mtcmtauth") || getCookie("mtcmthome")) { document.comments_form.bakecookie[0].checked = true; } else { document.comments_form.bakecookie[1].checked = true; } //--> </script> </MTEntryIfCommentsOpen> </MTEntryIfAllowComments>
... and you're done! The worst is over! I guess that blood sacrifice paid off after all! *LOL!*
Comment Pending, Comment Preview and Comment Error
Okay, we're in the home stretch. And I have to admit a bit of laziness. If you've already read this entry, you know that this section was originally called "Comment Pending" ... so no, it's not you, it's me. I thought I could gloss over the Comment Preview and Comment Error templates because, for real, how many people actually use them? Well, as I tested someone's blog after making the rest of the changes, I did a preview. Movable Type used the layout originally designed for a tiny pop-up on the whole page. Ill! Hence, the edit.
Creating these template might be a little tricky, but it's easy. Basically you're going to delete whatever's in your Comment Pending, Comment Preview and Comment Error templates, copy your Main Index template, paste that back into each template and replace everything between the <div class="content"> tags (including all that sidelink stuff) with either a message thanking the unregistered commenter and asking her/him not to bug out and that the comment will be posted as soon as it's approved - with a handy link back to the entry (Comment Pending) or the comment that was just submitted for preview (Comment Preview) or an error message (Comment Error). Got all that?
Comment Pending, for <div class="content">:
<h3 class="title">Thank You for Commenting</h3><p>Your comment has been received. To protect against malicious comments, I have enabled a feature that allows your comments to be held for approval the first time you post a comment. I'll approve your comment when convenient; there is no need to re-post your comment.</p><p><a href="<MTEntryLink>">Return to the comment page</a></p>
Great great great ... actually, there's something else I neglected to mention: you also need to add a little bit of Javascript to the <head> section for the Comment Preview and Comment Error templates. Right after that <link> tag would be lovely. Tunnel, light, blah blah blah - let's do this.
Comment Preview and Comment Error, for <head>:
<script language="JavaScript"> function getCookie (name) { var prefix = name + '='; var c = document.cookie; var nullstring = ''; var cookieStartIndex = c.indexOf(prefix); if (cookieStartIndex == -1) return nullstring; var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length); if (cookieEndIndex == -1) cookieEndIndex = c.length; return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex)); } </script>
Comment Preview, for <div class="content">:
<h3 class="title">Previewing your Comment</h3><$MTCommentPreviewBody$> <span class="posted">Posted by <$MTCommentPreviewAuthorLink spam_protect="1"$> at <$MTCommentPreviewDate$><br /></span><MTIfCommentsAllowed> <MTCommentFields> </MTIfCommentsAllowed><div class="comments-head">Previous Comments</div><MTComments> <div class="comments-body"> <$MTCommentBody$> <span class="comments-post">Posted by <$MTCommentAuthorLink spam_protect="1"$> at <$MTCommentDate$></span> </div> </MTComments>
Comment Error, for <div class="content">:
<h3 class="title">Comment Submission Error</h3><p>Your comment submission failed for the following reasons:</p><blockquote><strong><$MTErrorMessage$></strong></blockquote><MTIfCommentsAllowed> <MTCommentFields> </MTIfCommentsAllowed>
Mission accomplished! Now you probably have the flyest blog on your block! And I feel SOOOO much better now that I've edited this section, giving you everything you need to make your (and your readers') MT 3 experience complete and oh so nice. YAY!
Troubleshooting
If you are having problems once you've finished massaging all of your templates, these tips might help:
- Restart your browser
If your browser is a cache fiend like mine, restart it. Or open up another browser. Or download another browser! - Check your URLs
TypeKey is EXTREMELY demanding. If TypeKey tells you "The site you're trying to comment on has not signed up for this feature" and you KNOW that you've done that and have entered your TypeKey token into your blog's Core Setup | Preferences | Comment Configuration, then check your URLs. The URL that you enter into your TypeKey profile must appear EXACTLY as it does in your Core Setup. No,http://myblog.comis NOT the same ashttp://www.myblog.com/.
The End of the Road
This concludes our journey together. If all has gone well, you are now the proud owner of a blog powered by Movable Type 3, a blog now brimming with even more possibilities. Now go forth and share your brand-new funky fresh blog with the world! And once you've done it a couple of times for your loved ones, you might want to consider helping out over at the support forums. There's always someone there who would love your help. Enjoy!
Oh, and if this entry has helped you at all, let me know - leave a comment and/or ping this entry. And please consider leaving a tip. I would really appreciate it!

Donald’s tutorial went over like gangbusters.
Good on ya.
hmm….gonna think about it for a moment.
me brain is hurtin’ yo!!
See, this is why I had to leave updating to you and you alone. This shit confuses the hell out of me. I know simple HTML and just about nothing else.
Hey, what about my translation :) ?
Yes. You are a good man. A very good man. Thanks for the mad tips. I’ll say this…I love the MT interface and I’ll nerd it up with the best of ‘em, but thanks for letting me cut and paste and make my upgrade nice n’ eazy.
-john
I thinks this post was useful. I’m now too tired to go about implementing the changings.. We’ll try later. Mainly trying to get that Typekey stuff to work.
Thank you for the tutorial. I’m thinking of starting my own design blog, and I hope this will help me. Though I’ll definitely have to consult someone who knows html realy well (I know just basics). But that’s great I have your post to help me!!!
I HATE TYPEKEY!! I HATE MOVEABLE TYPE!! My fairly popular blog was being peppered by bad-vibed commenters. I’ve been trying to move over to typekey authentication system. Weeks of trying to change the templates and javascript and typekey tokens and everything have miserably failed. I’ve read this tutorial probably 20 times.. painstakingly following the directions each time. NEVER HAS IT WORKED!!! I HATE COMPUTERS!! this comment probably won’t even work!!!