Artikel-Migration von CMS nach WordPress – Teil 4

Zum Anfang der Serie Artikel-Migration von CMS nach WordPress – Teil 1

Schritt 9: Die Migration der Artikel nach WordPress
Nach soviel Vorarbeit und Analyse wird es endlich spannend. Wir haben für die Migration ein Programm in C# .NET geschrieben. Denkbar wäre auch, die Migration per PHP umzusetzen. In unserem Beispiel haben wir zwei Datenbanken („db_alt“ und „db_neu“). In der „db_alt“ ist lediglich die Tabelle „artikel“ vorhanden. In dieser Tabelle sind alle Artikel des Altsystems gespeichert. In der Datenbank „db_neu“ wurden per Export alle Tabellen der WordPress-Installation eingespielt. So haben wir die Möglichkeit, die Migration mehrfach durchzuführen, da wir die Datenbank „db_neu“ bedenkenlos neu aufsetzen können. Von Migrationen auf Echtsystemen ohne Backup ist abzuraten.

using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using System.IO;
using System.Collections;

namespace WP_import
{
 class Program
 {
 public static string connALT = "data source=127.0.0.1;DATABASE=db_alt;UID=root;PASSWORD=xxx;";
 public static string connNEU = "data source=127.0.0.1;DATABASE=db_neu;UID=root;PASSWORD=xxx;";
 public static ArrayList list = new ArrayList();

 public static string sRubrikid="-1";
 public static string pic="";

 static void Main(string[] args)
 {
 Console.WriteLine("START");

 GetData();

 Console.WriteLine("ENDE");
 Console.ReadLine();
 }

 private static string GetmyDate(string sTimestamp)
 {
 string sRes = "";
 try
 {
 sRes = sTimestamp;
 sRes = sTimestamp.Substring(6, 4) + "-" + sTimestamp.Substring(3, 2) + "-" + sTimestamp.Substring(0, 2) + sTimestamp.Substring(10);

 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.Message);
 }
 return sRes;
 }

 private static void GetData()
 {
 try
 {
 //Lies hier einmal alles aus der alten Artikel-Tabelle ein
 string sSQL = "SELECT modelleid,timestamp,titel,perm,beschreibung, text FROM artikel where status=1";
 MySqlDataReader rdr = null;
 MySqlConnection cn = new MySqlConnection(connALT);
 cn.Open();
 MySqlCommand cmd2 = new MySqlCommand(sSQL, cn);
 rdr = cmd2.ExecuteReader();
 while (rdr.Read())
 {
 list.Clear();

 string sDate = "";
 try
 {
 //Mach ein Date aus dem Timestamp
 string s = rdr["timestamp"].ToString();
 sDate = GetmyDate(s);
 }
 catch {
 sDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
 }

 //Benötigte Felder in WordPress
 //    post_author: ID des Autors (1)
 list.Add("1");

 //    post_date: DateTime
 list.Add(sDate);

 //    post_date_gmt: DateTime
 list.Add(sDate);

 //    post_content: Text
 list.Add(Umsetzung(rdr["beschreibung"].ToString()) + "<br>" + Umsetzung(rdr["text"].ToString()));

 //    post_title: Überschrift
 list.Add(Umsetzung(rdr["titel"].ToString()));

 //    post_excerpt=''
 list.Add("");

 //    post_status=publish
 list.Add("publish");

 //    comment_status=closed
 list.Add("closed");

 //    ping_status=closed
 list.Add("closed");

 //    post_password=''
 list.Add("");

 //    post_name='name-des-titels-like-seo'
 string sBuffer = rdr["perm"].ToString();
 sBuffer = sBuffer.Replace("_", "-");
 list.Add(sBuffer); 

 //to_ping=''
 list.Add("");

 //pinged=''
 list.Add("");

 //    post_modified: DateTime
 list.Add(sDate);

 //    post_modified_gmt: DateTime
 list.Add(sDate);

 //    post_content_filtered=''
 list.Add("");

 //    post_parent=0
 list.Add("0");

 //Guid='http://www.domain.de/?p=' + ID (eigen)
 list.Add("http://www.domain.de/?p=");

 //    menu_order=0
 list.Add("0");

 //post_type='post'
 list.Add("post");

 //post_mime_type=''
 list.Add("");

 //comment_count=''
 list.Add("0");

 //Rubrikid umschlüsseln
 switch (rdr["modelleid"].ToString())
 {
 case "1": sRubrikid = "4"; break;
 case "2": sRubrikid = "5"; break;
 case "3": sRubrikid = "6"; break;
 case "4": sRubrikid = "7"; break;
 case "5": sRubrikid = "8"; break;
 }

 Console.WriteLine("Lege Artikel an ...");
 LegeArtikelan();

 }
 rdr.Close();
 cn.Close();

 }
 catch (MySqlException ex)
 {
 Console.WriteLine(ex.Message);
 }
 }

