Zurzeit experimentiere ich mit diverser anderer Blogging Software. Wordpress ist für mich nicht mehr das, was es einmal war. Schreiben macht nicht mehr so viel Laune und gefühlt wird Wordpress mit jedem Update etwas mehr aufgebläht. Aus diesem Grund suche ich aktuell eine andere Blogging Software. Da der Inhalt im Vordergrund steht und ich meinen veröffentlichten Artikel mitnehmen möchte, werde ich diese natürlich importieren.

Veröffentlichte Wordpress Artikel zu exportieren ist generell kein Problem. Diverse eingebaute Funktionen ermöglichen einem die Inhalte mitzunehmen. Dennoch möchte ich nur die Inhalte exportieren, die die neue Blogging Software auch verarbeiten kann. Im Grunde sind das die Überschrift, der Artikel Inhalt, die URL, das Datum, die Tags und die Kategorie. Der Export via MySQL ist der einfachste und schnellste Weg. Mit dem Ergebnis aus der Datenbank und ein, zwei kleinen Scripts lässt sich hinterher alles mögliche anstellen.

Zum Auslesen aller veröffentlichter Artikel reicht im wesentlich folgende MySQL Query:

SELECT * FROM posts WHERE post_status = 'publish' ORDER BY post_modified DESC;

Ergebnis der Abfrage:

[caption id="attachment_77941" align="aligncenter" width="1544"]Wordpress Abfrage im Rohformat Wordpress Abfrage im Rohformat[/caption]

Das Ergebnis ist schon vielversprechend. Dennoch muss noch eine weitere WHERE Bedingung hinzugefügt werden. In der Spalte post_type steht der Artikel Typ. Wer die Datenstruktur von Wordpress kennt, der weiß das die Datenbank nicht optimal ist.

In der Tabelle posts werden jegliche Inhalte abgelegt, die man in Wordpress erstellen kann. Teilweise zählen auch Menü Einträge, Plugin Konfigurationen und Theme Inhalte (Portfolio, Team, etc.) zu diesen.

Mit der zweiten MySQL Abfrage erhalten wir alle veröffentlichten Artikel vom Typ 'post' und damit letztendlich die gleiche Anzahl Artikel, was auch im Wordpress Dashboard (Block: Auf einen Blick) ausgeben wird:

SELECT * FROM posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_modified DESC;

Kategorie und Tags mit auslesen

Was jetzt noch fehlt sind die Kategorie und die Tags. Ab hier müssen weitere Datenbanktabellen abgefragt werden. Da das Ergebnis per LEFT JOIN verfälscht wird, werden die Kategorie und Tags per Subquery abgefragt und das Ergebnis Kommasepariert zurückgegeben.

Die MySQL Query zur Abfrage aller veröffentlichen Artikel vom Typ 'post' mit Kategorie und Tags sieht am Ende so aus:

SELECT
  wp_posts.id,
  wp_posts.post_date,
  wp_posts.post_content,
  wp_posts.post_title,
  wp_posts.post_name AS permalink,
  (
    SELECT group_concat(wp_terms.name SEPARATOR ', ')
    FROM wp_terms
    INNER JOIN wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id
    INNER JOIN wp_term_relationships wpr ON wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    WHERE taxonomy = 'category' AND wp_posts.ID = wpr.object_id
  ) AS category,
  (
    SELECT group_concat(wp_terms.name SEPARATOR ', ')
    FROM wp_terms
    INNER JOIN wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id
    INNER JOIN wp_term_relationships wpr ON wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    WHERE taxonomy = 'post_tag' AND wp_posts.ID = wpr.object_id 
  ) AS tags
FROM
  wp_posts
WHERE
  wp_posts.post_type = 'post'
  AND wp_posts.post_status = 'publish'
ORDER BY post_date ASC
/* Quelle: https://stackoverflow.com/a/13265356/2310353 */

Das Ergebnis lässt sich sehen:

[caption id="attachment_77936" align="aligncenter" width="1544"]Artikel Export via MySQL Artikel Export via MySQL[/caption]

Mit dieser MySQL Abfrage kann ich letztendlich einen Importer für andere Blogging Software oder Content Management Systeme schreiben, die einem den Umzug vereinfachen.