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


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 …

Hit skulle Wordpress-bloggen importeras
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;
    }
}