<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Focus on your mission, not your tech - Another Cup of Coffee (Posts about Blog)</title><link>https://anothercoffee.net/</link><description></description><atom:link href="https://anothercoffee.net/categories/blog.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Copyright © 2006 - 2026 &lt;a href="https://anothercoffee.net/" title="Another Cup of Coffee Limited"&gt;Another Cup of Coffee Limited&lt;/a&gt; </copyright><lastBuildDate>Wed, 18 Feb 2026 16:39:44 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Fixing Access Forbidden (403) issues after migrating WordPress to a static site</title><link>https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;After migrating a WordPress site to static files, Google Search Console may start sending you notifications about page indexing problems. Often the issue will be marked as ‘&lt;em&gt;Blocked due to access forbidden (403)&lt;/em&gt;‘, a fairly common error that can have different causes, depending on how your website and server is set up.&lt;/p&gt;


&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/no-entry-Lucian-Alexe-Unsplash-l0w1ftNPZ9s.jpg" alt="No entry road stock photo - Access Forbidden 403 error" class="figure-img img-fluid rounded" width="800" height="417"&gt;
&lt;/figure&gt;

&lt;p&gt;This article specifically deals with the case when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You previously had a working WordPress installation;&lt;/li&gt;
&lt;li&gt;You migrate the site to static HTML files on an Apache web server;&lt;/li&gt;
&lt;li&gt;Google Search Console starts complaining about page indexing problems.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If this does not apply to your situation, the proposed solution may not work but you will still find the explanation useful in diagnosing the problem.&lt;/p&gt;
&lt;h2&gt;Table of contents&lt;/h2&gt;
&lt;div class="toc"&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#forbidden-403"&gt;The Forbidden 403 error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#wordpress-requests"&gt;How WordPress serves your browser requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#static-files"&gt;Serving static files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#directory-index"&gt;Web server directory index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#generating-static-site"&gt;Generating static HTML files from a WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#why-forbidden"&gt;Why access is forbidden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/#how-to-fix"&gt;How to fix the Access Forbidden (403) error&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;h2 id="forbidden-403"&gt;The Forbidden 403 error&lt;/h2&gt;
&lt;p&gt;Being in the 4XX category of HTTP response codes, &lt;em&gt;Access Forbidden (403)&lt;/em&gt; is a client-side error that may show in a message similar to the following combinations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Access Forbidden (403)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;403 Forbidden&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;HTTP 403&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;HTTP Error 403 – Forbidden&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Forbidden: You don’t have permission to access [directory path] on this server&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Google Search Console notification email will be about page indexing problems with  ‘&lt;em&gt;Blocked due to access forbidden (403)&lt;/em&gt;‘ as one of the Top Issues.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/anothercoffee-google-search-console-page-indexing-issues.png" alt="Google Search Console Page indexing issues" class="figure-img img-fluid rounded" width="498" height="348"&gt;
    &lt;figcaption&gt;A typical Access Forbidden (403) notification from the Google Search Console&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Nevertheless, it being a client-side error doesn’t necessary isolate the problem to your browser. Many solutions online will advise you to clear your cache or refresh the page. This is easy to do and usually a sensible first step but if you found the issue via a Google Search Console notification after a WordPress migration, these recommendations won’t help.&lt;/p&gt;
&lt;p&gt;The 403 response code essentially means that a web client, such as your browser, does not have permission to access the requested resource. The web server understands the request but can’t allow access due to file permissions settings or a server misconfiguration. When it comes to WordPress, the error will almost certainly be due to a misbehaving plugin, a &lt;a href="https://kinsta.com/blog/403-forbidden-error/" target="_blank" rel="noreferrer noopener nofollow"&gt;corrupt .htaccess file or incorrect file permissions&lt;/a&gt;. However, if you’ve recently converted your WordPress installation to a static site, the error will most likely have a different cause.&lt;/p&gt;
&lt;p&gt;To understand why the &lt;em&gt;Access Forbidden&lt;/em&gt; error happens, it’s worth reviewing the differences between how the WordPress content management system (CMS) serves content and how a static site responds to web client requests.&lt;/p&gt;

&lt;h2 id="wordpress-requests"&gt;How WordPress serves your browser requests&lt;/h2&gt;
&lt;p&gt;WordPress is a database-driven Content management system (CMS). Most of the content is stored in a database and URLs generally do not correspond to any files in the web server’s filesystem. Instead, URLs are external references to the database content. WordPress calls these references &lt;em&gt;permalinks&lt;/em&gt; and its rewriting engine uses internal &lt;a href="https://codex.wordpress.org/Using_Permalinks"&gt;rules&lt;/a&gt;, specified in the &lt;a href="https://codex.wordpress.org/Using_Permalinks#Choosing_your_permalink_structure"&gt;permalink settings&lt;/a&gt;, to build permalinks dynamically. When a client requests a page from the site, WordPress takes care of serving the correct content. Included with the pages will be any XML-based RSS (Really Simple Syndication) feeds. WordPress will send the HTML page or an XML feed, depending on what the client requests.&lt;/p&gt;
&lt;p&gt;For example, if you set the permalink settings to the &lt;em&gt;Post name&lt;/em&gt; structure, WordPress will generate a HTML post when you browse to the following URL:&lt;br&gt;&lt;code&gt;https://example.com/your-post/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The RSS feed for that post will be at:&lt;br&gt;&lt;code&gt;https://example.com/your-post/feed/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;RSS feeds are normally parsed by an RSS client rather than for displaying directly in the browser window so requesting the RSS feed resource will not send HTML. Instead WordPress will generate XML for the feed.&lt;/p&gt;

&lt;h2 id="static-files"&gt;Serving static files&lt;/h2&gt;
&lt;p&gt;By definition, static sites have no way of dynamically generating content based on the browser request. You make a request to the web server at a given URL and if the resource is present with the correct access permissions, the web server will go ahead and serve the file. The URL for a static site will normally look something like:&lt;br&gt;&lt;code&gt;https://example.com/your-post.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you have an RSS feed, it might look something like:&lt;br&gt;&lt;code&gt;https://example.com/feed.xml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Notice that the request includes the path to the file, such as &lt;code&gt;your-post.html&lt;/code&gt; or &lt;code&gt;feed.xml&lt;/code&gt;. The file is not present in a WordPress permalink because, as mentioned previously, it is only a reference to the actual content stored in the database.&lt;/p&gt;

&lt;h2 id="directory-index"&gt;Web server directory index&lt;/h2&gt;
&lt;p&gt;Web servers such as Apache also have a &lt;a href="https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryindex" target="_blank" rel="noreferrer noopener nofollow"&gt;Directory Index directive&lt;/a&gt;. This is a configuration that can set the server to automatically send a file when a client makes a request without a filename in the URL. The file known as the directory index and is normally named &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Web servers such as Apache also have a &lt;a href="https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryindex" target="_blank" rel="noreferrer noopener nofollow"&gt;Directory Index directive&lt;/a&gt;. In the early days of the web, you could browse to a folder in the web server filesystem and get a listing of all the files present. For security, most web hosts now disable this feature for most of their hosting services. The Directory Index directive is a configuration that can set the server to automatically send a file when a client request only includes the folder name in the URL. For most hosting services, the standard directory index files are normally &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Say a client makes a request for the following:&lt;br&gt;&lt;code&gt;https://example.com/docs/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If the directory index is set to &lt;code&gt;index.html&lt;/code&gt;, the server would return:&lt;br&gt;&lt;code&gt;http://example.com/docs/index.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;index.html&lt;/code&gt; renders as a web page in the browser. Directory index resources can also be set to other file types like &lt;code&gt;index.txt&lt;/code&gt; or &lt;code&gt;index.xml&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="generating-static-site"&gt;Generating static HTML files from a WordPress site&lt;/h2&gt;
&lt;p&gt;WordPress plugins such as &lt;a href="https://wordpress.org/plugins/simply-static/" target="_blank" rel="noreferrer noopener nofollow"&gt;Simply Static&lt;/a&gt; will crawl your site to generate static HTML file copies for the pages. Since WordPress includes RSS feeds, static XML copies will also be generated for these feeds. The tables below show typical WordPress permalinks and their equivalents after static HTML copies are generated.&lt;/p&gt;
&lt;figure class="wp-block-table"&gt;
&lt;table class="has-fixed-layout"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="width:30%"&gt;Page type&lt;/th&gt;
&lt;th&gt;WordPress permalink&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page content&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;code&gt;https://example.com/your-post/&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSS feed&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;code&gt;https://example.com/your-post/feed/&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/figure&gt;
&lt;figure class="wp-block-table"&gt;
&lt;table class="has-fixed-layout"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="width:30%"&gt;Page type&lt;/th&gt;
&lt;th&gt;Static file URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page content&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;code&gt;https://example.com/your-post/index.html&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSS feed&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;code&gt;https://example.com/your-post/feed/index.xml&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/figure&gt;
&lt;p&gt;Once again notice that the static site specifies the filename in the path whereas the WordPress permalink, when set to the &lt;em&gt;Post name&lt;/em&gt; structure, does not.&lt;/p&gt;
&lt;h2 id="why-forbidden"&gt;Why access is forbidden&lt;/h2&gt;
&lt;p&gt;We have all the puzzle pieces to understand why you would get the &lt;em&gt;Access Forbidden (403)&lt;/em&gt; error and how you can fix the problem. After you migrate your WordPress site to static files, the old permalink paths to pages will still serve a web page because most hosting providers have &lt;code&gt;index.html&lt;/code&gt; as a directory index resource.&lt;/p&gt;
&lt;p&gt;You can request the URL in the WordPress post name permalink format:&lt;br&gt;&lt;code&gt;https://example.com/your-post/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The static file generator would have created an index.html in this location:&lt;br&gt;&lt;code&gt;https://example.com/your-post/&lt;/code&gt;index.html&lt;/p&gt;
&lt;p&gt;The webserver sees the &lt;code&gt;index.html&lt;/code&gt; in the filesystem and delivers it to the browser which can render the web page content. Human site visitors will be perfectly happy because they receive the web page resources they expect. However, Googlebot, Google’s web page crawler, will spider through your site &lt;em&gt;including the RSS feed locations&lt;/em&gt;. Remember, the RSS feed folders will contain an &lt;code&gt;index.xml&lt;/code&gt;. XML files are not normally a default directory index resource for most web hosts. Since there is no &lt;code&gt;index.html&lt;/code&gt; file in the feed folder, the web server thinks it’s being asked to deliver a file listing. Again remember that file listings are disabled by most web hosts for security. Thus you get the error:&lt;/p&gt;
&lt;p class="has-text-align-center"&gt;&lt;code&gt;Access Forbidden (403)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You are forbidden by the web server to access that folder listing.&lt;/p&gt;

&lt;h2 id="how-to-fix"&gt;How to fix the Access Forbidden (403) error&lt;/h2&gt;
&lt;p&gt;Now that we know exactly why we get this error we attempt a fix. If your host runs Apache, the solution will likely be simple. Edit or create the &lt;code&gt;.htaccess&lt;/code&gt; file in the root of your site and add &lt;code&gt;index.xml&lt;/code&gt; to the list of directory index resources. For example, if it not already there, add the following line somewhere near the top of the file:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DirectoryIndex index.html index.php index.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;index.xml&lt;/code&gt; in the list will tell Apache to serve the XML file when Googlebot requests the RSS feed directory. While you’re doing this, inspect a few o the feed directories to make sure the &lt;code&gt;index.xml&lt;/code&gt; files have the correct permissions (usually &lt;code&gt;775&lt;/code&gt; for most server setups) and the correct ownership. The ownership settings should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;user&lt;/code&gt;&lt;/strong&gt; is the user account with root privileges on your web server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;group&lt;/code&gt;&lt;/strong&gt; is usually &lt;strong&gt;&lt;code&gt;www-data&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;apache&lt;/code&gt;&lt;/strong&gt; but you may need to check this with your hosting provider.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can test your changes by pointing your browser to a few feed directories to see if the server returns XML. Remember to leave out the &lt;code&gt;index.xml&lt;/code&gt; file and specify the directory only. For example:&lt;br&gt;&lt;code&gt;https://example.com/your-post/feed/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If your browser displays the RSS feed XML, you know the problem has been solved and can be reasonably confident that Googlebot won’t encounter the 403 error.&lt;/p&gt;
&lt;p&gt;This may not work if you’re running a VPS server for your site where some more in-depth configuration may be needed, such as editing your Apache configuration files. Also, &lt;code&gt;.htaccess&lt;/code&gt; is not used by other web servers such as NGINX. In these cases, your next port of call should be to contact your hosting provider. Tell them that you would like to add &lt;code&gt;index.xml&lt;/code&gt; to the directory index resources so that the XML file is served when a visitor lands in a directory. Most good hosting companies will be able to guide you on your options or make the change on your behalf. After you’ve applied the fix, be sure to go to your Google Search Console to revalidate the affected page.&lt;/p&gt;

&lt;div class="footnotes"&gt;
    &lt;p&gt;Photo by &lt;a href="https://unsplash.com/@lucian_alexe?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="nofollow"&gt;Lucian Alexe&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/l0w1ftNPZ9s?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="nofollow"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;hr&gt;

&lt;section class="mt-4 pt-4"&gt;
    &lt;h2&gt;You may also like&lt;/h2&gt;

    &lt;div class="row"&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/"&gt;
                        &lt;img src="https://anothercoffee.net/images/drupal-to-wordpress-migration-utilities-featured.jpg" class="card-img-top" alt="Drupal to WordPress Migration Guide"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/" class="listtitle"&gt;Drupal to WordPress Migration Guide&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2025-01-03T15:30:30Z" title="Updated for 2025"&gt;Updated for 2025&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;
                    &lt;p class="card-text flex-grow-1"&gt;In this guide, you'll find insights drawn from almost 15 years of specialising in complex Drupal to WordPress migration projects. I'll walk you through the entire migration process, from the initial evaluation to post-launch considerations.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/"&gt;
                        &lt;img src="https://anothercoffee.net/images/Secure-your-AI-workflow-using-local-tokenisation-in-PaigeSafe-featured.jpg" class="card-img-top" alt="Secure Your AI Workflow Using Local Tokenisation"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/" class="listtitle"&gt;Secure Your AI Workflow Using Local Tokenisation&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-11-12T13:59:03Z" title="12 November 2024"&gt;12 November 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Don't leak confidential client data when using cloud-based LLMs. Secure your AI workflow with local tokenisation using PaigeSafe.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/"&gt;
                        &lt;img src="https://anothercoffee.net/images/posts/Drupal-Docker-Containers-card-300-150.jpg" class="card-img-top" alt="How To Set Up Drupal 7 Docker Containers for Migration Projects"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/" class="listtitle"&gt;How To Set Up Drupal 7 Docker Containers for Migration Projects&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-09-09T13:25:15Z" title="09 September 2024"&gt;09 September 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Learn how Docker is a valuable tool for Drupal 7 end of life migrations. In this post, I'll give a step-by-step guide to setting up a Drupal 7 container for your migration project.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

&lt;/section&gt;</description><category>Apache</category><category>Blog</category><category>Help</category><category>Migration</category><category>SEO</category><category>Sys Admin</category><category>Troubleshooting</category><category>WordPress</category><guid>https://anothercoffee.net/fixing-access-forbidden-403-issues-after-migrating-wordpress-to-a-static-site/</guid><pubDate>Thu, 09 Feb 2023 01:15:57 GMT</pubDate></item><item><title>How to set up a MySQL database server on Ubuntu for Drupal to WordPress migrations</title><link>https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;Content Management System (CMS) migration projects involve moving data between databases with different schemas. Table names, field types and constraints often don’t match up, leading to a number of &lt;a href="https://anothercoffee.net/tag/troubleshooting/"&gt;frustrating errors&lt;/a&gt;. This is especially the case with &lt;a href="https://anothercoffee.net/content-migration-process/"&gt;highly complex Drupal to WordPress migrations&lt;/a&gt; that use custom scripts to extract, transform and load the data. These projects can seem like you’re constantly hitting roadblocks throughout. I’ve found from experience that running the migration in an appropriate development environment can reduce a great deal of effort. In this guide, I will describe how to set up a MySQL database server on Ubuntu for Drupal to WordPress migrations.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/rubaitul-azad-Y9kOsyoWyaU-unsplash.jpg" alt="MySQL database logo" class="figure-img img-fluid rounded" width="800" height="500"&gt;
&lt;/figure&gt;

