Ich liebe WordPress.

Aber die Datenbank-Struktur von WordPress, die hasse ich. Die ist soooo weit von relational entfernt, das ist unglaublich.  Da kriegen Datenbank-Profis schon Kopfweh wenn sie sich nur auf 100 Schritte nähern.

Heute wollt ich z.B. User aus einer WordPress-Installation in eine andere Übernehmen.  Schaut auf den ersten blick ganz einfach aus: Inhalt der Tabelle wp_user kopieren in die Datenbank des anderen WordPress. Dort ist der “table_prefix” anders eingestellt, drum heisst die Tabelle dort wp_kids_users.

Auf den zweiten Blick seh ich: ich muss auch wp_usermeta kopieren auf wp_kids_usermeta.

Und dann kommt das dicke Ende: Mit der Fehlermeldung “You do not have sufficient permissions to access this page” bzw. “Ihre Zugriffsrechte reichen nicht aus, um diese Seite zu anzuzeigen.” verweigert das WordPress-Backend den Zugriff.

Der Grund: In der Tabelle wp_kids_usermeta wird der Tabellen-Prefix auch verwendet:

Nach Schlüssel sortieren:

umeta_id user_id meta_key meta_value
1 1 nickname bjelli
2 1 rich_editing true
3 1 wp_kids_capabilities a:1:{s:13:”administrator”;b:1;}
4 1 wp_kids_user_level 10
5 1 first_name Brigitte
6 1 last_name Jellinek

D.h. bei Veränderung des Tabellennamens muss auch der Inhalt der Tabelle verändert werden, damit WordPress weiterhin funktioniert:

UPDATE {$newprefix}usermeta SET meta_key = “{$newprefix}capabilities” WHERE meta_key = “{$oldprefix}capabilities”;
UPDATE {$newprefix}usermeta SET meta_key = “{$newprefix}user_level” WHERE meta_key = “{$oldprefix}user_level”;

Liebe Leute: nehmt Euch Wiordpress nicht als Vorbild für Datenbank-Design, macht das nicht nach. Schön ist anders.