wordpress | Bilder mit individuellem Upload-Datum importieren

Bei der Migration eines alten Blogs in die neue Multisite-Installation bin ich auf massive Probleme mit den Media-Elementen gestossen. Da die Anzahl der Beiträge nicht so groß ist, mir der Blog aber ob des Inhalts wichtig ist, habe ich mich dazu entschlossen die Media-Elemente neu in die Artikel einzubinden. Leider wurden beim automatischen Import nicht alle Media-Elemente übernommen, so dass ich mich entschieden habe alle Meldia-Elemente neu zu importieren. Der Authenzität willen wollte ich aber, dass die URL der Media-Elemente wie auch das im WordPress-Backend angezeigte Upload-Datum dem originalen entspricht. Leider gibt es genau diese Funktion im WordPress aber nicht, so dass ich mir selber ein Skript basteln musste.Da ich mir vorstellen kann, dass jemand, wenn auch nicht aus dem gleichen Grund wie ich, Media-Elemente mit dem Erstellungsdatum in der WordPress-Mediathek ablegen möchte, habe ich mich dazu entschlossen das Skript öffentlich zu machen.

Gleich vorne weg geschickt: Ich bin kein Skript-Guru – programmiertechnisch eher komplett unbegabt. Ich kann aber lesen und in tagelangen Selbstversuchen mich an eine Lösung herantasten. Das habe ich auch hier gemacht. Es ist also sehr wahrscheinlich, dass jemand eine viel bessere, elegantere Lösung für das Problem kennt: Ich wäre da sehr dankbar über einen Kommentar. Letztendlich zählt für mich erstmal das Ergebnis und es funktioniert :).

Das Skript

#!/bin/bash
# Skript zum Importieren von Medien-Dateien und anschliessender Korrektur
# des Upload-Datums auf das Dateierstellungsdatum
# erstellt von: Michael Köhler (mk@controlc.de)

# Anzupassende Variablen
SRCPATH=$1
SRCEXT=.jpg
WPPATH="/var/www/wordpress"
WPURL="BLOGURL"
DBUSER=wordpress
DBPWD=PaSSw0rd
DBNAME=wordpressuser
TBLNAME=wp_x_posts
#-----------------------
SRCFILES=($SRCPATH/*$SRCEXT)

for FILE in "${SRCFILES[@]}"; do
FMD=$(exiftool -FilemodifyDate -d "%Y-%m-%d %H:%M:%S" -S -s $FILE)
ATTID=$(/usr/local/bin/wp-cli.phar media import "$FILE" --title="$(basename $FILE $SRCEXT)" --porcelain --path=$WPPATH --url=$WPURL --allow-root)
mysql -u$DBUSER -p$DBPWD $DBNAME < < EOF
UPDATE $TBLNAME SET post_date='$FMD' where ID='$ATTID';
UPDATE $TBLNAME SET post_date_gmt='$(date --date "$FMD GMT" +"%Y-%m-%d %H:%M:%S")' where ID='$ATTID';
EOF
done

Damit das Skript funktioniert müssen folgende Tools installiert sein:

  • exiftool – Ein Tool zum Auslesen diverser Daten aus einer Medien-Datei
  • wp-cli Ein Toolsammlung zum Manipulieren einer lokalen WordPress-Installation von der Kommandozeile aus

Was genau macht das Skript?

Der Pfad zu den Bildern wird dem Skript als Parameter übergeben. In dem Pfad wird jede Mediendatei, welches die Dateiendung .jpg hat, zuerst von exiftool ausgelesen und der Dateierstellungszeitpunkt aus dem Tag „FileModifyDate“ wird in eine Variable gespeichert. Anschließend wird mit wp-cli die entsprechende Mediendatei in WordPress importiert und die Attachment-ID wird ebenfalls in eine Variable gespeichert. Zum Schluss wird in der Datenbank der Eintrag mit der gespeicherten Attachment-ID mit dem neuen Upload-Datum versehen.

Was muss ich anpassen, damit das Skript bei mir auch funktioniert?!

Am Anfang der Skriptes werden diverse Variablen definiert, welche an die eigene Umgebung angepaßt werden müssen:

SRCPATH

Der Quellpfad der Mediendateien, welche importiert werden sollen. DIesen Pfad kann man entweder hier angeben oder beim Aufruf des Skriptes (wenn der Eintrag $1 lautet) mit übergeben.

SRCEXT

Möchte man nur bestimmte Dateiendungen aus dem Quellpfad importieren, dann kann man die hier anpassen. Das Format lautet „.DATEIENDUNG“

WPPATH

Der Pfad zur WordPress-Installation auf dem Server.

WPURL

Wichtig für die Multisite-Installation: wie lautet die Blog-URL, in die man die Medien-Elemente importieren möchte.

DBUSER

Datenbanknutzer der WordPress-Datenbank. Kann man aus der wp-config.php auslesen.

DBPWD

Passwort des Datenbanknutzers der WordPress-Datenbank. Kann man aus der wp-config.php auslesen.

DBNAME

Name der WordPress-Datenbank. Kann man aus der wp-config.php auslesen.

TBLNAME

Tabellen-Name der Tabelle, in der alle Medien-Elemente eingetragen werden. Bei einer Singlesite-Installation lautet dieser wp_posts, bei einer Multisite-Installation muss die Site-OD noch eingefügt werden: Der Syntax wäre dann wp_X_posts, wobei das X durch die Site-ID ersetzt werden muss.

Resume

Ich war erstaunt, dass es doch recht flott ging das Skript zu schreiben und das es sogar funktioniert. Es ist bei weitem nicht perfekt und eine Behandlung von Fehlern findet gar nicht statt, aber wer die einzelnen Befehle versteht (und die sind m.E. nicht so schwierig), der kann bei Bedarf das Skript anpassen und somit Fehler umgehen. Über einen Kommentar wäre ich auch dann sehr dankbar.

Schreibe einen Kommentar

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