&lt;h2 id="drupal-to-wordPress-mysql-server-toc"&gt;Table of contents&lt;/h2&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#why-mysql-ubuntu"&gt;Why MySQL and Ubuntu?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#installing-mysql-for-migrations"&gt;Installing MySQL on Ubuntu for CMS migrations&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#setup-lamp-migration-platform"&gt;Set up your Ubuntu LAMP migration platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#install-mysql"&gt;Install MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#setting-sql-mode"&gt;Setting the MySQL server SQL mode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#set-global-sql-mode"&gt;Option 1: Setting the global sql_mode in the database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#set-mysql-config-file"&gt;Option 2: setting the sql_mode in the MySQL configuration file&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#locating-mysql-conf"&gt;Locating the MySQL configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#edit-mysql-config-file"&gt;Editing the MySQL configuration file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#potential-errors"&gt;Potential errors&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#mysqldump-access-denied-when-trying-to-dump-tablespaces"&gt;mysqldump access denied when trying to dump tablespaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#ERROR-1067-42000-Invalid-default-value"&gt;ERROR 1067 (42000) Invalid default value&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#Expression-1-of-SELECT-list-is-not-in-GROUP-BY-clause"&gt;Expression #1 of SELECT list is not in GROUP BY clause&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#Error-Code-2013-Lost-connection-to-MySQL-server"&gt;Error Code: 2013. Lost connection to MySQL server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;h2 id="why-mysql-ubuntu"&gt;Why MySQL and Ubuntu?&lt;/h2&gt;
&lt;p&gt;The first thing to address is &lt;em&gt;why MySQL and Ubuntu?&lt;/em&gt; How about MariaDB? How about Arch Linux, Mac OS or Windows? Yes! Any platform that runs Drupal and WordPress will work for your migration environment so you can use whatever you prefer. Personally, I have a fondness for &lt;a href="https://www.openbsd.org/" target="_blank" rel="noreferrer noopener"&gt;OpenBSD&lt;/a&gt; but it’s not a practical platform for a CMS migration. OpenBSD’s niche user-base means you’ll spend much longer installing necessary tools and troubleshooting errors.&lt;/p&gt;
&lt;p&gt;There are all sorts of tutorials covering MySQL on Ubuntu. This means you’re more likely to quickly find a solution from a web search when you hit a problem. Furthermore, if you need a software utility or program to help you get the job done, it will probably be available through &lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;dpkg&lt;/code&gt;,  &lt;code&gt;snap&lt;/code&gt; or &lt;code&gt;tasksel&lt;/code&gt;. Use whatever you like but for now, MySQL on Ubuntu is my recommended platform for Drupal to WordPress migrations. I expect this will be the case for some time to come. These projects are complex and time-consuming enough without making the &lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#mariadb-mysql-purge"&gt;job more difficult&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="installing-mysql-for-migrations"&gt;Installing MySQL on Ubuntu for CMS migrations&lt;/h2&gt;
&lt;p&gt;There are many detailed tutorials for installing MySQL on Ubuntu. DigitalOcean’s &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04" target="_blank" rel="noreferrer noopener nofollow"&gt;How To Install MySQL on Ubuntu 20.04&lt;/a&gt; is a good one and writing another won’t add much value. My guide will therefore only give a brief overview of the MySQL server installation steps. Instead, I will focus on the configuration areas specifically related avoiding problems on a CMS migration project.&lt;/p&gt;
&lt;p&gt;You may wonder why the migration environment should be much different from a live server. Migration projects require you to do things that aren’t supported by the CMS platform. You’re therefore likely to encounter &lt;a href="https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/#potential-errors"&gt;weird errors&lt;/a&gt; that aren’t normally found when running standard Drupal or WordPress.&lt;/p&gt;

&lt;h3 id="setup-lamp-migration-platform"&gt;Set up your Ubuntu LAMP migration platform&lt;/h3&gt;
&lt;p&gt;The main source of unusual errors is almost certainly because you’re migrating on a setup suited to a live website. Live server configurations are more restrictive than you need for a migration project. You can therefore save yourself a huge headache by rolling your own local migration environment. It might take a little longer to get started but you’ll save time by avoiding lots of unnecessary troubleshooting.&lt;/p&gt;
&lt;p&gt;I must highlight that this will be a &lt;em&gt;local migration environment&lt;/em&gt; and should not be accessible from the public internet. The normal security considerations with running a live content management system don’t apply when you’re working locally. By all means follow basic security measures mentioned the various tutorials for setting up Ubuntu and MySQL. Nevertheless, a highly secure setup is counterproductive for these projects and you can avoid trouble by being a little more permissive.&lt;/p&gt;
&lt;p&gt;Go ahead and &lt;a href="https://ubuntu.com/tutorials/install-ubuntu-desktop" target="_blank" rel="noreferrer noopener"&gt;install Ubuntu Desktop&lt;/a&gt;. Since this will be a development environment, you’ll want the Desktop environment rather than the more lightweight server version. Of course, you’ll still need to install a web and database server. &lt;a href="https://upcloud.com/community/tutorials/installing-lamp-stack-ubuntu/" target="_blank" rel="noreferrer noopener"&gt;Follow these instructions for installing LAMP stack&lt;/a&gt; but skip the step of installing MariaDB. As mentioned above, we’ll be using MySQL.&lt;/p&gt;


&lt;div id="mariadb-mysql-purge" class="alert alert-warning"&gt;
&lt;p class="has-text-align-left"&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; Installing MariaDB over MySQL or vice versa on Ubuntu 20.04 may lead to all sorts of &lt;a href="https://askubuntu.com/questions/1300304/mysql-not-working-after-uninstall-mariadb-in-ubuntu" target="_blank" rel="noreferrer noopener"&gt;problems starting up the database server&lt;/a&gt; with errors like the following:&lt;/p&gt;
&lt;p class="has-text-align-left"&gt;&lt;code&gt;Failed to start mysqld.service: Unit mysqld.service not found&lt;/code&gt;.&lt;/p&gt;
&lt;p class="has-text-align-left"&gt;The last time I did this, none of solutions mentioned online for purging the installation worked. I spent most of a day trying to fix the problem. In the end, I realised it was quicker to start again and rebuild the machine from scratch. This is a big reason why I decided to stick with MySQL as standard for my projects.&lt;/p&gt;
&lt;/div&gt;

&lt;h3 id="install-mysql"&gt;Install MySQL&lt;/h3&gt;
&lt;p&gt;You can read a more detailed tutorial on &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04" target="_blank" rel="noreferrer noopener"&gt;installing MySQL on Ubuntu&lt;/a&gt; but here’s an overview.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update the package index on your server: &lt;code&gt;sudo apt update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install MySQL server: &lt;code&gt;sudo apt install mysql-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Secure MySQL: &lt;code&gt;sudo /usr/bin/mysql_secure_installation&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;mysql_secure_installation&lt;/code&gt; script doesn’t cause problems for migrations so it’s worth running.&lt;/p&gt;
&lt;p&gt;Create an admin user:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE USER ‘user’@'localhost’ IDENTIFIED BY ‘userpassword’;
GRANT ALL PRIVILEGES ON *.* to ‘user’@'localhost’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now create a user and database for your migration project:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE USER ‘projectuser’@'localhost’ IDENTIFIED BY ‘password’;

CREATE DATABASE project_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
GRANT ALL ON project_db.* TO ‘projectuser’@'localhost’;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can give this user more restrictive permissions but &lt;code&gt;GRANT ALL&lt;/code&gt; avoids errors when running scripts and SQL queries on the database. Only the migration team should have access and you won’t need it after the migration so why not make your life easier? &lt;/p&gt;

&lt;h2 id="setting-sql-mode"&gt;Setting the MySQL server SQL mode&lt;/h2&gt;
&lt;p&gt;It’s possible that you won’t be familiar with &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html" target="_blank" rel="noreferrer noopener"&gt;SQL modes&lt;/a&gt; unless you’ve done some database administration work. For our purposes, SQL modes do two things:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;change the types of queries you can run on your MySQL server;&lt;/li&gt;
&lt;li&gt;change the validation checks when altering the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve found that specific SQL modes need to be set for Drupal to WordPress projects. You may find that all sorts of strange errors appear if the correct modes aren’t set. The following sections show you two ways to set your MySQL server’s SQL mode.&lt;/p&gt;

&lt;h3 id="set-global-sql-mode"&gt;Option 1: Setting the global sql_mode in the database&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Login in to database as an admin user.&lt;/li&gt;
&lt;li&gt;View the current sql-modes using &lt;code&gt;SELECT @@GLOBAL.sql_mode;&lt;/code&gt; and make a copy if necessary.&lt;/li&gt;
&lt;li&gt;Copy the current modes (add or delete modes as needed) and paste in next step.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;ALLOW_INVALID_DATES&lt;/code&gt; and removes both &lt;code&gt;NO_ZERO_DATE, NO_ZERO_IN_DATE&lt;/code&gt; by setting the sql-modes with&lt;br&gt;&lt;code&gt;SET GLOBAL sql_mode = ‘STRICT_TRANS_TABLES,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;&lt;/code&gt; (WARNING: check the modes correspond with your setup.)&lt;/li&gt;
&lt;li&gt;Restart server:&lt;br&gt;&lt;code&gt;sudo systemctl start mysql&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="set-mysql-config-file"&gt;Option 2: setting the sql_mode in the MySQL configuration file&lt;/h3&gt;
&lt;h4 id="locating-mysql-conf"&gt;Locating the MySQL configuration file&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;my.cnf&lt;/code&gt; configuration file isn’t always found in the same place. It’s specific to the Linux distribution and server configuration but can normally found in one of the following locations:&lt;/p&gt;
&lt;pre class="wp-block-preformatted"&gt;/etc/my.cnf
/etc/mysql/my.cnf
echo/my.cnf
[datadir]/my.cnf
~/.my.cnf&lt;/pre&gt;

&lt;p&gt;If you can’t find your MySQL configuration file, you can try running &lt;code&gt;locate my.cnf&lt;/code&gt; or &lt;code&gt;mysqladmin –help&lt;/code&gt;. The latter will show something like the following in the output:&lt;/p&gt;

&lt;pre class="wp-block-preformatted"&gt;Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf&lt;/pre&gt;
&lt;p&gt;Also keep in mind that it’s possible to use &lt;code&gt;!include&lt;/code&gt; directives to include other &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/option-files.html" rel="noreferrer noopener" target="_blank"&gt;option files&lt;/a&gt; and &lt;code&gt;!includedir&lt;/code&gt; to search specific directories for option files. Under Ubuntu, there may be a file &lt;code&gt;/etc/mysql/my.cnf&lt;/code&gt; with &lt;code&gt;!includedir&lt;/code&gt; directives to search &lt;code&gt;/etc/mysql/conf.d/&lt;/code&gt; and &lt;code&gt;/etc/mysql/mysql.conf.d/&lt;/code&gt;&lt;/p&gt;


&lt;h4 id="edit-mysql-config-file"&gt;Editing the MySQL configuration file&lt;/h4&gt;
&lt;p&gt;If the MySQL server finds more than one configuration file, it will load each one in turn. The values override each other and it can be difficult to know which takes priority. Furthermore, the &lt;code&gt;–defaults-file&lt;/code&gt; parameter can also override all configurations. Keep things simple and have only one file and place it the directory that makes sense to you.&lt;/p&gt;
&lt;p&gt;Before editing the &lt;code&gt;my.cnf&lt;/code&gt;, first log in to MySQL with an administrator user and run the &lt;code&gt;SELECT @@GLOBAL.sql_mode&lt;/code&gt; query to see the values used in your setup.&lt;/p&gt;

&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://anothercoffee.net/images/drupal-to-wordpress-mysql-select-global-sql_mode.jpg" alt="Setting the MySQL database server sql mode on Ubuntu for Drupal to WordPress migrations" class="wp-image-3705"&gt;&lt;br&gt;
&lt;figcaption class="wp-element-caption"&gt;&lt;em&gt;Running the &lt;code&gt;SELECT @@GLOBAL.sql_mode&lt;/code&gt; query on MySQL Workbench&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Next, open the configuration file, look for the section &lt;code&gt;[mysqld]&lt;/code&gt; and edit the line starting with:&lt;br&gt;&lt;code&gt;sql_mode = …&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the line if it’s not there. Adjust the exact modes to match your project’s needs so take a look at the &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full" target="_blank" rel="noreferrer noopener"&gt;list of SQL modes&lt;/a&gt; to see which may apply. I’ve found the following works well:&lt;br&gt;&lt;code&gt;sql_mode = “STRICT_TRANS_TABLES,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION”&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Finally, restart the MySQL server. On Ubuntu this will probably be with&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo systemctl start mysql&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you are logged in to the MySQL server, you may also need to disconnect your client and reconnect for the changes to take effect for your session.&lt;/p&gt;

&lt;h2 id="potential-errors"&gt;Potential errors&lt;/h2&gt;
&lt;p&gt;Here are some potential errors that you may come across during a CMS migration project. I usually find them when running a Drupal to WordPress migration on a freshly built development environment.&lt;/p&gt;
&lt;h3 id="mysqldump-access-denied-when-trying-to-dump-tablespaces"&gt;mysqldump access denied when trying to dump tablespaces&lt;/h3&gt;
&lt;p&gt;Migrations involve dumping and importing databases and this process is straightforward on a mature development environment. However you may receive an ‘Access denied’ error out of the blue when dumping your MySQL database:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mysqldump: Error: ‘Access denied; you need (at least one of) the PROCESS privilege(s) for this operation’ when trying to dump tablespaces&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you see this, perhaps you were working on an environment that was a little too ‘mature’ (in other words, obsolete!) and you have recently upgraded your installation. The updates for MySQL 5.7.31 and MySQL 8.0.21 in July 2020 introduced an incompatible change that produces this error.&lt;/p&gt;
&lt;p&gt;Read my separate article, &lt;a href="https://anothercoffee.net/how-to-fix-the-mysqldump-access-denied-process-privilege-error/"&gt;How to fix the mysqldump access denied process privilege error&lt;/a&gt;, for more information and instructions on how you can try solving this.&lt;/p&gt;
&lt;h3 id="ERROR-1067-42000-Invalid-default-value"&gt;ERROR 1067 (42000) Invalid default value&lt;/h3&gt;
&lt;p&gt;Drupal nodes store the date as a Unix timestamp in an &lt;code&gt;int&lt;/code&gt; (e.g. &lt;code&gt;1623427200&lt;/code&gt;) field whereas WordPress stores dates as &lt;code&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/datetime.html" target="_blank" rel="noreferrer noopener nofollow"&gt;datetime&lt;/a&gt;&lt;/code&gt; (e.g. &lt;code&gt;2021-06-11 16:00:00&lt;/code&gt;). There may be a conversion error in your migration script or the source date could simply be zero for some reason. Normally your MySQL server mode will be set to &lt;code&gt;NO_ZERO_DATE, NO_ZERO_IN_DATE&lt;/code&gt; so trying to insert a zero date will give you the error:&lt;/p&gt;
&lt;pre class="wp-block-preformatted"&gt;&lt;code&gt;ERROR 1067 (42000) Invalid default value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can fix this by replacing &lt;code&gt;NO_ZERO_DATE, NO_ZERO_IN_DATE&lt;/code&gt;  with set to &lt;code&gt;ALLOW_INVALID_DATES&lt;/code&gt; in your global SQL mode.&lt;/p&gt;

&lt;h3 id="Expression-1-of-SELECT-list-is-not-in-GROUP-BY-clause"&gt;Expression #1 of SELECT list is not in GROUP BY clause&lt;/h3&gt;
&lt;p&gt;You run an SQL query and get the rather cryptic error:&lt;/p&gt;
&lt;pre class="wp-block-preformatted"&gt;Expression #1 of SELECT list is not in GROUP BY clause and contains
nonaggregated column ‘database.table.pid’ which is not functionally dependent
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by&lt;/pre&gt;
&lt;p&gt;What’s wrong? MySQL has a &lt;code&gt;only_full_group_by&lt;/code&gt; mode which, when enabled, strictly applies ANSI SQL rules when using &lt;code&gt;GROUP BY&lt;/code&gt;. Fix this by reworking your script or removing the &lt;code&gt;ONLY_FULL_GROUP_BY&lt;/code&gt; SQL mode.&lt;/p&gt;

&lt;h3 id="Error-Code-2013-Lost-connection-to-MySQL-server"&gt;Error Code: 2013. Lost connection to MySQL server&lt;/h3&gt;
&lt;p&gt;This often happens when it an SQL query takes too long to return data. The connection between your MySQL client and database server times out so the connection gets dropped. For ideas on how to try solving this, read my separate article, &lt;a href="https://anothercoffee.net/fix-error-code-2013-lost-connection-mysql-server-query/"&gt;How to fix Error Code 2013 Lost connection to MySQL server&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Setting up a MySQL database server for Drupal or WordPress is a familiar task for web developers and site administrators.  However, CMS migrations have quirks that can cause obscure and baffling errors. In this guide I’ve shown you some little tricks that may save time and annoyance. While there’s no way to provide an exhaustive list of solutions to all the MySQL problems you’ll encounter, I hope to have pointed you in the right direction.&lt;/p&gt;
&lt;p&gt;If you have a site migration project and would like to hire me, please &lt;a href="https://anothercoffee.net/#contact"&gt;ask for a quote&lt;/a&gt; for my consulting service.&lt;/p&gt;