 //Benötigte Felder in WordPress
 //    post_author: ID des Autors (1)
 //    post_date: DateTime
 //    post_date_gmt: DateTime
 //    post_content: Text
 //    post_title: Überschrift
 //    post_excerpt=''
 //    post_status=publish
 //    comment_status=closed
 //    ping_status=closed
 //    post_password=''
 //    post_name='name-des-titels-like-seo'
 //to_ping=''
 //pinged=''
 //    post_modified: DateTime
 //    post_modified_gmt: DateTime
 //    post_content_filtered=''
 //    post_parent=0
 //    Guid='http://www.domain.de/?p=' + ID (eigen)
 //    menu_order=0
 //post_type='post'
 //post_mime_type=''
 //comment_count=''

 private static string Umsetzung(string sText)
 {
 //Schlüssel die gängigsten HTML-Sonderzeichen wieder um
 sText = sText.Replace("&amp;", "&");

 sText = sText.Replace("&auml;", "ä");
 sText = sText.Replace("&Auml;", "Ä");
 sText = sText.Replace("&ouml;", "ö");
 sText = sText.Replace("&Ouml;", "Ö");
 sText = sText.Replace("&uuml;", "ü");
 sText = sText.Replace("&Uuml;", "Ü");
 sText = sText.Replace("&szlig;", "ß");
 sText = sText.Replace("&lt;", "<");
 sText = sText.Replace("&gt;", ">");
 sText = sText.Replace("&quot;", """);
 sText = sText.Replace("&nbsp;", " ");

 return sText;
 }

 private static void LegeArtikelan()
 {
 string sSQL = "";
 try
 {

 sSQL = "INSERT into wp_posts (post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status," +
 "comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified,post_modified_gmt,post_content_filtered,"+
 "post_parent,guid,menu_order,post_type,post_mime_type,comment_count) VALUES (";

 int i = 0;
 foreach (string sValue in list)
 {
 sSQL +="'"+sValue+"'";
 i++;
 if (i < list.Count) sSQL += ",";

 }
 sSQL+=")";

 //    post_author: ID des Autors (1)
 //    post_date: DateTime
 //    post_date_gmt: DateTime
 //    post_content: Text
 //    post_title: Überschrift
 //    post_excerpt=''
 //    post_status=publish
 //    comment_status=closed
 //    ping_status=closed
 //    post_password=''
 //    post_name='name-des-titels-like-seo'
 //to_ping=''
 //pinged=''
 //    post_modified: DateTime
 //    post_modified_gmt: DateTime
 //    post_content_filtered=''
 //    post_parent=0
 //Guid='http://www.domain.de/?p=' + ID (eigen)
 //    menu_order=0
 //post_type='post'
 //post_mime_type=''
 //comment_count=''              

 MySqlConnection cn = new MySqlConnection(connNEU);
 cn.Open();
 MySqlCommand cmd = new MySqlCommand(sSQL, cn);
 cmd.ExecuteNonQuery();
 //cn.Close();

 //ID des Artikels ermitteln
 sSQL = "SELECT @@IDENTITY AS 'LastID'";
 MySqlCommand dbcSelect = new MySqlCommand(sSQL, cn);
 MySqlDataReader dbrSelect = dbcSelect.ExecuteReader();
 dbrSelect.Read();
 int iLastID = Int32.Parse(dbrSelect.GetValue(0).ToString());
 dbrSelect.Dispose();

 //Mach jetzt ein Update auf den eben eingefügten DS (Um die guid zu aktualisieren)
 sSQL = "UPDATE wp_posts SET guid = concat(`guid`,"+iLastID.ToString()+") WHERE ID=" + iLastID.ToString();
 MySqlCommand cmd2 = new MySqlCommand(sSQL, cn);
 cmd2.ExecuteNonQuery();

 //Lege nun die Rubrik zu diesem Artikel an
 sSQL = "INSERT into wp_term_relationships (object_id, term_taxonomy_id, term_order) VALUES ("+
 iLastID.ToString()+"," + sRubrikid + ",0)";
 MySqlCommand cmd3 = new MySqlCommand(sSQL, cn);
 cmd3.ExecuteNonQuery();

 //Hier könnten noch Meta-Daten gespeichert werden: wp_postmeta
 sSQL = "INSERT into wp_postmeta (post_id, meta_key, meta_value) VALUES ("+
 iLastID.ToString() + ",'Meta-Name','Meta_value')";
 MySqlCommand cmd4 = new MySqlCommand(sSQL, cn);
 cmd4.ExecuteNonQuery();

 cn.Close();

 }
 catch (MySqlException ex)
 {
 Console.WriteLine(ex.Message);
 }      
 }

 }
}

Schreibe einen Kommentar