
Hade 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 :D 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("´", "´");
CorrectString = CorrectString.Replace(";drop", "---");
CorrectString = CorrectString.Replace(";truncate", "---");
CorrectString = CorrectString.Replace("
", "<br />");
CorrectString = CorrectString.Replace("<script", "<script>");
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;
}
}