&lt;div class="alert alert-info text-center" style="margin: 100px 0 100px 0; padding-bottom:20px;"&gt;
&lt;h3 style="font-size: 1.5em;"&gt;&lt;a title="CMS migration" href="https://anothercoffee.net/drupal-to-wordpress-migration-service/"&gt;CMS migration consulting&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;All content · Custom content types · SEO · Plugins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Migrating content from a site and need a specialist? Please &lt;a title="Get an estimate for site migration" href="https://anothercoffee.net/#contact"&gt;contact me&lt;/a&gt; for a quotation.&lt;/em&gt; Whether you’re a media agency who needs a database expert or a site owner looking for advice, I’ll save you time and ensure accurate content exports.&lt;/p&gt;

&lt;button class="cta-button"&gt;&lt;a href="https://anothercoffee.net/#contact"&gt;Get a quote&lt;/a&gt;&lt;/button&gt;

&lt;/div&gt;



&lt;div class="footnotes"&gt;
    &lt;p&gt;Cover photo by &lt;a href="https://unsplash.com/@rubaitulazad?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash"&gt;Rubaitul Azad&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/text-Y9kOsyoWyaU?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" target="_blank" rel="nofollow"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;hr&gt;

&lt;section class="mt-4 pt-4"&gt;
    &lt;h2&gt;You may also like&lt;/h2&gt;

    &lt;div class="row"&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/"&gt;
                        &lt;img src="https://anothercoffee.net/images/drupal-to-wordpress-migration-utilities-featured.jpg" class="card-img-top" alt="Drupal to WordPress Migration Guide"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/" class="listtitle"&gt;Drupal to WordPress Migration Guide&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2025-01-03T15:30:30Z" title="Updated for 2025"&gt;Updated for 2025&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;
                    &lt;p class="card-text flex-grow-1"&gt;In this guide, you'll find insights drawn from almost 15 years of specialising in complex Drupal to WordPress migration projects. I'll walk you through the entire migration process, from the initial evaluation to post-launch considerations.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/"&gt;
                        &lt;img src="https://anothercoffee.net/images/Secure-your-AI-workflow-using-local-tokenisation-in-PaigeSafe-featured.jpg" class="card-img-top" alt="Secure Your AI Workflow Using Local Tokenisation"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/" class="listtitle"&gt;Secure Your AI Workflow Using Local Tokenisation&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-11-12T13:59:03Z" title="12 November 2024"&gt;12 November 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Don't leak confidential client data when using cloud-based LLMs. Secure your AI workflow with local tokenisation using PaigeSafe.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/"&gt;
                        &lt;img src="https://anothercoffee.net/images/posts/Drupal-Docker-Containers-card-300-150.jpg" class="card-img-top" alt="How To Set Up Drupal 7 Docker Containers for Migration Projects"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/" class="listtitle"&gt;How To Set Up Drupal 7 Docker Containers for Migration Projects&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-09-09T13:25:15Z" title="09 September 2024"&gt;09 September 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Learn how Docker is a valuable tool for Drupal 7 end of life migrations. In this post, I'll give a step-by-step guide to setting up a Drupal 7 container for your migration project.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

&lt;/section&gt;</description><category>Blog</category><category>Database</category><category>Drupal</category><category>Help</category><category>Migration</category><category>MySQL</category><category>Sys Admin</category><category>Troubleshooting</category><category>WordPress</category><guid>https://anothercoffee.net/how-to-set-up-a-mysql-database-server-on-ubuntu-for-drupal-to-wordpress-migrations/</guid><pubDate>Fri, 11 Jun 2021 15:44:52 GMT</pubDate></item><item><title>A guide to WordPress Backups and Staging</title><link>https://anothercoffee.net/wordpress-backups-and-staging-guide/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;div style="margin: 2em 0 2em 0; padding: 1em 2em 1em 2em; font-weight: 400; text-align: center; color: #444; background-color: #f5f5f5; border: 3px solid #e9ecef;"&gt;&lt;em&gt;This &lt;strong&gt;WordPress Backups and Staging Guide&lt;/strong&gt; is a guest post by &lt;a href="https://blogvault.net/author/melinda/" rel="author"&gt;Melinda Bartley&lt;/a&gt;.&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;If you’ve run a WordPress site long enough, you’d know how making changes to it can be tricky. Sometimes, even minor changes can cause major glitches. This makes backups and staging such lifesavers!&lt;/p&gt;
&lt;p&gt;Every WordPress site should have backup and staging solutions in place. And not just any solution, one that actually works! I say this because in my experience, relying on host backups and staging environments have too many limitations and a tedious process. So I turned to plugins, but there too, I found so many options, it was hard to pick the right one.&lt;/p&gt;
&lt;p&gt;In my quest to get a permanent solution, I stumbled upon BlogVault. It was easy-to-use and reliable with a great support team behind it. Ever since, it has been my go-to for WordPress backups and staging.&lt;/p&gt;
&lt;p&gt;So today, I’m sharing everything what I think WordPress site owners should know about backups and staging and why BlogVault works best.&lt;/p&gt;
&lt;p&gt;Let’s begin with a few basics.&lt;/p&gt;
&lt;h2&gt;Difference Between Backup and Staging&lt;/h2&gt;
&lt;p&gt;Many ask If I have a backup, why do I need staging? Well, the two solve very different problems. Backups are for reverting to a previous version when a problem arises on the site.&lt;/p&gt;
&lt;p&gt;For example, you run an update on your website and it causes your site to malfunction. You find that plugins are not compatible with the new version of WordPress. It would take considerable time to update these plugins or find replacements. To solve the issue immediately and get your site back to normal, you can restore your backup.&lt;/p&gt;
&lt;p&gt;Backups come in handy when things go wrong such as botched updates, human errors, presence of malware, and so on.&lt;/p&gt;
&lt;p&gt;Coming to staging, it enables you to create a clone of your WordPress website. This is done specifically for development. You can try out new themes, plugins, designs and layouts. You can test out updates and even test restore your backup! None of the changes you make will affect your live site.&lt;/p&gt;
&lt;p&gt;There are staging solutions that have a feature to merge your changes. This is extremely handy because you might make multiple changes and it would take time to replicate the same on your live site. So you can just push the changes to your live site. Simply put, staging enables progress!&lt;/p&gt;
&lt;p&gt;Now that you know why you need both solutions, let’s check out the backup solutions available for WordPress sites.&lt;/p&gt;
&lt;h2&gt;WordPress Backup Solutions&lt;/h2&gt;
&lt;p&gt;There are many options to backup your WordPress site, but not all of them are easy to use or reliable. The main options available to back up your site are – manually, using a plugin, or through your web host.&lt;/p&gt;
&lt;h3&gt;Manual Backups&lt;/h3&gt;
&lt;p&gt;For this, you need to access your web hosting account. Once you’ve logged in, go to&lt;em&gt; cPanel &amp;gt; File Manager &amp;gt; Public_Html&lt;/em&gt;. Here, you’ll see all your WordPress files. Simply compress and download them.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/Hosting-Control-Panel-Manual-Backups.png" class="figure-img img-fluid rounded" alt="Hosting Control Panel Manual Backups" width="653" height="408"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source: &lt;a href="https://wpengine.com/"&gt;WP Engine&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It seems simple enough. But there are issues with this method. For one, the process is time-consuming. Spending time taking manual backups regularly is simply not feasible when you have tons of other things to focus on. Plus, you need to take responsibility to encrypt your data and &lt;a href="https://anothercoffee.net/creating-emergency-resilient-electronic-file-backups/"&gt;store the backup locally&lt;/a&gt;. A backup has all the information on your website and needs to be stored securely. If hackers get their hands on an unencrypted backup, it’s already a data breach, but you can be sure your site will be hacked as well.&lt;/p&gt;
&lt;p&gt;But above all, the biggest hassle with this method is the restoration process. Sometimes, the backup just doesn’t work at all. Other times, you restore your site only to find it malfunctioning or missing functionalities. Which means more time wasted on troubleshooting and debugging troubles. This is why I prefer using a plugin. But among these too, there are so many options available, how do you choose one?&lt;/p&gt;
&lt;p&gt;Well, after trying out a couple of them, I stuck with BlogVault. It’s great for backups and even offers inbuilt staging at no additional cost.&lt;/p&gt;
&lt;h3&gt;Backups with a WordPress Plugin – &lt;a href="https://blogvault.net/"&gt;BlogVault&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To start off, setting up BlogVault was easy to use – with a simple install and activate process. Once you sign up, the backup automatically runs. It gives you the following options which I think is not only cool but essential for WordPress:&lt;/p&gt;
&lt;ul&gt;
&lt;li style="list-style-type: none;"&gt;
&lt;ul&gt;
&lt;li&gt;The option to schedule your backups. Plus, you can take a backup on demand whenever you want, any number of times. This is good to have when you want to make major changes to your site or roll out big updates. Taking a backup before any major change is absolutely necessary.&lt;/li&gt;
&lt;li&gt;It’s all automated so you don’t have to worry about the technicalities.&lt;/li&gt;
&lt;li&gt;The restore process is just a few clicks. It takes a few minutes and it’s guaranteed to work. So you needn’t worry about your site breaking or losing data.&lt;/li&gt;
&lt;li&gt;The process is handled offsite on their own servers so it doesn’t affect the performance or speed of your site. Plus, it doesn’t take a full backup every single time. It smartly copies one full backup and then subsequently, only the changes made each time are backed up.&lt;/li&gt;
&lt;li&gt;Lastly, your backup is encrypted and multiple copies of it are stored securely. That takes away the pain of storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/BlogVault-WordPress-Backup-Plugin.png" class="figure-img img-fluid rounded" alt="Creating a backup using the BlogVault WordPress Backup Plugin" width="818" height="378"&gt;
&lt;/figure&gt;

&lt;p&gt;Apart from this, there are handy features like 365-day archives, real-time backups, website management, &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/"&gt;site migrations&lt;/a&gt;, multiple site management, uptime monitoring, and staging.&lt;/p&gt;
&lt;p&gt;Next, you can also back up your website using your web host itself. I’ve checked out two of the most popular ones.&lt;/p&gt;
&lt;h3&gt;Backups with your Host – &lt;a href="https://wpengine.com/"&gt;WP Engine&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WP Engine takes backups for all environments by default. This includes production staging, development, and legacy staging. It’s automated, encrypted, and stored offsite on Amazon S3. You can also take manual backups. It keeps up to 40 backup points. Older data up to 60 points may be accessible but you need to contact their support team for that.&lt;/p&gt;
&lt;p&gt;To access a backup, log into your user portal. Go to &lt;em&gt;sites &amp;gt; environment name &amp;gt; backup points&lt;/em&gt;. You’ll find your backups here. You can also create a backup on demand.&lt;/p&gt;
&lt;p&gt;To restore, simply click on the backup point you want and click the Restore button.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/WP-Engine-Backups.png" class="figure-img img-fluid rounded" alt="Creating backups in WP Engine" width="768"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source: &lt;a href="https://wpengine.com/"&gt;WP Engine&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;p&gt;The process seems simple enough. But WP Engine also has some drawbacks. The restore process can take several minutes to several hours. And it’s important to note that they do not copy all files of your site. The following files aren’t included:&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/WP-Engine-Backups-Excluded-Files.png" class="figure-img img-fluid rounded" alt="Files excluded with WP Engine backups" width="505" height="384"&gt;
&lt;/figure&gt;

&lt;p&gt;Additionally, it’s a destructive backup which means, during the restoration process, all content is overwritten. So, if you have files on your website that are not present in your backup, they will be wiped out. Your site will be restored to the contents of the backup alone.&lt;/p&gt;

&lt;h3&gt;Backups with your Host – &lt;a href="https://kinsta.com/"&gt;Kinsta&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kinsta provides daily automatic backups for your WordPress site. It also has system-generated backups for all the sites listed in your account. The backup is a snapshot of your website’s files, database, redirects, and Nginx configuration. When you restore your backup up, all of these elements will be rolled back to when the backup was taken.&lt;/p&gt;
&lt;p&gt;You can also create manual backups if you want one immediately and don’t want to wait for the scheduled one to run. You need to visit the ‘Backups’ tab, click on the ‘Manual’ tab. Here, you’ll find the ‘Backup Now’ button for on-demand backups.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/Kinsta-Backups-1024x603.png" class="figure-img img-fluid rounded" alt="Creating backups on Kinsta" width="640" height="377"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source: &lt;a href="https://kinsta.com/"&gt;Kinsta&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The duration for which your backups are stored depends on your hosting plan. It can vary between 14 days and 30 days. Kinsta also allows you to increase the frequency of your backups to hourly and 6-hour backups at a premium.&lt;/p&gt;
&lt;p&gt;When it comes to restoring your site, you can simply click on the ‘Restore’ button next to the backup of your choice. While the restore takes place, you cannot access your site. The process can take a few minutes to a few hours.&lt;/p&gt;
&lt;p&gt;What I liked about Kinsta is that it takes a backup of your site before restoration. So you can undo the restore and get back your site to as it was.&lt;/p&gt;
&lt;p&gt;That brings up to the end of backups. With a backup solution in place, we can move on to staging. Here, I’ll touch upon – the manual method, show you how you can do this with the BlogVault plugin, and also talk about staging with your hosting provider.&lt;/p&gt;

&lt;h2&gt;WordPress Staging Solutions&lt;/h2&gt;
&lt;p&gt;Staging a site can be done manually through your hosting account. But it’s riddled with problems. The process to create one is quite technical, and for a regular WordPress user, it’s not a feasible option.&lt;/p&gt;
&lt;p&gt;Next, if you want to merge the changes you made, you need to download the updated files from your staging site and upload them to you live site. This is risky business as you could wipe out data and even crash your site.&lt;/p&gt;
&lt;p&gt;Fortunately, there are other options! You can create a staging site with your host or by using a plugin. Coming back to BlogVault, it also offers a staging feature that makes the job much easier.&lt;/p&gt;
&lt;h3&gt;Staging with BlogVault&lt;/h3&gt;
&lt;p&gt;If you’ve already installed BlogVault, staging is a free feature compatible with any web host. On the BlogVault dashboard, you’ll see an option to ‘Add staging site’. It takes a few minutes, and you’ll be notified when it’s done.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/BlogVault-WordPress-Staging-Plugin.png" class="figure-img img-fluid rounded" alt="Creating a WordPress  staging site with the BlogVault Plugin
        width=" 640" height="377"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source – &lt;a href="https://blogvault.net/wordpress-staging/"&gt;BlogVault&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The plugin handles migrating your site to a dev environment, so you don’t have to bother about the file transfer and the database export and import. The staging site is password protected and blocked off from search engines so &lt;a href="https://anothercoffee.net/drupal-wordpress-migration-seo/"&gt;migration does not affect your SEO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With everything taken care of, you simply need to start using your staging site. Once you’re happy with the changes you’ve made, you can simply merge the changes to your live site. There’s no need to upload files or replicate changes.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/BlogVault-WordPress-merging-tool.png" class="figure-img img-fluid rounded" alt="BlogVault WordPress merge tool" width="671" height="344"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source – &lt;a href="https://blogvault.net/wordpress-staging/"&gt;BlogVault&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can also do a selective merge. BlogVault gives you a comparison of your live site and your staging site. You can then select which changes you want to merge to your live site. In the example below, I made changes to my plugins, themes, uploads, and a few other files. But I wanted only the changes made to plugins. By clicking on the ‘+’ sign, I could see the list of plugins I added or modified. I selected the ones I wanted and merged in just two clicks.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/BlogVault-WordPress-file-comparison-tool.png" class="figure-img img-fluid rounded" alt="BlogVault WordPress file comparison tool" width="926" height="396"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source – &lt;a href="https://blogvault.net/wordpress-staging/"&gt;BlogVault&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The best part is that you can create as many staging sites as you want. So that’s BlogVault. It’s straightforward and easy to use. It won’t break your site when you merge the changes so your site is in safe hands.&lt;/p&gt;
