teranex weblog - converthttps://budts.be/2010-12-18T12:31:00+01:00Convert a Nucleus blog to Wordpress2009-01-13T21:10:00+01:002010-12-18T12:31:00+01:00Jeroen Budtstag:budts.be,2009-01-13:/weblog/2009/01/convert-a-nucleus-blog-to-wordpress<p>As you could read in my previous post, I converted my weblog from <a href="http://nucleuscms.org">Nucleus CMS</a> to <a href="http://wordpress.org">Wordpress</a>. This article illustrates how I did it.</p>
<h2>Import Nucleus content</h2>
<p>I started by looking for <a href="http://sourceforge.net/projects/nuc2wp/">a converter for Nucleus to Wordpress</a>. I was happy to find one for Wordpress 2.1. Because I wanted to do most of the work while being offline (on the train), I then setup a local environment. This was very easy with <a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a>. After having the Magic LAMP running, I created a local database and imported all my Nucleus tables. Then I installed Wordpress 2.1 in my local environment and started the conversion. It must have been my lucky day, everything seemed to work and my Nucleus content (items, comments, users, trackbacks etc) were imported into Wordpress. After the import i could easily update Wordpress 2.1 to 2.7.</p>
<h2>The Theme</h2>
<p>The next important step: convert my carefully crafted ( ;-) ) Nucleus skin to a Wordpress theme. I thought this would be rather time consuming, but actually it …</p><p>As you could read in my previous post, I converted my weblog from <a href="http://nucleuscms.org">Nucleus CMS</a> to <a href="http://wordpress.org">Wordpress</a>. This article illustrates how I did it.</p>
<h2>Import Nucleus content</h2>
<p>I started by looking for <a href="http://sourceforge.net/projects/nuc2wp/">a converter for Nucleus to Wordpress</a>. I was happy to find one for Wordpress 2.1. Because I wanted to do most of the work while being offline (on the train), I then setup a local environment. This was very easy with <a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a>. After having the Magic LAMP running, I created a local database and imported all my Nucleus tables. Then I installed Wordpress 2.1 in my local environment and started the conversion. It must have been my lucky day, everything seemed to work and my Nucleus content (items, comments, users, trackbacks etc) were imported into Wordpress. After the import i could easily update Wordpress 2.1 to 2.7.</p>
<h2>The Theme</h2>
<p>The next important step: convert my carefully crafted ( ;-) ) Nucleus skin to a Wordpress theme. I thought this would be rather time consuming, but actually it only took me 10 hours (on the train) to completely convert my skin. I started from the default Wordpress theme, which was very helpful to see how everything works. Other details in this step are less important, because they are specific to my theme.</p>
<h2>Cool URI's never change</h2>
<p>Because I get quite a few incoming links from Google and other sites, I wanted to keep the Nucleus FancyURL's working and redirect visitors of the 'old' urls to the new ones. To get this working I took a few steps. A FancyURL in Nucleus looks like <code>http://budts.be/weblog/item/123</code>. However a url in wordpress looks like <code>http://budts.be/weblog/2009/01/my-post</code>. So first I had to find the mapping between the old Nucleus ID's every item and it's new Wordpress permalink. To do so I used a hackish SQL query on the database:</p>
<div class="highlight"><pre><span></span><span class="k">select</span> <span class="n">CONCAT</span><span class="p">(</span><span class="s1">'$items['</span><span class="p">,</span><span class="n">n</span><span class="p">.</span><span class="n">inumber</span><span class="p">,</span><span class="s1">'] = "'</span><span class="p">,</span><span class="k">year</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">post_date</span><span class="p">),</span><span class="s1">'/'</span><span class="p">,</span>
<span class="k">month</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">post_date</span><span class="p">),</span><span class="s1">'/'</span><span class="p">,</span><span class="n">w</span><span class="p">.</span><span class="n">post_name</span><span class="p">,</span><span class="s1">'/";'</span><span class="p">)</span> <span class="k">from</span> <span class="n">wp_posts</span> <span class="n">w</span><span class="p">,</span>
<span class="n">nucleus_item</span> <span class="n">n</span> <span class="k">where</span> <span class="n">n</span><span class="p">.</span><span class="n">ibody</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">post_content</span>
</pre></div>
<p>The query missed a few items, but i guess a 90% ratio is good enough (the earth won't end if a few items aren't correctly mapped, right?). This query gives output such as:</p>
<div class="highlight"><pre><span></span><span class="cp"><?php</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">549</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2005/10/het-wordt-weeral-herfst/"</span><span class="p">;</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">550</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2005/11/digg/"</span><span class="p">;</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">551</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2005/11/how-to-tuesday-disable-autorun-on-windows/"</span><span class="p">;</span>
</pre></div>
<p>This is the code that I copy pasted in a new PHP-file with the name 'redirector.php'. This PHP-script looks like:</p>
<div class="highlight"><pre><span></span><span class="cp"><?php</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"type"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"category"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">redirectCategory</span><span class="p">(</span><span class="nb">intval</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"id"</span><span class="p">]));</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"type"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"item"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">redirectItem</span><span class="p">(</span><span class="nb">intval</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"id"</span><span class="p">]));</span>
<span class="p">}</span>
<span class="k">print</span> <span class="s2">"euhr.. hmm yeah.. this doesn't look very good."</span><span class="p">;</span>
<span class="k">function</span> <span class="nf">redirectCategory</span><span class="p">(</span><span class="nv">$categoryID</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$categories</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$categories</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"general/"</span><span class="p">;</span>
<span class="nv">$categories</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"eten/noodles/"</span><span class="p">;</span>
<span class="o">...</span>
<span class="nv">$categories</span><span class="p">[</span><span class="mi">24</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"muziek/"</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">array_key_exists</span><span class="p">(</span><span class="nv">$categoryID</span><span class="p">,</span> <span class="nv">$categories</span><span class="p">))</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Location: /weblog/category/'</span><span class="o">.</span><span class="nv">$categories</span><span class="p">[</span><span class="nv">$categoryID</span><span class="p">]);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Location: /weblog/'</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">function</span> <span class="nf">redirectItem</span><span class="p">(</span><span class="nv">$itemID</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$items</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">26</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2003/09/pingtest/"</span><span class="p">;</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">27</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2003/09/dit-is-cht-gestoord-maar-wel-grappig/"</span><span class="p">;</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">28</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2003/09/nog-meer-noodles/"</span><span class="p">;</span>
<span class="o">...</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">583</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2008/04/antwerp-10-miles/"</span><span class="p">;</span>
<span class="nv">$items</span><span class="p">[</span><span class="mi">585</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"2008/05/een-huis-kopen-t-is-niet-gelijk-naar-den-bakker-gaan/"</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">array_key_exists</span><span class="p">(</span><span class="nv">$itemID</span><span class="p">,</span> <span class="nv">$items</span><span class="p">))</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Location: /weblog/'</span><span class="o">.</span><span class="nv">$items</span><span class="p">[</span><span class="nv">$itemID</span><span class="p">]);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Location: /weblog/'</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Still one thing about the SQL query: it produces dates such as 2009/2/foo-bar, while it should be 2009/<b>0</b>2/foo-bar (although both seem to work in Wordpress). So before pasting the output of the query in the redirector.php script I first did a find/replace (with regular expressions) on the output with <a href="http://jedit.org">jEdit</a>, by searching for <code>"200([0-9])/([0-9])/</code> and replacing it with <code>"200$1/0$2/</code>. For the category mapping (also in the redirector.php-script) i used a similar query.</p>
<p>The next step is some .htaccess-magic. So before the first default Wordpress RewriteCond I added the following rules:</p>
<div class="highlight"><pre><span></span><span class="c"># cool uri's never expire (old nucleus blog url's)</span>
<span class="c"># fancy urls</span>
<span class="nb">RewriteRule</span> blog/[0-9]+/item/([0-9]+).*$ redirector.php?type=item&id=$1 [R,L]
<span class="nb">RewriteRule</span> blog/.*$ <span class="sx">/weblog/</span> [R,L]
<span class="nb">RewriteRule</span> member/.*$ <span class="sx">/weblog/</span> [R,L]
<span class="nb">RewriteRule</span> archive(/[0-9])?/([0-9]{4})-([0-9][0-9]).*$ <span class="sx">/weblog/</span>$2/$3/ [R,L]
<span class="nb">RewriteRule</span> item/([0-9]+).*$ redirector.php?type=item&id=$1 [R,L]
<span class="nb">RewriteRule</span> category/([0-9]+)(/.*)?$ redirector.php?type=category&id=$1 [R,L]
<span class="c"># feeds</span>
<span class="nb">RewriteRule</span> atom\.php <span class="sx">/weblog/feed/atom/</span> [R,L]
<span class="nb">RewriteRule</span> xml-rss.?\.php <span class="sx">/weblog/feed/</span> [R,L]
<span class="nb">RewriteRule</span> xml-rss-comments\.php <span class="sx">/weblog/comments/feed/</span> [R,L]
</pre></div>
<p>These rules try to rewrite as much as possible, sometimes by redirecting to the redirector.php script to find the correct mapping. If a good redirect can not be done or found (in case of a mapping), the visitor is redirected to the home-page.</p>
<p>I guess that describes the steps I took to convert my blog from Nucleus to Wordpress. Now it is plugin-playing and -discovering time :).</p>