Beim letzten WP Meetup Potsdam, einem gemütlich Treffen bei Essen, Trinken und netten Gesprächen, hat eine neue Teilnehmende eine einfach klingende Frage gestellt, zu der wir aber verschiedene Antworten hatten:
Wie kann ich alle Bilder von einer WordPress Seite zu einer andere migrieren?
Verschiedene Teilnehmende kamen auf verschiedene Lösungen. Hier sind die, über die wir diskutiert haben.
Migration der Bilder mit FTP
Viele, die mit Website arbeiten, verwenden auch FTP zum Upload/Download von Dateien zu einem Server. Wieso also nicht einfach alle Bilder von der Ursprungsseite herunterladen und in den wp-content/uploads
Ordner der neuen Seite hochladen.
Alle, die wissen, wie WordPress mit Anhängen (Bildern und anderen Dateien) umgeht, wird vermutlich wissen, dass, dass die Datei alleine nicht ausreicht. Es muss auch ein Eintrag in der Datenbank vorhanden sein. Ansonsten kann man die Bilder zwar per Direktlink auf deren URL verwenden, aber sie werden nicht in der Mediathek angezeigt.
Importieren der Bilder aus einem Ordner mit einem Plugin
Um die Bilder in die Mediathek zu importieren, könnte man Plugins wie Add From Server verwenden, das einige vielleicht kennen. Es wurde aber seit 3 Jahren nicht mehr aktualisiert. Es mag noch funktionieren, aber in der Plugin-Beschreibung wird auch erwähnt, dass es nicht wirklich für Migrationen gedacht ist. Ich habe Media Sync als eine aktuellere Alternative gefunden, aber ich habe dieses Plugin selbst noch nie getestet.
Importieren der Medien-Dateien mit der WP-CLI
Ihr könnt auch die WP-CLI zum Import von Medien-Dateien aus einem Ordner verwenden. Hier mal ein Beispiel zum Import von Dateien einer anderen WordPress-Installation in einer andere auf dem gleichen Server:
$ wp media import ../source/wp-content/uploads/**\/**\/*.jpg
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-1024x683.jpg' as attachment ID 6.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-150x150.jpg' as attachment ID 7.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-1536x1024.jpg' as attachment ID 8.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-2048x1365.jpg' as attachment ID 9.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-300x200.jpg' as attachment ID 10.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-768x512.jpg' as attachment ID 11.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391.jpg' as attachment ID 12.
Imported file '../source/wp-content/uploads/2023/08/28164a88367399c18.97744391-scaled.jpg' as attachment ID 13.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-1024x683.jpg' as attachment ID 14.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-150x150.jpg' as attachment ID 15.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-1536x1024.jpg' as attachment ID 16.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-2048x1365.jpg' as attachment ID 17.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-300x200.jpg' as attachment ID 18.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-768x512.jpg' as attachment ID 19.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317.jpg' as attachment ID 20.
Imported file '../source/wp-content/uploads/2023/08/41864a882e698f3d6.67081317-scaled.jpg' as attachment ID 21.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-1024x683.jpg' as attachment ID 22.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-150x150.jpg' as attachment ID 23.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-1536x1024.jpg' as attachment ID 24.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-2048x1365.jpg' as attachment ID 25.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-300x200.jpg' as attachment ID 26.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-768x512.jpg' as attachment ID 27.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907.jpg' as attachment ID 28.
Imported file '../source/wp-content/uploads/2023/08/75364a8821590f529.41962907-scaled.jpg' as attachment ID 29.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-1024x683.jpg' as attachment ID 30.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-150x150.jpg' as attachment ID 31.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-1536x1024.jpg' as attachment ID 32.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-2048x1365.jpg' as attachment ID 33.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-300x200.jpg' as attachment ID 34.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-768x512.jpg' as attachment ID 35.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704.jpg' as attachment ID 36.
Imported file '../source/wp-content/uploads/2023/08/89264a87feebb12a4.11887704-scaled.jpg' as attachment ID 37.
Success: Imported 32 of 32 items.
In diesem Beispiel werden alle *.jpg
Bilder aus den Monats-Unterordnern importiert. Ihr könnt hier aber bereits ein großes Problem erkennen. Da WordPress viele unterschiedliche Größen für ein Originalbild erstellt, würdet ihr hiermit alle davon als separate Medien-Datei in die Mediathek importieren. Ihr müsstet also vor dem Import alle per FTP kopierten Dateien manuell löschen. Wenn ihr große Mengen migriert, kann das recht zeitaufwändig und fehleranfällig sein. Aber wie können wir es sonst lösen? Es gibt andere (Premium-)Plugins, die besser funktionieren, aber es gibt auch einen einfacheren und kostenlosen Weg.
Migration der Mediathek mit dem WordPress Export/Import
Bei jeder WordPress-Installation gibt es einen Standard-Export-Mechanismus. Diesen findet ihr unter „Werkzeuge > Export“ in eurem Dashboard. Hier könnt ihr auswählen, welchen Inhaltstyp ihr exportieren wollt und ihr könnt ihn auch noch nach einem Datumsbereich filtern.
Exportieren der Medien-Dateien
Wir wollen nur Median-Dateien exportieren und wählen keinen Datumsbereich aus, um alle auf einem zu exportieren:
Nach dem Klick auf „Export-Datei herunterladen“ bittet euch der Browser, eine XML-Datei zu speichern. Diese kann dann auf der Zielseite zum Import der Dateien verwendet werden. Das Export-Werkzeug exportiert also nicht alle Bilder (oder andere Dateitypen), sondern es exportiert nur die Information, wo diese zu finden sind.
Importieren der Medien-Dateien
Jetzt meldet ihr euch im Dashboard der Zielseite an. Dort navigiert ihr dann zu „Werkzeuge > Daten importieren“. Ganz am Ende findet ihr den „WordPress“ Importer. Diese ist nicht standardmäßig installiert, aber ihr könnt ihn über den Link einfach direkt installieren:
Das installiert und aktiviert das Plugin direkt. Der Link ändert sich dann zu „Importer ausführen“. Er führt euch dann zu einer Seite mit einem Dateiupload. Dort wählt ihr die zuvor heruntergeladene XML-Datei aus und klickt auf „Datei hochladen und importieren“. Anschließend solltet ihr eine Seite wie diese sehen:
Auf dieser Seite werden alle Autoren der Ursprungsseite angezeigt und ihr habt die Möglichkeit diese entweder zu einem neuen Benutzer zu importieren, oder aber einem bestehenden Benutzer zuzuordnen.
Der wichtigste Teil dieser Seite ist aber die Checkbox „Dateianhänge herunterladen und importieren“, die ihr aktivieren müsst. Nach einem Klick auf „Senden“ startet der Import. Abhängig von der Anzahl an Dateien kann das eine Weile dauern.
Möglichet Skript-Timeout
Da dieser Prozess alle Dateien per HTTP von der Urspungsseite lädt (und dabei auch die anderen Bildgrößen erstellt), kann es vorkommen, dass die Abfrage mit einem Timeout abbricht. Ihr könnt dann entweder die gleiche XML-Datei erneut importieren (bereits existierende Inhalte werden übersprungen), oder aber ihr teilt die Datei beim Export in mehrere XML-Dateien auf, indem ihr die Datums-Filter verwendet, um Dateien zu erstellen, die klein genug sein.
Fazit
Es gibt viele Wege, um Medien-Dateien von einer Seite zu einer anderen zu migrieren. Obwohl ich sehr gerne die WP-CLI für so etwas verwende, hat der WordPress Export/Import doch einige Vorteile. Alles, was ihr dafür braucht, ist die Möglichkeit Plugins zu installieren. Ihr benötigt also keinen FTP- oder SSH-Zugang, um die WP-CLI zu installieren und auszuführen (wozu ihr vielleicht keine Berechtigung habt). Man kann dabei dann auch die Medien-Dateien filtern. Und wenn man weiß, wie man eine XML-Datei bearbeitet, kann man noch besser anpassen, was importiert wird.