&lt;p&gt;Next, let’s take a look at staging options with web hosting providers.&lt;/p&gt;
&lt;h3&gt;Staging with WP Engine&lt;/h3&gt;
&lt;p&gt;WP Engine gives you options to create three kinds of environments – production, staging, and development.&lt;/p&gt;
&lt;p&gt;To carry out the staging process, you first need to add your site to the user portal. Next, log into the user portal and access Sites &amp;gt; Name of your site &amp;gt; Add staging. Your staging site will be created using the backup point of the existing environment.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/WP-Engine-WordPress-staging.png" class="figure-img img-fluid rounded" alt="WP Engine WordPress staging" width="1024" height="492"&gt;
    &lt;figcaption class="figure-caption text-center"&gt;(Image source – &lt;a href="https://blogvault.net/wordpress-staging/"&gt;BlogVault&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In case you don’t see the staging option, you need to &lt;a href="https://wpengine.com/support/convert-single-environment-sites/"&gt;convert a single environment site&lt;/a&gt; into a multi-environment site.&lt;/p&gt;
&lt;p&gt;Once you’ve made the changes you want, you can copy the changes from staging to your production environment.&lt;/p&gt;
&lt;p&gt;WP Engine also allows you to copy changes from a staging environment of one site to another website. This means you can roll out updates or changes to all your sites without repeating the staging process for each site. However, this can get a bit complicated and isn’t recommended for those new to WordPress.&lt;/p&gt;

&lt;h3&gt;Staging with Kinsta&lt;/h3&gt;
&lt;p&gt;Creating a staging site with Kinsta is quite easy. Access your Kinsta dashboard and select your site. Here, on the top right, you have the option to create a staging environment for your website. It takes around 10-15 minutes to create a staging site.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/Kinsta-WordPress-staging-1024x553.png" class="figure-img img-fluid rounded" alt="Kinsta WordPress staging" width="640" height="346"&gt;
&lt;/figure&gt;

&lt;p&gt;Once you refresh the page, you will see your staging details. You can make the changes you like to your staging site and then push them to your production environment. To do this, under the ‘Staging Environment’ tab, there’s a ‘Push Staging to Live’ button. Simply click on it and all the changes will be made visible on your live site.&lt;/p&gt;
&lt;p&gt;There’s no selective merge option here. So if you’re pushing changes to live, be aware that all changes will be merged.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;That’s a wrap on backups and staging for your WordPress site. To summarize, hosts may offer free versions of backup and staging, but you’re limited in terms of features and functionality. As your site grows bigger, you would need to upgrade to premium plans which are quite expensive. However, when you opt for a plugin like BlogVault, it’s reasonably priced, gives you access to premium features, and above all, it works seamlessly.&lt;/p&gt;
&lt;p&gt;Whichever be your choice, make sure you can rely on your backup to work and be restored easily. Finally, always carry out changes in a staging environment before updating your live site. This will keep you out of trouble and ensure your site is always up and running.&lt;/p&gt;</description><category>Backups</category><category>Blog</category><category>BlogVault</category><category>Development</category><category>Help</category><category>hosting</category><category>Kinsta</category><category>staging</category><category>WordPress</category><category>WP Engine</category><guid>https://anothercoffee.net/wordpress-backups-and-staging-guide/</guid><pubDate>Tue, 11 Feb 2020 12:59:11 GMT</pubDate></item><item><title>How to fix Error Code 2013 Lost connection to MySQL server</title><link>https://anothercoffee.net/fix-error-code-2013-lost-connection-mysql-server-query/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;If you spend time running lots of MySQL queries, you might come across the &lt;code&gt;Error Code: 2013. Lost connection to MySQL server during query&lt;/code&gt;. This article offers some suggestions on how to avoid or fix the problem.&lt;/p&gt;
&lt;h2&gt;Why this happens&lt;/h2&gt;
&lt;p&gt;This error appears when the connection between your MySQL client and database server times out. Essentially, it took too long for the query to return data so the connection gets dropped.&lt;/p&gt;
&lt;p&gt;Most of my work involves &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/"&gt;content migrations&lt;/a&gt;. These projects usually involve running complex MySQL queries that take a long time to complete. I’ve found the WordPress &lt;em&gt;wp_postmeta&lt;/em&gt; table especially troublesome because a site with tens of thousands of posts can easily have several hundred thousand postmeta entries. Joins of large datasets from these types of tables can be especially intensive.&lt;/p&gt;
&lt;h2&gt;Avoid the problem by refining your queries&lt;/h2&gt;
&lt;p&gt;In many cases, you can avoid the problem entirely by refining your SQL queries. For example, instead of joining all the contents of two very large tables, try filtering out the records you don’t need. Where possible, try reducing the number of joins in a single query. This should have the added benefit of making your query easier to read. For my purposes, I’ve found that denormalizing content into working tables can improve the read performance. This avoids time-outs.&lt;/p&gt;
&lt;p&gt;Re-writing the queries isn’t always option so you can try the following server-side and client-side workarounds.&lt;/p&gt;
&lt;h2&gt;Server-side solution&lt;/h2&gt;
&lt;p&gt;If you’re an administrator for your MySQL server, try changing some values. The MySQL &lt;a href="https://dev.mysql.com/doc/refman/5.7/en/error-lost-connection.html"&gt;documentation suggests&lt;/a&gt; increasing the &lt;code&gt;net_read_timeout&lt;/code&gt; or &lt;code&gt;connect_timeout&lt;/code&gt; values on the server.&lt;/p&gt;
&lt;h2&gt;Client-side solution&lt;/h2&gt;
&lt;p&gt;You can increase your MySQL client’s timeout values if you don’t have administrator access to the MySQL server.&lt;/p&gt;
&lt;h3&gt;MySQL Workbench&lt;/h3&gt;
&lt;p&gt;You can edit the SQL Editor preferences in MySQL Workbench:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the application menu, select &lt;em&gt;Edit &amp;gt; Preferences &amp;gt; SQL Editor&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Look for the &lt;em&gt;MySQL Session&lt;/em&gt; section and increase the &lt;em&gt;DBMS connection read time out value&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Save the settings, quite MySQL Workbench and reopen the connection.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="centred-image-container"&gt;
    &lt;img class="centred-image" width="635" height="141" src="https://anothercoffee.net/images/mysql-workbench-session.png" alt="MySQL Workbench session settings"&gt;
&lt;/div&gt;

&lt;h3&gt;Navicat&lt;/h3&gt;
&lt;p&gt;How to edit Navicat preferences:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Control-click on a connection item and select &lt;em&gt;Connection Properties &amp;gt; Edit Connection&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Advanced&lt;/em&gt; tab and increase the &lt;em&gt;Socket Timeout&lt;/em&gt; value.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Command line&lt;/h3&gt;
&lt;p&gt;On the command line, use the &lt;code&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html#option_mysql_connect_timeout"&gt;connect_timeout&lt;/a&gt;&lt;/code&gt; variable.&lt;/p&gt;
&lt;h3&gt;Python script&lt;/h3&gt;
&lt;p&gt;If you’re running a query from a Python script, use the connection argument:&lt;br&gt;
&lt;code&gt;con.query(‘SET GLOBAL connect_timeout=6000′)&lt;/code&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;section class="mt-4 pt-4"&gt;
    &lt;h2&gt;You may also like&lt;/h2&gt;

    &lt;div class="row"&gt;
        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/"&gt;
                        &lt;img src="https://anothercoffee.net/images/Secure-your-AI-workflow-using-local-tokenisation-in-PaigeSafe-featured.jpg" class="card-img-top" alt="Secure Your AI Workflow Using Local Tokenisation"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/" class="listtitle"&gt;Secure Your AI Workflow Using Local Tokenisation&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-11-12T13:59:03Z" title="12 November 2024"&gt;12 November 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Don't leak confidential client data when using cloud-based LLMs. Secure your AI workflow with local tokenisation using PaigeSafe.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/still-alive-a-micro-agencys-20-year-journey/"&gt;
                        &lt;img src="https://anothercoffee.net/images/a-west-london-micro-agencys-journey-to-ai-featured.jpg" class="card-img-top" alt="Still Alive: A Micro Agency's 20 Year Journey"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/still-alive-a-micro-agencys-20-year-journey/" class="listtitle"&gt;Still Alive: A Micro Agency's 20 Year Journey&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-10-15T15:28:15Z" title="15 October 2024"&gt;15 October 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;This article will be the first in a series where I'll share how Artificial Intelligence has reshaped how we operate at Another Cup of Coffee.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/"&gt;
                        &lt;img src="https://anothercoffee.net/images/posts/Drupal-Docker-Containers-card-300-150.jpg" class="card-img-top" alt="How To Set Up Drupal 7 Docker Containers for Migration Projects"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/" class="listtitle"&gt;How To Set Up Drupal 7 Docker Containers for Migration Projects&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-09-09T13:25:15Z" title="09 September 2024"&gt;09 September 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Learn how Docker is a valuable tool for Drupal 7 end of life migrations. In this post, I'll give a step-by-step guide to setting up a Drupal 7 container for your migration project.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

&lt;/section&gt;</description><category>Blog</category><category>Drupal</category><category>Help</category><category>Migration</category><category>Troubleshooting</category><category>WordPress</category><guid>https://anothercoffee.net/fix-error-code-2013-lost-connection-mysql-server-query/</guid><pubDate>Sat, 15 Jul 2017 19:08:23 GMT</pubDate></item><item><title>How to change the WordPress table prefix prior to a migration</title><link>https://anothercoffee.net/change-wordpress-table-prefix-prior-migration/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;When working on a &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/"&gt;Drupal to WordPress migration&lt;/a&gt; project, I like to migrate into a set of intermediary WordPress tables that live in the Drupal database. These are working tables where I can run various scripts to process and clean up the content before exporting to a working WordPress installation. It’s not &lt;em&gt;necessary&lt;/em&gt; to do this but I find it convenient to run scripts on the same database rather than deal with two separate database connections.&lt;/p&gt;


&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img src="https://anothercoffee.net/images/gavin-allanwood-q92hWEdK8p8-unsplash.jpg" alt="Overhead image of cafe tables" class="figure-img img-fluid rounded" width="800" height="533"&gt;
&lt;/figure&gt;

&lt;p&gt;Note that some people suggest renaming the table prefixes to improve security. My use of the table prefixes is simply to create temporary containers for the migration. While non-standard prefixes might help prevent ‘script kiddie’ attacks, I find it isn’t worth the disadvantages that come with this sort of &lt;a href="https://en.wikipedia.org/wiki/Security_through_obscurity"&gt;security through obscurity&lt;/a&gt; (or more precisely, &lt;a href="https://en.wikipedia.org/wiki/Security_through_obscurity#Security_through_minority"&gt;security through minority&lt;/a&gt;) approach. Here are two articles give a deeper explanation of topic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wordfence.com: &lt;a href="https://www.wordfence.com/blog/2016/12/wordpress-table-prefix/"&gt;WordPress Table Prefix: Changing It Does Nothing to Improve Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wpkrauts.com: &lt;a href="https://web.archive.org/web/20150129082218/http://wpkrauts.com/2015/the-database-prefix-is-not-a-security-feature/"&gt;The database table prefix is not a security feature&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SQL queries to change the WordPress table prefixes&lt;/h2&gt;
&lt;p&gt;You can start with a freshly installed WordPress database. Dumping this and importing to your Drupal migration database will give you all the tables with the correct WordPress schema. I use the &lt;em&gt;acc_&lt;/em&gt; prefix but you can use whatever you want.&lt;/p&gt;
&lt;p&gt;Rename the tables with these queries:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RENAME table `wp_commentmeta` TO `acc_commentmeta`;
RENAME table `wp_comments` TO `acc_comments`;
RENAME table `wp_links` TO `acc_links`;
RENAME table `wp_options` TO `acc_options`;
RENAME table `wp_postmeta` TO `acc_postmeta`;
RENAME table `wp_posts` TO `acc_posts`;
RENAME table `wp_terms` TO `acc_terms`;
RENAME table `wp_termmeta` TO `acc_termmeta`;
RENAME table `wp_term_relationships` TO `acc_term_relationships`;
RENAME table `wp_term_taxonomy` TO `acc_term_taxonomy`;
RENAME table `wp_usermeta` TO `acc_usermeta`;
RENAME table `wp_users` TO `acc_users`;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Testing the migration results&lt;/h2&gt;
&lt;p&gt;If you need to point a WordPress installation to these tables for testing, you’ll need to do two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update the &lt;em&gt;$table_prefix&lt;/em&gt; setting in the &lt;em&gt;wp-options.php&lt;/em&gt; file&lt;/li&gt;
&lt;li&gt;Update the &lt;em&gt;options&lt;/em&gt; and &lt;em&gt;usermeta&lt;/em&gt; tables&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating the &lt;em&gt;$table_prefix&lt;/em&gt; setting in the &lt;em&gt;wp-options.php&lt;/em&gt; file is straightforward. Open the file and edit the line:&lt;/p&gt;
&lt;pre&gt;$table_prefix  = ‘acc_’;&lt;/pre&gt;
&lt;p&gt;In WordPress, prefixes are saved as entries in the &lt;em&gt;options&lt;/em&gt; and &lt;em&gt;usermeta&lt;/em&gt; table. Check for entries containing the prefix:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM `acc_options` WHERE `option_name` LIKE ‘%wp_%’;
SELECT * FROM `acc_usermeta` WHERE `meta_key` LIKE ‘%wp_%’;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you have all the entries, update them with the new prefix. The query will probably look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE `acc_options` SET `option_name` = ‘acc_user_roles’ WHERE `option_name` = ‘wp_user_roles’;
UPDATE `acc_usermeta` SET `meta_key` = ‘acc_capabilities’ WHERE `meta_key` = ‘wp_capabilities’;
UPDATE `acc_usermeta` SET `meta_key` = ‘acc_user_level’ WHERE `meta_key` = ‘wp_user_level’;
UPDATE `acc_usermeta` SET `meta_key` = ‘acc_user-settings-time’ WHERE `meta_key` = ‘wp_user-settings-time’;
UPDATE `acc_usermeta` SET `meta_key` = ‘acc_user-settings’ WHERE `meta_key` = ‘wp_user-settings’;
UPDATE `acc_usermeta` SET `meta_key` = ‘acc_dashboard_quick_press_last_post_id’ WHERE `meta_key` = ‘wp_dashboard_quick_press_last_post_id’;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;A word of warning:&lt;/strong&gt; it’s easy to forget to change the prefixes back to match the final WordPress installation. If you do, the WordPress user accounts will have problems, such as the &lt;a href="http://192.168.1.30:8100/drupal-to-wordpress-migration-notes/"&gt;Dashboard controls not being visible&lt;/a&gt; after logging in. Because of this, I tend to have a separate testing installation that gets an import of the working tables.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;p&gt;Cover photo by &lt;a href="https://unsplash.com/@gavla?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" target="_blank" rel="nofollow"&gt;Gavin Allanwood&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/aerial-photo-of-grey-tables-q92hWEdK8p8?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" target="_blank" rel="nofollow"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;


&lt;hr&gt;

&lt;section class="mt-4 pt-4"&gt;
    &lt;h2&gt;You may also like&lt;/h2&gt;

    &lt;div class="row"&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/"&gt;
                        &lt;img src="https://anothercoffee.net/images/drupal-to-wordpress-migration-utilities-featured.jpg" class="card-img-top" alt="Drupal to WordPress Migration Guide"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/" class="listtitle"&gt;Drupal to WordPress Migration Guide&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2025-01-03T15:30:30Z" title="Updated for 2025"&gt;Updated for 2025&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;
                    &lt;p class="card-text flex-grow-1"&gt;In this guide, you'll find insights drawn from almost 15 years of specialising in complex Drupal to WordPress migration projects. I'll walk you through the entire migration process, from the initial evaluation to post-launch considerations.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/"&gt;
                        &lt;img src="https://anothercoffee.net/images/Secure-your-AI-workflow-using-local-tokenisation-in-PaigeSafe-featured.jpg" class="card-img-top" alt="Secure Your AI Workflow Using Local Tokenisation"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/secure-your-ai-workflow-using-local-tokenisation/" class="listtitle"&gt;Secure Your AI Workflow Using Local Tokenisation&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-11-12T13:59:03Z" title="12 November 2024"&gt;12 November 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Don't leak confidential client data when using cloud-based LLMs. Secure your AI workflow with local tokenisation using PaigeSafe.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="col-md-6 col-lg-4 mb-4"&gt;
            &lt;div class="card h-100"&gt;
                &lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/"&gt;
                        &lt;img src="https://anothercoffee.net/images/posts/Drupal-Docker-Containers-card-300-150.jpg" class="card-img-top" alt="How To Set Up Drupal 7 Docker Containers for Migration Projects"&gt;&lt;/a&gt;
                &lt;div class="card-body d-flex flex-column"&gt;
                    &lt;h5 class="card-title"&gt;&lt;a href="https://anothercoffee.net/drupal-7-docker-containers-migration-projects/" class="listtitle"&gt;How To Set Up Drupal 7 Docker Containers for Migration Projects&lt;/a&gt;&lt;/h5&gt;
                    &lt;div class="mb-2"&gt;
                        &lt;span&gt;&lt;time class="listdate" datetime="2024-09-09T13:25:15Z" title="09 September 2024"&gt;09 September 2024&lt;/time&gt;&lt;/span&gt;
                    &lt;/div&gt;

                        &lt;p class="card-text flex-grow-1"&gt;Learn how Docker is a valuable tool for Drupal 7 end of life migrations. In this post, I'll give a step-by-step guide to setting up a Drupal 7 container for your migration project.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

&lt;/section&gt;</description><category>Blog</category><category>Drupal</category><category>Help</category><category>Migration</category><category>WordPress</category><guid>https://anothercoffee.net/change-wordpress-table-prefix-prior-migration/</guid><pubDate>Thu, 16 Mar 2017 13:12:02 GMT</pubDate></item><item><title>Migrating Delicious Bookmarks to WordPress</title><link>https://anothercoffee.net/migrating-delicious-bookmarks-wordpress/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;Delicious is one of those services that few people know about but loved (and probably hated in equal measure) by those who use it. &lt;a href="https://del.icio.us/about"&gt;Their offering&lt;/a&gt; is easy to grasp: Delicious is a social bookmarking service that lets you &lt;em&gt;"Save, organize, and remember the links you find interesting or useful around the web."&lt;/em&gt; I'm sure you've been in a situation where you've tried to remember the source for a particular factoid or needed to cite an article but lost track of the link. The obvious place to save links is in the browser bookmarks but this quickly becomes unwieldy if, for example, you're doing research on lots of different topics. Unless you install bookmark syncing software, browser-based bookmarks are also cumbersome if you run different browsers and computers. I used Delicious to store thousands of links over the years, all of which where tagged and easy to call up when needed. They say in their about page, &lt;em&gt;"Delicious remembers so you don't have to. It's easy to build up a collection of links, essentially creating your own personal search engine."&lt;/em&gt; It was great at that and absolutely invaluable if, like me, you have a poor memory. Programmers, bloggers, researchers, anyone who needs to save a link for future recall needs something like Delicious. Founded in 2003, it's also a veteran in an industry where anything that lasts more than a couple of years is considered successful.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://anothercoffee.net/images/bookmarks-wordpress-migration-article-image.png" alt="Old book with bookmark for Bookmark to WordPress migration" width="800" height="425" class="aligncenter size-full wp-image-1806"&gt;&lt;/p&gt;

&lt;p&gt;Sadly, this glowing opening isn't to recommend the service. You'd think its longevity would be a sign of a rock-solid, mature platform but no: Delicious' loyal user-base has been rewarded with &lt;a href="https://gigaom.com/2011/09/28/oh-delicious-where-did-it-all-go-so-wrong/" title="Oh, Delicious — where did it all go so wrong?"&gt;outages, lost data and broken features&lt;/a&gt;. That people persisted despite years of problems shows just how useful a service it provides. When the site &lt;a href="https://www.lireo.com/delicious-social-bookmarking-service-back-again/" title="Delicious, the Social Bookmarking Service is Back, Again"&gt;went down again earlier this year&lt;/a&gt; (2016), I decided it was time to make a move. Unfortunately I couldn't find an alternative trustworthy enough for several years-worth of carefully curated bookmarks. Free web services are notorious for &lt;a href="https://www.wired.com/2009/01/magnolia-suffer/" title="Ma.gnolia Suffers Major Data Loss, Site Taken Offline"&gt;disappearing into a black hole&lt;/a&gt; with all your data. As the saying goes, you get what you pay for.&lt;/p&gt;

&lt;p&gt;After a long search, I began to realise there wasn't anyone out there who could be trusted. This isn't just Delicious and bookmark curation problem though. These past few years has shown that The Cloud hasn't lived up to its promise. Data breaches, surveillance, data collection, outages, and catastrophic meltdowns; we can't &lt;em&gt;really&lt;/em&gt; trust a third-party service, especially if they don't have a clear business model. I grudgingly conceded that cobbling together my own solution was the only option.&lt;/p&gt;

&lt;p&gt;The rest of this post describes my solution, why I chose WordPress and how you can convert your WordPress site to host a personal bookmarking service. This will be valuable even for those who've never used Delicious but would like a way to curate links.&lt;/p&gt;

&lt;h2&gt;Exporting the bookmarks&lt;/h2&gt;

&lt;p&gt;Before doing anything else, the bookmarks need to be in form that's easy to manipulate. Delicious had a feature to export all your links, tags and notes into a HTML file &lt;a href="https://msdn.microsoft.com/en-us/library/aa753582(v=vs.85).aspx"&gt;Netscape bookmark format&lt;/a&gt;. At the time of writing this has been 'temporarily disabled due to server load' (really, Delicious?). Fortunately I was in the habit of making frequent backups due to Delicious' unreliability so my export file was only a few weeks old. I threw together a quick Python script called DeliciousPy to scrape the file and save the results into a local MySQL database. Feel free to grab the source over on &lt;a href="https://gitlab.com/anthonylv/DeliciousPy"&gt;GitLab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It was a one-use tool so a little rough and undocumented. (Sorry, it wasn't written with the intention of public release!) Anyone with basic Python knowledge should be able to easily figure out how it works. Essentially, I parse the Delicious export file using &lt;a href="http://www.tibonihoo.net/blog/en/"&gt;Thibauld Nion's&lt;/a&gt; Netscape bookmark parser that is part of his &lt;a href="https://github.com/tibonihoo/wateronmars"&gt;Water On Mars!&lt;/a&gt; project. Everything is then inserted into three MySQL database tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bookmarks:&lt;/strong&gt; the table storing bookmark title, url, note, creation time and privacy flag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tags:&lt;/strong&gt; all the tags associated with the Delicious bookmarks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tag_relationships:&lt;/strong&gt; the relationships between the bookmarks and tags.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After doing a &lt;code&gt;pip install&lt;/code&gt; to install the requirements, you run DeliciousPy with the command:
&lt;code&gt;$ ./deliciouspy.py -p /path/to/delicious/export_file.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Running the script exports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bookmark title&lt;/li&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Tags&lt;/li&gt;
&lt;li&gt;Note&lt;/li&gt;
&lt;li&gt;Created date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting the Delicious bookmarks into a database opens up options for importing the data into a different platform. You can roll your own custom tool or use a content management system. I chose WordPress.&lt;/p&gt;

&lt;h2&gt;WordPress as a personal social bookmarking service&lt;/h2&gt;

&lt;p&gt;My wish list for a Delicious replacement was short:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Save links with accompanying notes.&lt;/li&gt;
&lt;li&gt;Tagging and search to easily call up previously saved links.&lt;/li&gt;
&lt;li&gt;Simple, bare-bones functionality free of unnecessary features.&lt;/li&gt;
&lt;li&gt;Set links to private for personal research or public for sharing.&lt;/li&gt;
&lt;li&gt;Avoid relying on a third-party service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It didn't take me long to settle on WordPress. I already have expertise with importing data into WordPress from my &lt;a href="http://migratecontent.com/" title="MigrateContent: Drupal to WordPress migration service"&gt;Drupal to WordPress migration service&lt;/a&gt;. It's grown into a mature content management platform with a huge user and developer base, apparently powering &lt;a href="https://w3techs.com/blog/entry/wordpress-powers-25-percent-of-all-websites"&gt;25% of all websites&lt;/a&gt;. It has excellent documentation, can run on a standard hosting package, has a simple user-interface and a flexible taxonomy system. The code is open source so if you self-host the site, you won't run into the third-party service problems of getting locked out of your data. WordPress has all the components for a home-brew bookmarking service.&lt;/p&gt;

&lt;h3&gt;My Bookmarks plugin&lt;/h3&gt;

&lt;p&gt;I'd originally hoped to avoid building my own plugin but none of those in the &lt;a href="https://wordpress.org/plugins/" title="WordPress Plugin Directory"&gt;WordPress Plugin Directory&lt;/a&gt; suited my needs. Most were too feature-packed and I wanted something lightweight: just have some way of saving and tagging links for later retrieval. Putting together simple bookmark storage isn't difficult: 'bookmarks' can be nothing more than a post with a single custom field to store the URL. To keep them separate from standard blog posts, I created a custom bookmark content type and packaged it into a plugin called &lt;strong&gt;&lt;em&gt;My Bookmarks&lt;/em&gt;&lt;/strong&gt;. (I'm not very imaginative when naming things.)&lt;/p&gt;

&lt;p&gt;Delicious has a social bookmarking aspect that lets you publish your links, follow other users and discover pages those in your network have saved. Social bookmarking wasn't compelling for me so I didn't attempt to include this functionality. In my opinion, publishing the links on a blog is social enough and any anyone who wants to 'follow' can subscribe to the RSS feed built into WordPress.&lt;/p&gt;

&lt;p&gt;Bookmark sharing id controlled through the normal WordPress &lt;em&gt;Visiblity&lt;/em&gt; setting. Set to &lt;em&gt;Public&lt;/em&gt; so the bookmark gets posted on your blog; set to &lt;em&gt;Private&lt;/em&gt; so it's visible only after logging in to WordPress.&lt;/p&gt;

&lt;p&gt;One great thing about Delicious was a handy bookmarklet that allowed you bookmark your browser's current open page. Rather annoyingly, this feature broke for me at some point after it was acquired by one of its &lt;a href="https://en.wikipedia.org/wiki/Delicious_(website)#History"&gt;many owners&lt;/a&gt;. I implemented this functionality in the form of a WordPress-style &lt;em&gt;Press This&lt;/em&gt; bookmarklet. Code from the now seemingly abandoned &lt;a href="https://github.com/jchristopher/linkmarklet" title="Bookmarklet plugin aimed at rapid linkblogging"&gt;Linkmarklet plugin&lt;/a&gt; by &lt;a href="http://mondaybynoon.com"&gt;Jonathan Christopher&lt;/a&gt; does most of this work.&lt;/p&gt;

&lt;h2&gt;Experience so far&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;em&gt;My Bookmarks&lt;/em&gt;&lt;/strong&gt; plugin hasn't been published to the WordPress Plugin Directory as of now. I'm still trialling it to make sure everything works as expected before releasing but you're welcome to grab the source and tinker with it for your own needs. &lt;em&gt;Note: As of December 2016, the My Bookmarks plugin is temporarily hosted over on &lt;a href="https://gitlab.com/anthonylv/my-bookmarks" title="My Bookmarks: a WordPress social bookmarking plugin"&gt;GitLab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Currently the plugin is installed on my internal Wordpress-based Knowledge Management System on my local network. It serves up thousands of bookmarks from around 10 years worth of links. I replicated everything that made Delicous so useful for me without all the drawbacks of a third-party service. So far so good. The bookmarks that I've spent years curating are now fully under my control—and under my responsibility. Backups are still important but bookmarks are now included with my usual automated WordPress database dumps. All-in-all, I think it was a good move to finally migrate from Delicious.&lt;/p&gt;

&lt;div id="footnotes"&gt;Book photo by Katia Grimmer-Laversanne from &lt;a href="http://www.freeimages.com/photo/bookmark-1526985"&gt;freeimages.com&lt;/a&gt;&lt;/div&gt;</description><category>Blog</category><category>Bookmarks</category><category>Curation</category><category>Delicious</category><category>Export</category><category>Links</category><category>Migration</category><category>Plugin</category><category>Python</category><category>WordPress</category><guid>https://anothercoffee.net/migrating-delicious-bookmarks-wordpress/</guid><pubDate>Wed, 30 Nov 2016 11:38:07 GMT</pubDate></item><item><title>How to prepare for your Drupal to WordPress migration project</title><link>https://anothercoffee.net/prepare-drupal-wordpress-migration-project/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;figure&gt;&lt;img src="https://anothercoffee.net/images/website-migration-architect-og-1200x630.jpg"&gt;&lt;/figure&gt; &lt;p&gt;Any successful project requires careful planning and a Drupal to WordPress migration is no exception. If you haven’t already read my &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/" title="Drupal to WordPress Migration Guide"&gt;Drupal to WordPress Migration Guide&lt;/a&gt;, I recommend you first head over there to get an idea of what’s involved. It can be tempting to get straight to setting up WordPress, trying out new themes and experimenting with plugins. Nevertheless, some basic preparation beforehand will save you lots of work.&lt;/p&gt;

&lt;p&gt;Website owners and administrators know  their content is important but it’s often treated as an afterthought in the excitement to play with the new content management system. After all, you can use the Drupal site as the template and simply export over all the content over, right? For some site owners that’s all there is to it. However, you should be aware that site migrations can have &lt;a href="http://steppingback.com/protip-ignore-first-instinct-know-sucks/" title="Drupal to WordPress case study - Protip: Ignore your first instinct when you know it sucks"&gt;hidden pitfalls&lt;/a&gt; that turn an apparently simple project into one fraught with complications.&lt;/p&gt;
&lt;p&gt;Avoid problems by planning your Drupal to WordPress migration before you even touch your server. Whether you migrate the site yourself or &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/" title="Drupal to WordPress migration service"&gt;hire me to help you&lt;/a&gt;, this guide will give you a head start with your planning. Keep in mind that general project planning principles apply but there are already many resources on this topic. I will focus on the areas important specifically for a migration from Drupal to WordPress.&lt;/p&gt;
&lt;h2&gt;Step 1: Consider why you are migrating to WordPress&lt;/h2&gt;
&lt;p&gt;There are many content management systems available and I’m going to assume you have already thought carefully about why you’ve chosen WordPress. For the sake of completeness, I’ll include this step because your reasons will determine whether or not the migration project will be a success.&lt;/p&gt;
&lt;p&gt;In case you need a reminder about the merits of either CMS, here are a few &lt;em&gt;Drupal vs WordPress&lt;/em&gt; posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://makeawebsitehub.com/content-management-system-cms-comparison/" title chart of wordpress drupal and joomla&gt;Comparison chart of WordPress, Drupal and Joomla&lt;/a&gt; (makeawebsitehub.com)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elegantthemes.com/blog/resources/wordpress-vs-drupal" title vs. drupal: choosing between two platforms&gt;WordPress vs. Drupal: Choosing Between Two Platforms&lt;/a&gt; (Elegant Themes Blog)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wpbeginner.com/opinion/wordpress-vs-joomla-vs-drupal-which-one-is-better/" title vs joomla drupal which one is better&gt;WordPress vs Joomla vs Drupal – Which One is Better?&lt;/a&gt; (WP Beginner)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bigtunainteractive.com/wordpress-vs-drupal/" title vs wordpress&gt;Drupal vs WordPress&lt;/a&gt; (Big Tuna Interactive)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you haven’t already put together a migration requirements document, go ahead and create one now. I go through this &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/#sample-drupal-to-wordpress-migration-checklists"&gt;migration requirements checklist&lt;/a&gt; with my own clients and it might help you too.&lt;/p&gt;
&lt;h2&gt;Step 2: Decide on your approach to building the WordPress theme&lt;/h2&gt;
&lt;p&gt;Just as in Drupal, the WordPress theme handles how your site looks. A migration to a new CMS often goes hand-in-hand with redesigning the site. I’ve put this step early on because a site redesign could be an entirely separate project. You might want to run in parallel with the migration or it could be something you’d want to start &lt;em&gt;before&lt;/em&gt; kicking off the content migration.&lt;/p&gt;
&lt;p&gt;You have three options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Redesign the WordPress site entirely.&lt;/li&gt;
&lt;li&gt;Create a custom theme based on your existing Drupal design.&lt;/li&gt;
&lt;li&gt;Use one of the many pre-made free or premium WordPress themes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have a successful site, any change, whether it’s a redesign, restructure or move to another content management system should be carefully considered. This article at Search Engine Journal gives an excellent overview of the things you should keep in mind: &lt;a href="https://www.searchenginejournal.com/how-to-avoid-seo-disaster-during-a-website-redesign/" title="How To Avoid SEO Disaster During a Website Redesign"&gt;How To Avoid SEO Disaster During a Website Redesign – Top Marketer Concerns&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Be aware of any SEO impact when migrating to WordPress&lt;/h2&gt;
&lt;p&gt;WordPress has an excellent reputation for being SEO-friendly but beware of taking this for granted. The Search Engine Journal post linked in step two should have given you a sobering outlook on how making changes to your site will affect your SEO.&lt;/p&gt;
&lt;p&gt;In my experience, preserving SEO takes a large part of the time and budget of many migration projects. Sometimes the cost will outweigh any benefit of trying to preserve the SEO customisations on your Drupal installation. &lt;em&gt;This is often a commercial rather than technical decision.&lt;/em&gt; If you run a site that relies on search traffic, I recommend that you hire an SEO consultant to advise you. In fact, I will often work with and take direction from a client’s SEO consultant during a typical Drupal to WordPress migration project.&lt;/p&gt;
&lt;p&gt;When looking for an SEO specialist, keep in mind that the techniques for migrations aren’t that much different from SEO considerations during a site redesign. At a minimum, you should be looking for someone who has good grounding in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Technical SEO auditing:&lt;/em&gt; This is to give you a baseline of how the current Drupal installation looks from an SEO standpoint. These audits will help figure out how to recover if you see a drop in traffic after the migration to WordPress.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;User experience (UX) optimisation:&lt;/em&gt; User experience is a big factor in SEO. A change in the site structure will almost certainly affect user experience.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information about the kind of work involved, see &lt;a href="https://anothercoffee.net/drupal-wordpress-migration-seo/" title="Preserving SEO during a Drupal to WordPress migration"&gt;Preserving SEO during a Drupal to WordPress migration&lt;/a&gt;. This &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/#sample-drupal-to-wordpress-migration-checklists"&gt;SEO checklist&lt;/a&gt; will help get you thinking about any SEO impact the migration will have to your site.&lt;/p&gt;
&lt;h2&gt;Step 4: Gather as much information as you can about your Drupal installation&lt;/h2&gt;
&lt;p&gt;Knowing as much as possible about your Drupal installation will help me come up with a more precise estimate for your migration project. If you’re doing the migration in-house, it will help you plan how much time to set aside and which team-members need to be involved.&lt;/p&gt;
&lt;p&gt;Site owners who built and manage the site will likely have records of some information but not necessarily all the details of how Drupal is configured. Site owners also come to me with a site built by a third-party. They have working knowledge on how to manage it and add content but not anything else. I can help you discover the information needed for the migration if you are in this position but you can save budget by doing some investigation yourself. Use my &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/#sample-drupal-to-wordpress-migration-checklists" title="Drupal to WordPress migration worksheet"&gt;Drupal to WordPress migration worksheet&lt;/a&gt; as a guide.&lt;/p&gt;
&lt;p&gt;The formal name for this is a &lt;em&gt;site audit&lt;/em&gt; but essentially you need to find out about two areas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How to access your server&lt;/li&gt;
&lt;li&gt;What kind of content you have&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Server audit&lt;/h3&gt;
&lt;p&gt;You’ll need your FTP server details to access your Drupal installation, media files and to upload the WordPress package. When running a migration, I like to download a full working version of the Drupal site on my local development server. This isn’t necessary but can be useful for figuring out formatting problems that crop after content migration. For example, you may find missing bits of text on WordPress and some investigation on the Drupal installation will show the text will be from a custom field or block.&lt;/p&gt;
&lt;p&gt;The database server is necessary for exporting your Drupal database and setting up WordPress when the migration is complete. Some hosting providers offer access through a cPanel interface, a separate phpMyAdmin link or by command line. Gather all these details ahead of time will help get your project started quickly.&lt;/p&gt;
&lt;h3&gt;Content audit&lt;/h3&gt;
&lt;p&gt;The content audit helps you discover what type of Drupal content do you have. Drupal, like most other content management systems, keeps content in two places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The database&lt;/li&gt;
&lt;li&gt;On the server filesystem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Types of content include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nodes&lt;/li&gt;
&lt;li&gt;Views&lt;/li&gt;
&lt;li&gt;Blocks&lt;/li&gt;
&lt;li&gt;Panes&lt;/li&gt;
&lt;li&gt;Taxonomies&lt;/li&gt;
&lt;li&gt;Static HTML files&lt;/li&gt;
&lt;li&gt;Embedded media like videos, images and audio&lt;/li&gt;
&lt;li&gt;File attachments&lt;/li&gt;
&lt;li&gt;User profile information&lt;/li&gt;
&lt;li&gt;Content metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You may be surprised where the different bits of content that make up your site ends up being stored. A content audit will avoid unnecessary complications with trying to hunt down bits of data mid-migration. My &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-guide/#sample-drupal-to-wordpress-migration-checklists"&gt;Drupal content audit checklist&lt;/a&gt; should get you started.&lt;/p&gt;
&lt;h2&gt;Step 5: Write a Drupal to WordPress migration mapping document&lt;/h2&gt;
&lt;p&gt;The migration mapping document will help both with quoting for project as well as keeping track of everything that needs to be done during the migration. It gives everyone involved a framework to work on.&lt;/p&gt;
&lt;p&gt;I know, this sounds like a mouthful and so very tedious. Truth be told, few people find writing specification documents fun but it is a necessary step if you want to avoid unexpected costs and delays. The more detailed you are, the fewer surprises there will be for everyone during the actual migration. Your investigations during step 4 will lay the groundwork for the migration specification. &lt;/p&gt;
&lt;p&gt;I will write another post on how to write migration mapping document but the document doesn’t have to very formal. All it needs to do is clearly convey the state of your Drupal site and what you’d like migrated to WordPress.&lt;/p&gt;
&lt;h2&gt;Ready for your migration project&lt;/h2&gt;
&lt;p&gt;Running through these steps will put you in a good position for your migration from Drupal to WordPress. Admittedly, there have been projects where I or the site owner didn’t bother to do any detailed planning and we were able to get by. Usually, this was because of limited budget or a rush to launch the new WordPress site. However, the projects where we took some time out to plan ahead were always closer to the estimated budget and posed fewer surprises.&lt;/p&gt;
&lt;div style="border-top: 3px solid #BABECB;margin: 50px 0 0 0;padding: 20px 0 0 0; font-style:italic;"&gt;
A little plug to keep the lights running. If you think all of this work is too much trouble, please consider &lt;a href="https://anothercoffee.net/contact"&gt;hiring me&lt;/a&gt; for your Drupal to WordPress migration project.
&lt;/div&gt;
&lt;div class="drupal_to_wordpress_banner"&gt;
&lt;h2&gt;&lt;a href="http://migratecontent.com" title="Drupal to WordPress migration"&gt;Drupal to WordPress migration service&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Drupal 6 and Drupal 7 · All content · Custom content types · SEO · Plugins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you’re not sure how to make the appropriate changes or would simply like someone else to do the work, please &lt;a href="https://anothercoffee.net/#contact" title="Get an estimate for Drupal to WordPress migration"&gt;contact me&lt;/a&gt; and ask about my &lt;strong&gt;&lt;a href="http://migratecontent.com" title="Ask about Drupal to WordPress migration service"&gt;Drupal to WordPress migration service&lt;/a&gt;.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="button" href="https://anothercoffee.net/#contact" title="Contact me to inquire about my Drupal to WordPress migration service"&gt;Get a quote&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;</description><category>Blog</category><category>Drupal</category><category>Help</category><category>Migration</category><category>WordPress</category><guid>https://anothercoffee.net/prepare-drupal-wordpress-migration-project/</guid><pubDate>Mon, 02 May 2016 09:05:11 GMT</pubDate></item><item><title>Drupal to WordPress migration worksheet</title><link>https://anothercoffee.net/drupal-wordpress-migration-worksheet/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;If you are using my Drupal to WordPress Migration Tool or have hired me for &lt;a href="http://migratecontent.com/" title="Drupal to WordPress migration service"&gt;Drupal to WordPress migration service&lt;/a&gt;, it’s important that you gather as much information as you can about your Drupal installation. The more detailed you are in your investigation, the fewer surprises there will be during the actual migration. You may have hired a web development company or freelancer to build your site and they’ll sometimes be able to provide you with the necessary information. However, gathering this information can involve some work so they may be reluctant to provide help without an extra fee.&lt;/p&gt;
&lt;p&gt;You can use the questions below to help structure your investigation process. I can help you with this if you’re not able to run the investigation yourself. &lt;a href="https://anothercoffee.net/#contact"&gt;Please ask for details&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Drupal Installation Questions&lt;/h2&gt;

&lt;em&gt;What are the FTP login details of your hosting provider?&lt;/em&gt;You will need these details to make a backup of your Drupal site. When the migration is complete, you’ll need them to install WordPress on your server.


	&lt;table style="width: 100%"&gt;
&lt;caption&gt;FTP Credentials&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width: 30%"&gt;
	Host&lt;/th&gt;
&lt;td style="width: 70%"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Port&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Protocol&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Username&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Password&lt;/th&gt;
&lt;td style="color:#aaa"&gt;Send through secure channel e.g. password manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;em&gt;What are the database login details of your hosting provider?&lt;/em&gt;You’ll need these to export your Drupal database to perform the migration.

&lt;table style="width: 100%"&gt;
&lt;caption&gt;Database Credentials&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width: 30%"&gt;
	Host&lt;/th&gt;
&lt;td style="width: 70%"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Port&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Database name&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Username&lt;/th&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	Password&lt;/th&gt;
&lt;td style="color:#aaa"&gt;Send through secure channel e.g. password manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;Do you know how to export your database to a dumpfile?&lt;/em&gt;If you’re unsure how to export your database to a ‘dumpfile’, please contact your hosting provider. They will likely have tools such as phpMyAdmin and help articles to guide you through the process.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	 &lt;/th&gt;
&lt;td style="width:10%; text-align:center"&gt;&lt;strong&gt;Yes/No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	I know how to export my database to a dump file&lt;/th&gt;
&lt;td style="width:10%"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
	I need help exporting my database to a dump file&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="page-break"&gt;&lt;/div&gt;

&lt;em&gt;What version of Drupal are you running?&lt;/em&gt;The database column names differ slightly between Drupal versions. This means that a different set MySQL queries will be needed to perform the migration. You can sometimes find this information using your installation’s &lt;em&gt;CHANGELOG&lt;/em&gt; file at http://[YOURDOMAIN.COM]/CHANGELOG.txt. Some developers remove this file as part of their security hardening process so it may not exist in your installation.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	Drupal version&lt;/th&gt;
&lt;td style="width:10%"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;List your Drupal modules and site functionality&lt;/em&gt;Can the functionality can be handled with existing WordPress plugins? Will you need to develop custom plugins?&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Drupal modules and functionality&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;How many custom content types do you have set up?&lt;/em&gt;Additional migration MySQL queries will be needed for each Drupal custom content type. WordPress supports &lt;em&gt;page&lt;/em&gt; and &lt;em&gt;post&lt;/em&gt; content types as standard. Additional development work will be needed to support other content types.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Drupal custom content types&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="page-break"&gt;&lt;/div&gt;

&lt;em&gt;How many custom fields do you have set up?&lt;/em&gt;As with custom content types, custom fields in your Drupal installation will need additional work to support them under WordPress.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Drupal custom fields&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;Do you have blocks, views and panes with important content?&lt;/em&gt;Many Drupal sites display content in blocks, views and panes. These will also need additional work to support under WordPress.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Drupal blocks, views and panes&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;How many nodes do you have?&lt;/em&gt;The number of Drupal nodes you have does not usually play a big factor in the complexity of the migration. However, it will still be useful to get an idea of the number since many nodes can have an impact on how long it takes to troubleshoot migration problems.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	Approximate number of Drupal nodes&lt;/th&gt;
&lt;td style="width:10%"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="page-break"&gt;&lt;/div&gt;

&lt;em&gt;Do you expect to have multiple aliases referencing the same post?&lt;/em&gt;Drupal supports multiple URL aliases for nodes. These will need to be resolved when migrating to WordPress. For more information, please see my article &lt;a href="https://anothercoffee.net/drupal-wordpress-migration-seo/" title="Preserving SEO during a Drupal to WordPress migration"&gt;Preserving SEO during a Drupal to WordPress migration&lt;/a&gt;.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Brief description of what to do with multiple aliases&lt;/caption&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td style="border:none;"&gt;
		&lt;em&gt;It’s OK if you don’t know. We can discuss your options.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;Do you expect to have duplicate terms?&lt;/em&gt;Duplicate Drupal terms can cause problems during a migration. For more information, please see my article &lt;a href="http://192.168.1.30:8100/drupal-to-wordpress-migration-taxonomy/" title="Handling Drupal terms during a Drupal to WordPress migration"&gt;Handling Drupal terms during a Drupal to WordPress migration&lt;/a&gt;&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Brief description of what to do with duplicate terms&lt;/caption&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td style="border:none;"&gt;
		&lt;em&gt;It’s OK if you don’t know. We can discuss your options.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="page-break"&gt;&lt;/div&gt;

&lt;em&gt;Will your terms exceed the WordPress’ 200 character length?&lt;/em&gt;WordPress has a 200 character limit for terms. Any Drupal terms longer than 200 characters will need to be truncated.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Brief description of what to do with problem terms&lt;/caption&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td style="border:none;"&gt;
		&lt;em&gt;It’s OK if you don’t know. We can discuss your options.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;How many users do you have?&lt;/em&gt;The number of users doesn’t play a big factor during a migration but it may be useful to know.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	Approximate number of users&lt;/th&gt;
&lt;td style="width:10%"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;How many user roles do you have?&lt;/em&gt;Your Drupal user roles may need to be converted into &lt;a href="https://codex.wordpress.org/Roles_and_Capabilities" title="WordPress Roles and Capabilities"&gt;WordPress roles&lt;/a&gt;.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;List and brief description of user roles&lt;/caption&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td style="border:none;"&gt;
		&lt;em&gt;It’s OK if you don’t know. We can discuss your options.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px;"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;div class="page-break"&gt;&lt;/div&gt;
&lt;h2&gt;WordPress Installation Questions&lt;/h2&gt;

&lt;em&gt;Will preserving SEO be an important part of the project?&lt;/em&gt;For more information, please see my article &lt;a href="https://anothercoffee.net/drupal-wordpress-migration-seo/" title="Preserving SEO during a Drupal to WordPress migration"&gt;Preserving SEO during a Drupal to WordPress migration&lt;/a&gt;.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	 &lt;/th&gt;
&lt;td style="width:10%; text-align:center"&gt;&lt;strong&gt;Yes/No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style="width:90%"&gt;
	Preserving SEO is important for this project&lt;/th&gt;
&lt;td style="width:10%"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;Aside from migrating to WordPress, do you also plan to redesign the site?&lt;/em&gt;Redesigning the site will obviously involve more work as it will require a custom WordPress theme. Some site owners are happy to use a free or premium off-the-shelf theme template.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;Ideas for the WordPress theme&lt;/caption&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td style="border:none;"&gt;
		&lt;em&gt;e.g. list the names, URLs and prices of any pre-made template candidates&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;em&gt;Are there existing WordPress plugins that match your Drupal functionality?&lt;/em&gt;If you’re happy to be flexible, you may find WordPress plugins that closely match any Drupal modules you have installed on your existing site. Set aside some time to search the &lt;a href="https://wordpress.org/plugins/" title="WordPress Plugin Directory"&gt;WordPress Plugin Directory&lt;/a&gt;. If you don’t find anything suitable, you may have to consider setting aside some budget for custom plugin development.&lt;br&gt;
&lt;table style="width: 100%"&gt;
&lt;caption&gt;List some possible WordPress plugins you may have found&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="height: 200px"&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><category>Blog</category><category>Drupal</category><category>Help</category><category>Migration</category><category>WordPress</category><category>Worksheet</category><guid>https://anothercoffee.net/drupal-wordpress-migration-worksheet/</guid><pubDate>Mon, 25 Apr 2016 00:00:14 GMT</pubDate></item><item><title>Preserving SEO during a Drupal to WordPress migration</title><link>https://anothercoffee.net/drupal-wordpress-migration-seo/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;This article is about preserving SEO during a &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-tool/" title="Drupal to WordPress migration tool"&gt;Drupal to WordPress migration&lt;/a&gt;. It’s not about which platform is better. A web search will bring up many articles about the relative SEO merits of Drupal versus WordPress. I’ve found the best summary on that topic in a &lt;a href="https://www.drupal.org/node/1468704#comment-5690028"&gt;forum post&lt;/a&gt; by &lt;a href="https://www.drupal.org/u/john_b"&gt;Drupal.org user&lt;/a&gt; and developer, &lt;a href="http://www.digitprofessionals.com/"&gt;John Birchall&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“The consensus that WordPress has better SEO is a guess…WordPress fans will guess one way, Drupal fans the other. In my opinion, WordPress SEO plugins work better for sites which are short on skill or time or money. If you want to give your clients hand-made quality, Drupal does rather a good job. This also goes for SEO. Nevertheless, lack of developer skill and client budget does sometimes mean we are better off simply ‘reheating’ and rolling out the wonderful prepackaged solutions available for WordPress.” (Slightly paraphrased for clarity.)
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you’re reading this post, I will assume that you’ve already decided to migrate your site to WordPress. Rather than re-hashing the Drupal versus WordPress SEO debate, I’ll focus on some technical details that affect your SEO efforts when migrating from Drupal to WordPress. First, let’s start with some basics.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img class="figure-img img-fluid rounded" src="https://anothercoffee.net/images/one-way-url-drupal-wordpress-seo.jpg" alt="One-way traffic sign to symbolise preserving SEO during a Drupal to WordPress migration" width="800" height="284"&gt;
&lt;/figure&gt;

&lt;h2&gt;Can I preserve my SEO during the migration?&lt;/h2&gt;
&lt;p&gt;The quick answer is, &lt;em&gt;‘Yes’&lt;/em&gt;. It is possible to &lt;em&gt;preserve&lt;/em&gt; search engine optimisation during a migration. However, it can be easy to overlook the idea that you might end up with better SEO by revisiting your approach entirely. I’ve had site migrations where replicating optimisations from the Drupal version wouldn’t have made a significant impact in the business—or at the very least, where SEO was something that could be improved after the migration. If your site falls into this category, I would not recommend putting too much into preserving your Drupal optimisations. The money spent hiring me or anyone else may be better spent on improving the WordPress SEO &lt;em&gt;after&lt;/em&gt; exporting your Drupal content.&lt;/p&gt;
&lt;p&gt;There are some easy and low-cost approaches you can take such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using or building an SEO-friendly and responsive WordPress theme.&lt;/li&gt;
&lt;li&gt;Installing SEO WordPress plugins.&lt;/li&gt;
&lt;li&gt;Creating higher quality content.&lt;/li&gt;
&lt;li&gt;Improving page load times. WordPress is a lighter CMS so you should get this ‘out of the box’ but you can lose any gains if, for example, you replicate calls to third-party libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, you should consult an expert if you rely heavily on search traffic. Preserving SEO may be vital for your site but it’s worth making a conscious assessment about the investment needed.&lt;/p&gt;
&lt;h2&gt;What kind of work is involved in preserving SEO?&lt;/h2&gt;
&lt;p&gt;The underlying differences between Drupal and WordPress mean preserving SEO often takes the bulk of a migration budget. The amount of work needed depends on what you’re trying to preserve. To give an example from a past migration project where SEO was vital, tasks included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pre-migration auditing, mapping and analysing links on the Drupal site;&lt;/li&gt;
&lt;li&gt;Developing an SEO-friendly custom theme;&lt;/li&gt;
&lt;li&gt;Creating redirects for every URL that would change on WordPress;&lt;/li&gt;
&lt;li&gt;Ensuring we preserve &lt;a href="http://www.webopedia.com/TERM/O/on_page_optimization.html"&gt;on-page optimization&lt;/a&gt; for all high-value pages;&lt;/li&gt;
&lt;li&gt;Making further adjustments as directed by an SEO consultant after she analysed her webmaster tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember that SEO isn’t a one-time effort. The project needed multiple months of on-going work. Further, I was taking direction from the client’s SEO consultant who incurred her own separate fees. Thus the client allocated a sizeable budget for SEO alone. In his case it was worth the money because the Drupal site earned him many times that amount on revenue from search traffic. Minimising any negative impact on SEO after migrating to WordPress was a priority.&lt;/p&gt;
&lt;p&gt;How much time and money &lt;em&gt;you’ll&lt;/em&gt; need to allocate for your migration depends on a range of factors that are very specific to your site. You’ll only know after doing some in-depth analysis and documentation. Here’s an article on Search Engine Journal that I send to clients when they ask about the SEO impact of a CMS migration: &lt;a title="How To Avoid SEO Disaster During a Website Redesign – Top Marketer Concerns" href="http://www.searchenginejournal.com/how-to-avoid-seo-disaster-during-a-website-redesign/"&gt;How To Avoid SEO Disaster During a Website Redesign&lt;/a&gt;. It’s worth a read and afterwards you can think about how much SEO should play a part of your site migration project.&lt;/p&gt;
&lt;h2&gt;SEO considerations&lt;/h2&gt;
&lt;p&gt;What exactly will affect SEO during a typical Drupal to WordPress migration? Here are a few SEO considerations to keep in mind for your migration project. It’s certainly not an exhaustive list but paying attention to these points should cover the basics.&lt;/p&gt;
&lt;h3&gt;On-page SEO&lt;/h3&gt;
&lt;p&gt;A lot of the on-page SEO comes over as a natural side-effect of most content migration processes. For example, page titles, content keyword optimisation, sub-heading tags, image file names and internal linking are all embedded into the Drupal node content. These remain intact when the nodes are imported into WordPress, unless content cleaning or other manipulation is part of the project. &lt;/p&gt;
&lt;p&gt;Other areas, such as URL structure, meta data and load speed will need work due to the differences of the two systems.&lt;/p&gt;
&lt;h3&gt;Off-site SEO&lt;/h3&gt;
&lt;p&gt;Off-site SEO will be unaffected by a CMS migration as long as you have the necessary redirects set up to catch URL changes for any backlinks. This is an effort that’s external to the site so not within the scope of this article.&lt;/p&gt;
&lt;h3&gt;Drupal aliases vs WordPress permalinks&lt;/h3&gt;
&lt;p&gt;URL structure is one of the SEO areas that will change after a CMS migration. A big part is because of some important differences between how Drupal and WordPress handle URLs. Drupal creates URLs using either the node ID or a URL alias stored in its database’s &lt;code&gt;url_alias&lt;/code&gt; table. Take a look at some sample entries.&lt;/p&gt;

    &lt;figure class="figure d-flex flex-column align-items-center"&gt;
        &lt;img class="figure-img img-fluid rounded" src="https://anothercoffee.net/images/drupal-url_alias-table.png" alt="Drupal url_alias table" width="430" height="167"&gt;
        &lt;figcaption&gt;Drupal url_alias table&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;p&gt;You’ll see an entry for &lt;code&gt;node/28&lt;/code&gt; associated with a URL alias &lt;code&gt;projects/april&lt;/code&gt;. This means that under Drupal, the page with node ID &lt;code&gt;28&lt;/code&gt; can be accessed using either &lt;em&gt;http://example.com/node/28&lt;/em&gt; or &lt;em&gt;http://example.com/projects/april&lt;/em&gt;. Not shown is that content can have multiple aliases. The site could therefore also have another entry &lt;code&gt;node/28&lt;/code&gt; associated with URL alias &lt;code&gt;projects-april&lt;/code&gt; and yet another with &lt;code&gt;my-projects/april&lt;/code&gt;. You will always be able to find a page by appending the URL alias entry in the &lt;code&gt;url_alias&lt;/code&gt; table to the site’s domain name.  &lt;/p&gt;
&lt;p&gt;WordPress has a different mechanism for creating URLs. Rather than relying on database entries, it generates &lt;a href="https://codex.wordpress.org/Using_Permalinks" title="WordPress codex: Using Permalinks"&gt;rewrite rules&lt;/a&gt; and builds the permalink dynamically depending on your &lt;a href="https://codex.wordpress.org/Using_Permalinks#Choosing_your_permalink_structure" title="WordPress codex: Choosing your permalink structure"&gt;permalink settings&lt;/a&gt;. WordPress’ closest equivalent to the Drupal &lt;code&gt;url_alias&lt;/code&gt; is its &lt;a title="Understanding Permalinks and Slugs in WordPress" href="https://bloggertowp.org/tutorials/user-guide/permalinks-and-slugs/"&gt;permalink slug&lt;/a&gt; stored as the &lt;code&gt;post_name&lt;/code&gt; in the &lt;code&gt;wp_posts&lt;/code&gt; table. Under my standard Drupal to WordPress migration, I migrate over the Drupal aliases by converting them into WordPress post name slugs. (See the table mapping in a separate article, &lt;a title="Drupal to WordPress migration: posts table mapping" href="http://192.168.1.30:8100/drupal-to-wordpress-migration-posts-table-mapping/"&gt;Drupal to WordPress migration: posts table mapping&lt;/a&gt;.) If you have the &lt;em&gt;Post name&lt;/em&gt; structure set in the WordPress Permalinks Settings, you’d then find the Project April page at either &lt;em&gt;http://example.com/?p=28&lt;/em&gt; or &lt;em&gt;http://example.com/april/&lt;/em&gt;. Note that this would cause an SEO problem because the new WordPress link does not match the old Drupal link.&lt;/p&gt;

&lt;figure class="figure d-flex flex-column align-items-center"&gt;
    &lt;img class="figure-img img-fluid rounded" src="https://anothercoffee.net/images/wordpress-wp_posts-table.png" alt="WordPress wp_posts table" width="270" height="171"&gt;
    &lt;figcaption&gt;WordPress wp_posts table&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;We would have to do some extra work to solve this problem. For example, if the &lt;em&gt;april&lt;/em&gt; node was a page, we could create and link to a parent &lt;em&gt;Projects&lt;/em&gt; page to create the Drupal &lt;em&gt;http://example.com/projects/april&lt;/em&gt; structure. Alternatively, if it was a post, we could create a &lt;em&gt;projects&lt;/em&gt; category or tag and set the Category base or Tag base setting. We could also create .htaccess redirects or use one of the many WordPress &lt;a href="https://wordpress.org/plugins/redirection/" title="Redirection plugin for WordPress"&gt;redirection plugins&lt;/a&gt;. The exact solution would depend on your project’s requirements.&lt;/p&gt;
&lt;h3 id="wordpress_permalink_constraints"&gt;WordPress permalinks have more constraints&lt;/h3&gt;
&lt;p&gt;Aside from the differences in how URLs are stored and generated, you should also be aware of WordPress permalink constrains. These will have a big impact on the amount of work needed to preserve your Drupal SEO when migrating to WordPress. I’ll briefly summarise them below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Drupal URL alias has a 255 character limit but the WordPress the &lt;code&gt;post_name&lt;/code&gt; field stores only 200 characters. Make sure to keep track of any truncated posts names and create a corresponding redirect.&lt;/li&gt;
&lt;li&gt;Since there’s no WordPress equivalent of the Drupal &lt;code&gt;url_alias&lt;/code&gt; table, you’ll need to decide which alias will be converted into the post name. You should create separate redirects for the other aliases.&lt;/li&gt;
&lt;li&gt;WordPress slugs which create the permalink are essentially a URL-friendly version of the post title. WordPress automatically cleans up the post title to create slugs for new content but you may encounter problems when migrating Druapl aliases into slugs. Characters that would be valid within a Drupal alias are invalid as a WordPress slug. For example, you cannot have forward slashes, accented characters and quotes in your WordPress slug. You’ll need to clean up and keep track of any problem aliases, otherwise WordPress will not be able to serve the page.&lt;/li&gt;
&lt;li&gt;As previously mentioned, under Drupal you will always be able to find a page by appending the URL alias entry to the site’s domain name. WordPress does not store any records of its URL structure. You will end up with broken links and a potential SEO nightmare if you change the Permalink structure settings without consideration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Remember your Drupal taxonomies&lt;/h3&gt;
&lt;p&gt;It’s easy to forget Drupal’s powerful taxonomy system is capable of generating listings that attract valuable traffic. Use webmaster tools to audit your site traffic to pick up on any such listing pages. Unlike Drupal which allows for multiple vocabularies, WordPress only offers one set of &lt;em&gt;categories&lt;/em&gt; and &lt;em&gt;tags&lt;/em&gt; out of the box. Replicating your Drupal taxonomy listings in WordPress may take considerable development but a quick fix may be to manually replicate the important listings pages. Obviously the size of your site will dictate if this will be feasible.&lt;/p&gt;
&lt;h3&gt;Menu and breadcrumb navigation&lt;/h3&gt;
&lt;p&gt;Menu structure and breadcrumb navigation is often an important part of your SEO. Ensure that your selected WordPress theme both supports breadcrumbs (some don’t) and the same type of breadcrumbs e.g. hierarchy, attribute and history-based breadcrumbs.&lt;/p&gt;
&lt;h3&gt;Migrate metatags generated by Drupal metatag modules&lt;/h3&gt;
&lt;p&gt;Also remember that you may have installed modules that generate metatag information contributing to your SEO. Export these from the relevant Drupal table and import them into the WordPress database using the format for your preferred WordPress metatag plugin. For example, if you used the Drupal &lt;a href="https://www.drupal.org/project/metatag" title="Drupal metatag module"&gt;metatag module&lt;/a&gt; and would like to use the WordPress &lt;a href="https://wordpress.org/plugins/add-meta-tags/" title="Add-Meta-Tags plugin for WordPress"&gt;Add-Meta-Tags plugin&lt;/a&gt;, you’ll need to extract data from the &lt;code&gt;metatags&lt;/code&gt; table and insert them into &lt;code&gt;wp_postmeta&lt;/code&gt; table as a &lt;code&gt;meta_key&lt;/code&gt; and &lt;code&gt;meta_value&lt;/code&gt; pair. Keep in mind that some investigative work will be necessary to find out how your preferred modules and plugins store their data.&lt;/p&gt;
&lt;h3&gt;Search engine visibility&lt;/h3&gt;
&lt;p&gt;WordPress has a setting to discourage search engines from indexing site. It can be found in &lt;em&gt;Settings &amp;gt; Reading &amp;gt; Search Engine Visibility&lt;/em&gt;. It’s normal to have this checked during development but make sure you disable it when launching.&lt;/p&gt;
&lt;h3&gt;Load speed&lt;/h3&gt;
&lt;p&gt;WordPress, in general, requires fewer hosting resources than Drupal. You could very well find that a slow site on an under-performing server running Drupal becomes more responsive under WordPress. Don’t take this for granted, however. Use the migration as an opportunity to make improvements. Thoroughly vet plugin candidates to make sure they’re not pulling in third-party scripts that will increase page load times. Also avoid bloated page-builder themes. In my experience, these can be terrible for load speed as they try to cram in every conceivable bit functionality, thereby drastically slowing down what could have been a nimble site.&lt;/p&gt;
&lt;h2&gt;Preserving SEO during a Drupal to WordPress migration can be lots of work&lt;/h2&gt;
&lt;p&gt;As may have gathered by now, the amount of work and budget needed will reply on many factors. It’s not possible to prescribe what will be necessary for your site without in-depth detail about your configuration and requirements. Nevertheless, I hopefully will have given you enough information to get started with planning an approach.&lt;/p&gt;
&lt;div style="border-top: 3px solid #BABECB;margin: 50px 0 0 0;padding: 20px 0 0 0; font-style:italic;"&gt;
A little plug to keep the lights running. If you think all of this work is too much trouble, please consider &lt;a href="http://192.168.1.30:8100/#contact"&gt;hiring me&lt;/a&gt; for your Drupal to WordPress migration project.
&lt;/div&gt;

&lt;div class="alert alert-info text-center"&gt;
&lt;h3 style="font-size:1.5em"&gt;&lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/" title="Drupal to WordPress migration"&gt;Drupal to WordPress migration service&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Any Drupal version · All content · Custom content types · SEO · Plugins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you’re not sure how to make the appropriate changes or would simply like someone else to do the work, please &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/#contact" title="Get an estimate for Drupal to WordPress migration"&gt;request a quotation&lt;/a&gt; for my &lt;strong&gt;&lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/" title="Ask about Drupal to WordPress migration service"&gt;Drupal to WordPress migration service&lt;/a&gt;.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;button class="cta-button"&gt;
    &lt;a href="https://forms.gle/ywPt7faLawXoqcpF7" target="_blank" rel="nofollow" title="Contact me to inquire about my Drupal to WordPress migration service"&gt;Get a quote&lt;/a&gt;
&lt;/button&gt;

&lt;/div&gt;</description><category>Blog</category><category>Drupal</category><category>Help</category><category>Migration</category><category>SEO</category><category>WordPress</category><guid>https://anothercoffee.net/drupal-wordpress-migration-seo/</guid><pubDate>Wed, 16 Mar 2016 00:28:53 GMT</pubDate></item><item><title>Drupal to WordPress migration table mapping</title><link>https://anothercoffee.net/drupal-to-wordpress-migration-table-mapping/</link><dc:creator>Anthony Lopez-Vito</dc:creator><description>&lt;p&gt;Following on from &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-sql-queries-explained/"&gt;Drupal to WordPress migration explained&lt;/a&gt;, this post documents the table mappings for a &lt;a href="https://anothercoffee.net/drupal-to-wordpress-migration-service/" title="Drupal to WordPress migration service"&gt;site migration&lt;/a&gt; from Drupal 6.x to WordPress 3.x.&lt;/p&gt;
&lt;p&gt;To read the mapping, you look up the Drupal table on the left listing the fields we use for a migration. Directly to its right is the WordPress table with the corresponding field in the same row. So for example, the &lt;em&gt;nid&lt;/em&gt; in Drupal’s &lt;em&gt;node&lt;/em&gt; table is exported to the &lt;em&gt;id&lt;/em&gt; field in the WordPress &lt;em&gt;wp_posts&lt;/em&gt; table.&lt;/p&gt;
&lt;p&gt;I have listed all the fields used in the query. If a Drupal field shows no mapping in the WordPress table, it is being used to match entries in another table for a join. Here we use the &lt;em&gt;vid&lt;/em&gt; field in &lt;em&gt;node&lt;/em&gt; and &lt;em&gt;node_revisions&lt;/em&gt; for an INNER JOIN.&lt;/p&gt;

&lt;h2&gt;Table mapping for WordPress wp_posts&lt;/h2&gt;
&lt;table class="table table-bordered table-hover" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;
&lt;/td&gt;
&lt;td class="td2" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td3" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td4" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td5" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td6" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;node&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td7" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_posts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;nid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_author&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;created&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_date&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Create date from UNIX timestamp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_title&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;changed&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_modified&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Create date from UNIX timestamp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;type&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_type&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_status&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td13" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;vid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td14" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td15" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td5" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td6" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;node_revisions&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;body&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_content&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;teaser&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_excerpt&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td9" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td13" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;vid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td17" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td15" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td18" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;node&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td6" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;url_alias&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td19" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;nid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td10" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;dst&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;If dst field is NULL, use nid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td20" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td21" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;src&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td14" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td22" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td16" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td8" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td23" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td23" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;to_ping&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Whitespace string&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td23" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td11" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;pinged&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Whitespace string&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="td1" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td23" valign="top"&gt;
&lt;p class="p3"&gt;
&lt;/p&gt;&lt;/td&gt;
&lt;td class="td24" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;post_content_filtered&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td class="td12" valign="top"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Whitespace string&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;h3&gt;Query&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code sql"&gt;
REPLACE INTO wordpress.wp_posts (&lt;br&gt;
		id,&lt;br&gt;
		post_author,&lt;br&gt;
		post_date,&lt;br&gt;
		post_content,&lt;br&gt;
		post_title,&lt;br&gt;
		post_excerpt,&lt;br&gt;
		post_name,&lt;br&gt;
		post_modified,&lt;br&gt;
		post_type,&lt;br&gt;
		post_status,&lt;br&gt;
		to_ping,&lt;br&gt;
		pinged,&lt;br&gt;
		post_content_filtered)&lt;br&gt;
	SELECT DISTINCT&lt;br&gt;
		n.nid ‘id’,&lt;br&gt;
		n.uid ‘post_author’,&lt;br&gt;
		DATE_ADD(FROM_UNIXTIME(0), interval n.created second) ‘post_date’,&lt;br&gt;
		r.body ‘post_content’,&lt;br&gt;
		n.title ‘post_title’,&lt;br&gt;
		r.teaser ‘post_excerpt’,&lt;br&gt;
		IF(a.dst IS NULL,n.nid, SUBSTRING_INDEX(a.dst, ‘/’, -1)) ‘post_name’,&lt;br&gt;
		DATE_ADD(FROM_UNIXTIME(0), interval n.changed second) ‘post_modified’,&lt;br&gt;
		n.type ‘post_type’,&lt;br&gt;
		IF(n.status = 1, ‘publish’, ‘private’) ‘post_status’,&lt;br&gt;
		‘ ‘,&lt;br&gt;
		‘ ‘,&lt;br&gt;
		‘ ‘&lt;br&gt;
	FROM drupal.node n&lt;br&gt;
	INNER JOIN drupal.node_revisions r USING(vid)&lt;br&gt;
	LEFT OUTER JOIN drupal.url_alias a&lt;br&gt;
		ON a.src = CONCAT(‘node/’, n.nid)&lt;br&gt;
		WHERE n.type IN (&lt;br&gt;
			/* List the content types you want to migrate */&lt;br&gt;
			‘page’,&lt;br&gt;
			‘story’,&lt;br&gt;
			‘blog’,&lt;br&gt;
			‘video’,&lt;br&gt;
			‘forum’,&lt;br&gt;
			‘comment’);
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Table mapping for WordPress terms&lt;/h2&gt;
&lt;p&gt;This table mapping exports the Drupal terms into WordPress.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0" class="table table-bordered table-hover"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" class="td1"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td2"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td3"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;term_data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td5"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_terms&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;term_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p4"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td12"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Make lower case and convert spaces to underscores&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td13"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;vid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td14"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;term_group&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Not used in a default WordPress installation&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td15"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td16"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td17"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;term_data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td5"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_term_taxonomy&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;term_taxonomy_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p4"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;term_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;taxonomy&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;String: ‘post_tag’ or ‘category’&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td13"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;description&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;description&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td18"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td19"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;parent&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;0 (No parent)&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the &lt;a href="https://codex.wordpress.org/WordPress_Taxonomy"&gt;WordPress Taxonomy documentation&lt;/a&gt;, &lt;em&gt;“term_group is a means of grouping together similar terms.”&lt;/em&gt; During a standard migration, the WordPress term_group is set to the Drupal vocabulary ID, which seems to make sense. Nevertheless, a default WordPress installation does not actually use the value for anything. It may have been included by the developers for future expandability or use by plugins.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;term_group=0&lt;/em&gt; is the default value when creating a term using the Drupal user interface.&lt;/p&gt;
&lt;p&gt;Below, we associate posts with the newly migrated terms.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0" class="table table-bordered table-hover"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" class="table table-bordered table-hover"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td2b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td3b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;term_node&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;wp_term_relationships&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td5b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;nid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;object_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;tid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8b"&gt;
&lt;p class="p2b"&gt;&lt;span class="s1b"&gt;term_taxonomy_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;Table mapping for WordPress users&lt;/h2&gt;
&lt;p&gt;This maps Drupal user export to WordPress.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0" class="table table-bordered table-hover"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" class="td1"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td2"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td3"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;users&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td5"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_posts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;uid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;ID&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_login&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Format to lowercase, replace spaces with underscores&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;pass&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_pass&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_nicename&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;mail&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_email&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;created&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_registered&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Formatted from UNIX time&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td12"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;display_name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td13"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td14"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_status&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Whitespace string&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td15"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td16"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_activation_key&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to 0&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;Table mapping for WordPress user meta values&lt;/h2&gt;
&lt;p&gt;User information like capabilities and roles in the &lt;em&gt;wp_usermeta&lt;/em&gt; table.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0" class="table table-bordered table-hover"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;users&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td5"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_usermeta&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td20"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;uid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;user_id&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td13"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td14"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;meta_key&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to string e.g. ‘wp_capabilities’&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td15"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td16"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;meta_value&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to string e.g. ‘a:1:{s:6:”author”;s:1:”1″;}’&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;More information about the settings for appropriate &lt;em&gt;meta_key&lt;/em&gt; and &lt;em&gt;meta_value&lt;/em&gt; can be found in the WordPress Codex:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/Roles_and_Capabilities"&gt;Roles and Capabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/User_Levels"&gt;User Levels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Node authors and comment authors&lt;/h2&gt;
&lt;p&gt;Drupal stores both node authors and comment authors in the &lt;em&gt;users&lt;/em&gt; table. WordPress handles things differently. Page and post authors are stored in the &lt;em&gt;wp_users&lt;/em&gt; table but comment authors are stored in &lt;em&gt;wp_comments&lt;/em&gt; together with the comment data.&lt;/p&gt;

&lt;h2&gt;Table mapping for WordPress comments&lt;/h2&gt;
&lt;table cellspacing="0" cellpadding="0" class="table table-bordered table-hover"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" class="td1"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td2"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td3"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td4"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;comments&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td5"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_posts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td7"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;cid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td8"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_ID&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td6"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;nid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_post_ID&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;timestamp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_date&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Converted from UNIX timestamp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_content&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;pid&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_parent&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;mail&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author_email&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td9"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;homepage&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td10"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author_url&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;Truncated to WordPress limit of 200 chars&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" class="td12"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td13"&gt;
&lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_approved&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" class="td11"&gt;
&lt;p class="p3"&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Comment authors&lt;/h2&gt;
&lt;p&gt;A note about the different ways Drupal and WordPress store comment author information: Drupal stores comment authors in its &lt;em&gt;users&lt;/em&gt; table alongside site users like node authors. In WordPress, comment authors are stored in its &lt;em&gt;wp_comments&lt;/em&gt; together with the comment data. WordPress comment authors are not entered into the &lt;em&gt;wp_users&lt;/em&gt; table.&lt;/p&gt;

&lt;hr&gt;

&lt;h2&gt;Table mapping for WordPress comments&lt;/h2&gt;

&lt;table cellspacing="0" cellpadding="0" class="t1"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td1"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td2"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td3"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;comments&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td5"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_posts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;cid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_ID&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;nid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_post_ID&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;timestamp&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_date&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Converted from UNIX timestamp&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_content&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;pid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_parent&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;mail&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author_email&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;homepage&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_author_url&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Truncated to WordPress limit of 200 chars&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td12"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td13"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;comment_approved&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;Comment authors&lt;/h2&gt;
&lt;p&gt;A note about the different ways Drupal and WordPress store comment author information: Drupal stores comment authors in its &lt;em&gt;users&lt;/em&gt; table alongside site users like node authors. In WordPress, comment authors are stored in its &lt;em&gt;wp_comments&lt;/em&gt; together with the comment data. WordPress comment authors are not entered into the &lt;em&gt;wp_users&lt;/em&gt; table.&lt;/p&gt;


  &lt;style type="text/css" scoped&gt;
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
    p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; -webkit-text-stroke: #000000}
    p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; -webkit-text-stroke: #000000; min-height: 14.0px}
    span.s1 {font-kerning: none}
    table.t1 {border-collapse: collapse}
    td.td1 {width: 80.5px; height: 12.5px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td2 {width: 120.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 0.0px; border-color: transparent transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td3 {width: 189.0px; height: 12.0px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td4 {width: 79.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #515151 #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td5 {width: 119.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #515151 #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td6 {width: 189.0px; height: 13.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td7 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td8 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td9 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td10 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td11 {width: 189.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td12 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td13 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
  &lt;/style&gt;

&lt;hr&gt;

&lt;h2&gt;Table mapping for WordPress terms&lt;/h2&gt;

&lt;p&gt;This table mapping exports the Drupal terms into WordPress.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" class="t1"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td1"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td2"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td3"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;term_data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td5"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_terms&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;term_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p4"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td12"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Make lower case and convert spaces to underscores&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td13"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;vid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td14"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;term_group&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Not used in a default WordPress installation&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td15"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td16"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td17"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;term_data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td5"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_term_taxonomy&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;term_taxonomy_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p4"&gt;&lt;span class="s1"&gt;tid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;term_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;taxonomy&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;String: ‘post_tag’ or ‘category’&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td13"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;description&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;description&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td18"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td19"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;parent&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;0 (No parent)&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;In the &lt;a href="https://codex.wordpress.org/WordPress_Taxonomy"&gt;WordPress Taxonomy documentation&lt;/a&gt;, &lt;em&gt;"term_group is a means of grouping together similar terms."&lt;/em&gt; During a standard migration, the WordPress term_group is set to the Drupal vocabulary ID, which seems to make sense. Nevertheless, a default WordPress installation does not actually use the value for anything. It may have been included by the developers for future expandability or use by plugins.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;term_group=0&lt;/em&gt; is the default value when creating a term using the Drupal user interface.&lt;/p&gt;

&lt;p&gt;Below, we associate posts with the newly migrated terms.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" class="t1b"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td1b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td2b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td3b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;term_node&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;&lt;b&gt;wp_term_relationships&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td5b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;nid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;object_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;tid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8b"&gt;
        &lt;p class="p2b"&gt;&lt;span class="s1b"&gt;term_taxonomy_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

  &lt;style type="text/css" scoped&gt;
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
    p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; -webkit-text-stroke: #000000}
    p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; -webkit-text-stroke: #000000; min-height: 14.0px}
    p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #7f7f7f; -webkit-text-stroke: #7f7f7f}
    span.s1 {font-kerning: none}
    table.t1 {border: none}
    td.td1 {width: 80.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 1.0px; border: none; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td2 {width: 102.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 0.0px; border-color: transparent transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td3 {width: 161.0px; height: 12.0px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td4 {width: 79.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td5 {width: 101.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td6 {width: 161.0px; height: 13.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td7 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td8 {width: 101.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td9 {width: 161.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td10 {width: 79.0px; height: 24.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td11 {width: 101.0px; height: 24.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td12 {width: 161.0px; height: 24.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td13 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td14 {width: 101.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td15 {width: 80.0px; height: 12.0px; border-style: solid; border-width: 1.0px 0.0px 1.0px 0.0px; border-color: #515151 transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td16 {width: 102.0px; height: 12.0px; border-style: solid; border-width: 1.0px 0.0px 1.0px 0.0px; border-color: #515151 transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td17 {width: 161.0px; height: 13.0px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td18 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 0.0px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td19 {width: 101.0px; height: 13.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}


    p.p1b {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
    p.p2b {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; -webkit-text-stroke: #000000}
    p.p3b {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; -webkit-text-stroke: #000000; min-height: 14.0px}
    span.s1b {font-kerning: none}
    table.t1b {border-collapse: collapse}
    td.td1b {width: 80.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 1.0px; border: none; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td2b {width: 90.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 0.0px; border-color: transparent transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td3b {width: 79.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td4b {width: 90px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td5b {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td6b {width: 90px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td7b {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td8b {width: 90px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
  &lt;/style&gt;

&lt;hr&gt;

&lt;h2&gt;Table mapping for WordPress users&lt;/h2&gt;

&lt;p&gt;This maps Drupal user export to WordPress.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" class="t1"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td1"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Drupal 6.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td2"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;WordPress 3.x&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td3"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;users&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td5"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_posts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td7"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;uid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;ID&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_login&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Format to lowercase, replace spaces with underscores&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;pass&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_pass&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_nicename&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;mail&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_email&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td9"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;created&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_registered&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Formatted from UNIX time&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td12"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td10"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;display_name&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td13"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td14"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_status&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Whitespace string&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td15"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td16"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_activation_key&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to 0&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;Table mapping for WordPress user meta values&lt;/h2&gt;

&lt;p&gt;User information like capabilities and roles in the &lt;em&gt;wp_usermeta&lt;/em&gt; table.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" class="t1"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td4"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;users&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td5"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;wp_usermeta&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td20"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;uid&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td8"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;user_id&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td13"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td14"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;meta_key&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td6"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to string e.g. 'wp_capabilities'&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top" class="td15"&gt;
        &lt;p class="p3"&gt;&lt;br&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td16"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;meta_value&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
      &lt;td valign="top" class="td11"&gt;
        &lt;p class="p2"&gt;&lt;span class="s1"&gt;Set to string e.g. 'a:1:{s:6:"author";s:1:"1";}'&lt;/span&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;More information about the settings for appropriate &lt;em&gt;meta_key&lt;/em&gt; and &lt;em&gt;meta_value&lt;/em&gt; can be found in the WordPress Codex:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/Roles_and_Capabilities"&gt;Roles and Capabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/User_Levels"&gt;User Levels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Node authors and comment authors&lt;/h2&gt;

&lt;p&gt;Drupal stores both node authors and comment authors in the &lt;em&gt;users&lt;/em&gt; table. WordPress handles things differently. Page and post authors are stored in the &lt;em&gt;wp_users&lt;/em&gt; table but comment authors are stored in &lt;em&gt;wp_comments&lt;/em&gt; together with the comment data.&lt;/p&gt;

  &lt;style type="text/css"&gt;
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
    p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; -webkit-text-stroke: #000000}
    p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; -webkit-text-stroke: #000000; min-height: 14.0px}
    span.s1 {font-kerning: none}
    table.t1 {border-collapse: collapse}
    td.td1 {width: 80.0px; height: 12.0px; border: none; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td2 {width: 120.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 1.0px 0.0px; border-color: transparent transparent #515151 transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td3 {width: 256.0px; height: 12.0px; padding: 4.0px 4.0px 4.0px 4.0px; border: none}
    td.td4 {width: 79.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #515151 #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td5 {width: 119.0px; height: 12.0px; background-color: #bfbfbf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #515151 #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td6 {width: 256.0px; height: 13.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td7 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td8 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 0.0px 1.0px; border-color: #515151 #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td9 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td10 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td11 {width: 256.0px; height: 12.0px; border-style: solid; border-width: 0.0px 0.0px 0.0px 1.0px; border-color: transparent transparent transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td12 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td13 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 0.0px 0.0px; border-color: #515151 #515151 transparent transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td14 {width: 119.0px; height: 13.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 1.0px; border-color: transparent #515151 transparent #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td15 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 0.0px 0.0px; border-color: transparent #515151 transparent transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td16 {width: 119.0px; height: 12.0px; border-style: solid; border-width: 0.0px 1.0px 1.0px 1.0px; border-color: transparent #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td17 {width: 80.0px; height: 13.0px; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td18 {width: 120.0px; height: 12.0px; border-style: solid; border-width: 1.0px 0.0px 0.0px 0.0px; border-color: #515151 transparent transparent transparent; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td19 {width: 256.0px; height: 13.0px; padding: 4.0px 4.0px 4.0px 4.0px}
    td.td20 {width: 79.0px; height: 12.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #515151 #515151 #515151 #515151; padding: 4.0px 4.0px 4.0px 4.0px}
  &lt;/style&gt;</description><category>Blog</category><category>Drupal</category><category>Migration</category><category>Scripts</category><category>SQL</category><category>WordPress</category><guid>https://anothercoffee.net/drupal-to-wordpress-migration-table-mapping/</guid><pubDate>Sat, 05 Jul 2014 02:07:29 GMT</pubDate></item></channel></rss>