Exportera blogginlägg och kommentarer från WordPress Multi-User

Hit skulle WordPress-bloggen importerasHade en blogg tidigare på Loopias installation av WordPress Multi-User som jag tänkte få in i ett egenknackat verktyg (se bild) för bloggande. En av de goda anledningarna var att Loopias WordPress-installation inte direkt stödjer mycket i stil med att använda egna mallar och saknar all form av kontroll. Detta tänkte jag råda bot på.

Först kontaktade jag Loopias support, support@loopia.se, och bad dem skicka över en backup av databasen och uppladdade filer. Först fick jag rätt databas, men någon annans märkliga och lite väl privata bilder 😀
När väl rätt filer dök upp efter många turer om huruvida jag kunde åstadkomma en backup själv så gjorde jag följande:

  • Körde in SQL-exporten till en lokal installation av MySQL. Här nöjde jag mig med blogginläggen och dess kommentarer.
  • Skickade ihop ett C#-skript, se nedan, för att kunna importera materialet in i en annan databas.

Tänkte att jag säkert inte är ensam om att gå ifrån WordPress Multi-User, oavsett om det är hos Loopia eller annan leverantör, och lägger därmed upp koden här.

Det du behöver är en anslutningssträng i din web.config med nyckeln DSN då den pekas ut i koden. Du som är van med SQL ser att bloggposterna från WordPress ligger importerade i en tabell som heter wp_1156_posts och kommentarerna i tabellen wp_1156_comments.

Inget märkvärdigt med detta skriptet egentligen – men det fungerade för mig. Har du kommentarer så är jag så klart idel öra.

wp-export.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="wp-export.aspx.cs" Inherits="testsajt.wp_export" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
		<h1>Outar bloggen</h1>    
		<div id="divOutput" runat="server" />
</body>
</html>

wp-export.aspx.cs

using System;
using System.Data;
using System.Data.Odbc;
using System.Configuration;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace testsajt {
	public partial class wp_export : System.Web.UI.Page {
		#region "Page_Load"
		protected void Page_Load(object sender, EventArgs e) {
			OdbcConnection conn = new OdbcConnection(ConfigurationManager.AppSettings["DSN"]);
			OdbcCommand comm = new OdbcCommand("SELECT post_date,post_content,post_title,ID FROM wp_1156_posts ORDER BY post_date DESC", conn);
			OdbcDataReader RS;
			conn.Open();
			RS = comm.ExecuteReader();
			comm.Dispose();

			StringBuilder sb = new StringBuilder();

			while (RS.Read()) {
				#region "Kör SQL-frågorna för posterna"
				executeSQL("INSERT INTO tblSIDOR(Namn,SidTitel,MetaDataNyckelord,Text,DatumTid,Skapare) VALUES(´" + uInputSecure(RS.GetValue(2).ToString()) + "´,´" + uInputSecure(RS.GetValue(2).ToString()) + "´,´Nyckelord´,2,´" + uInputSecure(RS.GetValue(1).ToString()) + "´,´" + RS.GetValue(0).ToString() + "´,´Statiskt namn´)");
				string nyttID = fetchSQL("SELECT ID FROM tblSIDOR ORDER BY ID DESC LIMIT 0,1");

				//lägger till kommentarerna till posten
				hamtaKommentarer(RS.GetValue(3).ToString(), nyttID);
				#endregion
			}
			conn.Close();
			conn.Dispose();
			RS.Close();
			RS.Dispose();

			divOutput.InnerHtml = sb.ToString();
		}
		#endregion

		#region "hämtar kommentarerna från WP-tabellen
		protected string hamtaKommentarer(string postensID, string postensNyaID) {
			#region "Kör SQL-frågorna för kommentarerna"
			StringBuilder sb = new StringBuilder();
			OdbcConnection conn = new OdbcConnection(ConfigurationManager.AppSettings["DSN"]);
			OdbcCommand comm = new OdbcCommand("SELECT comment_author,comment_author_email,comment_author_url,comment_date,comment_content FROM wp_1156_comments WHERE comment_post_id=" + postensID + " ORDER BY comment_ID DESC", conn);
			OdbcDataReader RS;
			conn.Open();
			RS = comm.ExecuteReader();
			comm.Dispose();

			while (RS.Read()) {
				executeSQL("INSERT INTO tblKOMMENTARER(Namn,Kommentar,URL,Epost,DatumTid,FörälderSida) VALUES(´" + uInputSecure(RS.GetValue(0).ToString()) + "´,´" + uInputSecure(RS.GetValue(4).ToString()) + "´,´" + uInputSecure(RS.GetValue(2).ToString()) + "´,´" + uInputSecure(RS.GetValue(1).ToString()) + "´,´" + RS.GetValue(3).ToString() + "´,´b" + postensNyaID + "´)");
			}
			conn.Close();
			conn.Dispose();
			RS.Close();
			RS.Dispose();

			return "";
			#endregion
		}
		#endregion

		#region "Hjälpfunktioner för databasfrågorna"
		public static string executeSQL(String strIncOdbc) {
			string strCon = System.Configuration.ConfigurationManager.AppSettings["DSN"];
			string strOdbc = strIncOdbc;
			OdbcConnection conn = new OdbcConnection(strCon);
			OdbcCommand comm = new OdbcCommand(strOdbc, conn);
			conn.Open();
			comm.ExecuteNonQuery();
			comm.Dispose();
			conn.Close();
			conn.Dispose();
			return "";
		}

		//hämtar simpla värden till rubriker m.m. för att man inte ska behöva koda dem på varje sida
		public static string fetchSQL(String strIncOdbc) {
			string strCon = System.Configuration.ConfigurationManager.AppSettings["DSN"];
			string strTEMP = string.Empty;
			OdbcConnection conn = new OdbcConnection(strCon);
			OdbcCommand comm = new OdbcCommand(strIncOdbc, conn);
			OdbcDataReader RS;
			conn.Open();
			RS = comm.ExecuteReader();
			comm.Dispose();

			while (RS.Read()) {
				strTEMP += Convert.ToString(RS.GetValue(0));
			}
			RS.Close();
			RS.Dispose();
			conn.Close();
			conn.Dispose();
			return strTEMP;
		}

		public static string uInputSecure(string strString) {
			string MainString = strString;
			if (MainString != null) {
				string CorrectString = MainString.Replace("´", "&acute;");
				CorrectString = CorrectString.Replace(";drop", "---");
				CorrectString = CorrectString.Replace(";truncate", "---");
				CorrectString = CorrectString.Replace("
", "<br />");
				CorrectString = CorrectString.Replace("<script", "&lt;script&gt;");
				return CorrectString;
			}
			else {
				string strNull = "";
				return strNull;
			}
		}
		#endregion
	}
}

wp-export.aspx.designer.cs

//------------------------------------------------------------------------------
// 
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3053
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// 
//------------------------------------------------------------------------------

namespace testsajt {
    public partial class wp_export {
        /// 
        /// divOutput control.
        /// 
        /// 
        /// Auto-generated field.
        /// To modify move field declaration from designer file to code-behind file.
        /// 
        protected global::System.Web.UI.HtmlControls.HtmlGenericControl divOutput;
    }
}

Eller så laddar du ner filerna här »