Von Drupal nach WordPress: der Vollständigkeit halber

Es kann ja rein theoretisch mal vorkommen, dass man existierende Drupal-Inhalte nach WordPress übernehmen möchte. Gehen wir mal davon aus, dass wir einen bestimmten Inhalltstyp aus Drupal als Blog-Beiträge nach WordPress exportieren möchte. Wir bleiben beim Kochbuch, der relevante Inhaltstyp ist „rezept“. Ich hab mal im Archiv gegraben und mir die Mechanik fürs grundlegende Anlegen eines WordPress-Posts geholt:

WordPress Post anlegen

// Beitragsobjekt anlegen
    $my_post = array();
    $my_post['post_title']    = 'Mein Titel';
    $my_post['post_content']  = 'Mein Content';
    $my_post['post_status']   = 'publish';
    $my_post['post_author']   = 1;

    // Beitrag in Datenbank einfügen
    //$neue_id = wp_insert_post( $my_post );

Mehr brauchts eigentlich nicht für den Anfang, der Titel und der Inhalt reichen mal für Demozwecke (Die Kategorien kommen später dran). Jetzt suchen wir uns aus Drupal die relevanten Daten zusammen.

Relevante Tabellen in Drupal

Zum einen die node-Tabelle, aus der brauchen wir vor allem die nid, den type und den title. Der content steckt in der field_data_body im Feld body_value, verknüpft wird über die nid im Feld entity_id. Der SQL sieht so aus:

SELECT field_data_body.entity_id, field_data_body.body_value, node.nid, node.type, node.title
FROM field_data_body INNER JOIN node ON field_data_body.[entity_id] = node.[nid];

Das Ergebnis sieht erstmal so aus:

node_fields
node_fields

Wir haben hier noch articles und pages mit drin, die filtern wir mit einem where type = ‚rezept‘ weg, dann passt die Sache.

Jetzt fehlen noch die Kategorien

Dafür brauchen wir zuerstmal die Tabelle taxonomy_term_data, in der stehen die id und Namen der Kategorien drin, und die vid, das ist der Index der verwendeten Taxonomy, das ist bei mir die 2. Das ergibt bei mir eine Liste mit 28 Einträgen, von denen ich nur die tid und den Namen brauche:

tid_name
tid_name

Die importiere ich mit dem phpmyadmin in unsere WordPress-Datenbank.

Schritt 1: Anlegen der Kategorien in WordPress

Dafür setzen wir uns ein kleines Plugin auf, das zunächst nicht mehr als ein  Formular mit einem Textfeld für den Namen der zu importierenden Tabelle und einen Start-Button enthält. Der Kern des Plugins ist ganz einfach. Auf der Variablen $akt_import liegt der Name der einzulesenden Tabelle mit den Kategorienamen. Durch die steppe ich zeilenweise durch und lege mit wp_create_category() die Kategorien neu an:

global $wpdb;
    $allezeilen = $wpdb->get_results( "SELECT * from ".$akt_import."");
    
    foreach ($allezeilen as $zeile){
        
        echo $zeile->name."<br>";
        wp_create_category($zeile->name);
    }

Das Ergebnis ist wie erwartet:

kat_in_wp
kat_in_wp

28 neue Kategorien. Von denen brauchen wir jetzt die WordPress-Kategorie-IDs, die stecken jetzt in der Tabelle wp_terms:

wp_terms
wp_terms

Schritt 2: verknüpfen mit den Drupal-Daten

Die wp_terms hole ich mir jetzt zu den Drupal-Tabellen nach Access rein. Dort habe ich mir inzwischen aus der node und aus der field_data_body eine neue Tabelle gebaut, die nur die nid, den title und den body_value enthält:

nid_title_body_value
nid_title_body_value

Die wird jetzt erstmal über die nid mit der taxonomy_index und diese über die tid mit der taxonomy_term_data verknüpft:

nid_tid_verknuepfung
nid_tid_verknuepfung

Dann hole ich mir die wp_terms mit dazu und verknüpfe über den name  mit der taxonomy_term_data:

mit_wp_terms
mit_wp_terms

Damit haben wir alle Felder, die wir für den Export nach WordPress brauchen, die term_id liefert uns die richtige Kategorie:

nodes_mit_term_id
nodes_mit_term_id

Das specken wir noch ein wenig ab und basteln uns eine saubere Export-Tabelle. Die enthält zunächst nochmal jeden Datensatz so oft, wie er Kategorien zugeordnet hat. Da ich in Drupal nur zwei Kategorien pro Datensatz hatte, taucht hier also jedes Rezept zweimal auf. Darauf setze ich eine Abfrage mit Gruppierung und nehme von der term_id einmal den letzten Wert und einmal den ersten Wert:

ersterwert_letzterwert
ersterwert_letzterwert

So, das wars. Diese Abfrage exportieren wir uns als CSV und holen sie uns in unsere WordPress-Datenbank rein. Für den tatsächlichen Import gibts aber einen neuen Beitrag.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert