WP CLI: Backup & Import in einem Befehl

Wer an seiner Website herumbasteln möchte, sollte das am besten in einer lokalen Entwicklungsumgebung machen und nicht auf dem Live-Server. Das gilt auch für WordPress!

Am besten funktioniert das, indem man eine Kopie der echten Website erstellt. Entscheidend ist hier vor allem die Datenbank. Legt man davon lokal eine Kopie an, hat man direkt den passenden Content an dem man z.B. das neue Theme ausprobieren kann.

Datenbank

Dafür kann man ganz bequem die WP CLI nutzen. Voraussetzung dafür ist, dass ihr SSH-Zugriff auf euren Live-Server habt und die WP CLI in beiden Umgebungen installiert habt.

Anschließend könnt ihr aus dem Verzeichnis eurer lokalen Entwicklungsumgebung einfach ein Backup eurer Live-Datenbank erstellen und lokal importieren:

wp db export - --ssh=wordpress_user@11.22.13.14:22/path/zu/eurer/wordpress/installation | wp db import -
Code-Sprache: Bash (bash)

In dem Befehl müsst ihr euren SSH-Benutzernamen wordpress_user , IP-Adresse 11.22.13.14, ggf. Port 22 eures Server und den Pfad zur WordPress-Installation /path/zu/eurer/wordpress/ ersetzten.

So funktioniert der Befehl:

  1. wp db export - Auf eurem Server wird wp db export ausgeführt. Statt einem Dateinamen geben wir ein - an, was dazu führt, dass der Export nicht in eine Datei geschrieben wird, sondern als STDOUT (Standard Output) ausgegeben wird.
  2. | Verbindet die beiden Befehle
  3. wp db import - Anschließend wird die Ausgabe in die WordPress-Installation in eurem aktuellen Verzeichnis mit wp db import importiert. Dabei wird durch - der STDIN (Standard Input) verwendet.

Gefunden habe ich diesen Befehl übrigens bei Reddit. Eine Erklärung von Stdout & Stin findet ihr auf ComputerHope.

Optional: URL anpassen

Anschließen kann man noch lokal die eigene Domain in der Datenbank anpassen:

wp search-replace https://go-around.de https://go-around.test
Code-Sprache: Bash (bash)

Hat man lokal in der wp-config.php aber WP_HOME auf die lokale URL gesetzt, ist dieser Schritt nur optional. Es funktioniert auch, ohne mit search-replace durch die Datenbank zu gehen. Das kann bei sehr großen Datenbanken recht lange dauern. Deswegen verzichte ich persönlich darauf.

Uploads

Wichtig finde ich, dass Uploads, z.B. Bilder, korrekt angezeigt werden. Diese werden in der Datenbank nur mit dem relativen Pfad gespeichert. Jetzt könnte man mit rsync alle Bilder lokal herunterladen. Bei Travel-Dealz wären das aber mehrere GB und ich möchte damit nicht meine SSD vollmüllen.

Deutlich besser finde ich da die Lösung von Bernhard Kau. Anfragen für lokal fehlende Dateien leitet der Webserver NGINX oder Apache einfach an den Live-Server weiter.

Funktioniert bei mir perfekt und sorgt dafür, dass ich eine lokale Entwicklungsumgebung habe mit echten Content, in der ich mich austoben darf, ohne meine Live-Seite zu zerschießen.

Multisite

Damit Multisites lokal funktionieren, müssen auf jeden Fall die Datenbank angefasst werden. Konkret muss dafür in der Tabelle wp_blogs und wp_site die Spalte domain an die lokal verwendeten Domains angepasst werden. (Danke an Bernhard für den Tipp). Auch das geht wunderbar mit search-replace:

wp search-replace travel-dealz.de travel-dealz-de.test wp_site wp_blogs
Code-Sprache: Bash (bash)

7 Reaktionen zu “WP CLI: Backup & Import in einem Befehl

  1. Hallo Johannes,

    da hattest du ja eine sehr ähnliche Idee für deinen Beitrag heute, wie ich gestern 😉

    Zu dem Problem mit der Multisite. Ich habe das schon häufiger erfolgreich auf einem lokalen Entwicklungssystem (oder Staging) umgesetzt. Vermutlich musst du bei dir noch in den Tabellen wp_blogs sowie wp_site die URLs anpassen. Eventuell zusätzlich noch in der wp-config.php die Konstante DOMAIN_CURRENT_SITE, damit es funktioniert.

    1. Hallo Bernhard,

      ich hatte die Idee für den Beitrag bereits seit du mir den Tipp mit der Auslieferung von fehlenden Bildern vom Live-Server gegeben hast. Als ich deinen heute Beitrag gesehen habe dachte, ich mir ich muss den mal dringend fertig schreiben.

      Ich werde es noch einmal versuchen. Vermutlich muss ich mit search-replace etwas vorsichtiger umgehen.

      1. Ich fand deinen Ansatz sehr gut. Ich gehe meistens noch den umständlicheren Weg, einen Datenbank-Dump zu erstellen, diesen zu übertragen und dann wieder einzuspielen. Ihn direkt per SSH zu senden ist natürlich viel eleganter und erlaubt auch einen „Pull“ auf ein lokales Entwicklungssystem. Ich werde es mal ausprobieren.

  2. Hallo Johannes,

    danke für den Artikel! Cool, dass das mit einem Befehl/zwei verbundenen möglich ist. Muss ich mir für die nächste Gelegenheit merken.

    Viele Grüße
    Florian

  3. Laravel ist ein PHP-Framework um komplexe Anwendungen zu erstellen und WordPress ein Content Management System um Inhalte zu verwalten und anzuzeigen. Zwar kann man in Laravel auch einen Blog wie bei WordPress umsetzen aber i.d.R. nutzt man Laravel eher für komplexere Anwendungen.

    Um Laravel ist aber ein ganzes Ökosystem an nützlichen Tool entstanden, die man auch mit WordPress sehr gut nutzen kann. Meistens handelt es sich dabei um Tools für die Entwicklung z.B. von Plugin & Themes aber auch in anderen Bereichen lassen sie sich nutzen.

    In dieser Serie möchte ich euch einige der Tools vorstellen. Den Anfang macht Laravel Valet:

    Was ist Valet?

    Valet ist eine Entwicklungsumgebung für MacOS, die sehr schlank gehalten ist und sich über die Kommandozeile bedienen lässt. Von der Nutzung in der Kommandozeile sollte man sich nicht abschrecken lassen, ich bevorzuge auch eher ein GUI, aber nach der Installation müsst ihr euch eigentlich nur noch ein Befehl merken.

    Valet läuft bei euch permanent im Hintergrund. Der große Vorteil gegenüber anderen Entwicklungsumgebung ist meiner Meinung nach die Leichtigkeit, die es gerade erlaubt dauerhaft im Hintergrund zu laufen. Zwar nutzen PHP, MySQL, NGINX Systemressourcen aber wirklich nur minimal (außer ihr ladet GB an Daten in die Datenbank). Außerdem müsst ihr Valet so nie starten, sondern wenn ihr eine konfigurierte Domain mit der Endung .test aufruft, ist die Website direkt da.

    Installation

    Benötigte Zeit: 5 Minuten. Die Installation von Laravel Valet ist sicherlich nicht die Einfachste aber hat man es einmal geschafft, ist es wirklich simpel. Versprochen! MySQL & PHP installieren Zuerst müsst ihr PHP und MySQL auf eurem Mac installieren. Das geht am einfachsten mit Homebrew. Gebt die folgenden Befehle der Reihe nach ein;PHP installieren: brew install phpMySQL Datenbank: brew install mysqlMySQL starten: brew services start mysql@5.7 Composer installieren Um Valet zu installieren, benötigt ihr außerdem noch den Abhängigkeitsmanager Composer. Laravel Valet über Composer laden Anschließend könnt ihr endlich Valet selber installieren mit composer global require laravel/valet. PATH-Variable ergänzen Wenn ihr das erste Mal Composer nutzt, müsst ihr noch den .composer/vendor/bin Ordner zu der PATH-Variable hinzufügen. Wie das genau funktioniert, wird bei Stackoverflow gut beschrieben. Valet installieren Jetzt solltet ihr in Terminal den Befehl valet install ausführen können und Valet installiert und konfiguriert für euch noch NGINX als Webserver. Wenn nicht, ist in Schritt 4 etwas schiefgelaufen.

    Nutzung

    Nach der doch etwas aufwendigen Installation ist die weitere Nutzung total simpel. Ladet euch WordPress herunter, entpackt es in einen Ordner eurer Wahl und führt in diesem Ordner den Befehl valet link meine-domain aus. Anschließend könnt ihr die Website im Browser unter der Domain http://meine-domain.test aufrufen.

    Was dann noch fehlt, ist die Datenbank. Diese könnt ihr über die Kommandozeile steuern oder ihr ladet euch eine GUI herunter z.B. Sequel Pro. Der Benutzername lautet root. Ein Passwort ist lokal nicht gesetzt d.h. ihr könnt einfach das Feld leer lassen. Für eine lokale Entwicklungsumgebung sollte das kein Problem sein.

    Erstellt in der Datenbank eine neue Tabelle z.B. wordpress und passt die Zugangsdaten in der wp-config.php an:

    .wp-block-code {
    border: 0;
    padding: 0;
    }

    .wp-block-code > div {
    overflow: auto;
    }

    .shcb-language {
    border: 0;
    clip: rect(1px, 1px, 1px, 1px);
    -webkit-clip-path: inset(50%);
    clip-path: inset(50%);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    word-wrap: normal;
    word-break: normal;
    }

    .hljs {
    box-sizing: border-box;
    }

    .hljs.shcb-code-table {
    display: table;
    width: 100%;
    }

    .hljs.shcb-code-table > .shcb-loc {
    color: inherit;
    display: table-row;
    width: 100%;
    }

    .hljs.shcb-code-table .shcb-loc > span {
    display: table-cell;
    }

    .wp-block-code code.hljs:not(.shcb-wrap-lines) {
    white-space: pre;
    }

    .wp-block-code code.hljs.shcb-wrap-lines {
    white-space: pre-wrap;
    }

    .hljs.shcb-line-numbers {
    border-spacing: 0;
    counter-reset: line;
    }

    .hljs.shcb-line-numbers > .shcb-loc {
    counter-increment: line;
    }

    .hljs.shcb-line-numbers .shcb-loc > span {
    padding-left: 0.75em;
    }

    .hljs.shcb-line-numbers .shcb-loc::before {
    border-right: 1px solid #ddd;
    content: counter(line);
    display: table-cell;
    padding: 0 0.75em;
    text-align: right;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    white-space: nowrap;
    width: 1%;
    }
    // ** MySQL settings - You can get this info from your web host ** //
    /** The name of the database for WordPress */
    define( 'DB_NAME', 'wordpress' );

    /** MySQL database username */
    define( 'DB_USER', 'root' );

    /** MySQL database password */
    define( 'DB_PASSWORD', '' );
    Code-Sprache: PHP (php)

    Anschließend könnt ihr die berühmte 5-Minuten Installation abschließend und könnt lokal mit WordPress anstellen was ihr wollt.

    Valet erkennt übrigens automatisch WordPress und funktioniert neben Laravel auch mit weiteren CMS und PHP Frameworks wie Drupal, Craft, Joomla… Es ist sogar möglich seinen eigenen Treiber zu schreiben.

    Bonus

    Eigentlich benötigt ihr nur den Befehl valet link aber es gibt doch noch einige interessante Funktionen von Valet die einen anderen Befehl verlangen:

    valet park und alle Unterverzeichnisse im aktuellen Verzeichnis z.B. ~/Sites sind über den Verzeichnisnamen für die .test-Domain zugänglich z.B. ~/Sites/wordpress-1 ~/Sites/wordpress-2wordpress-1.test und wordpress-2.testvalet secure meine-domain und eure Domain ist über https erreichbar.valet share in dem WordPress-Ordner und ihr könnt die Seite über Ngrok öffentlich im Internet teilenvalet forget vergisst das aktuelle Verzeichnis wiedervalet paths zeigt alle geparketen Verzeichnisse an

    NGINX Konfiguration anpassen

    Wenn ihr eure lokale Seite mithilfe von valet share mit einem SSL-Zertifikat ausgestattet habt, könnt ihr unter ~/.config/valet/Nginx/ die NGINX-Konfiguration finden und anpassen.

    Dort könnt ihr z.B. fehlende Bilder von eurer echten Seite laden, wenn ihr diese lokal gecloned habt.

    PHP updaten oder Version wechseln

    Eine neue PHP Version müsst ihr über Homebrew updaten: brew upgrade php und anschließend Valet darüber informieren mit valet use php

    Außerdem könnt ihr mit Homebrew ältere PHP-Versionen brew install php@7.3 installieren. Anschließend könnt ihr Valet befehlen diese Version zu verwenden: valet use php@7.3

    Zurück auf die aktuellste installierte Version geht es mit valet use php

    Eigene Plugins/Themes als symbolischer Link einbetten

    Meistens möchte man lokal ja ein eigenes Plugin oder Theme entwickeln. Das will man aber meistens nicht direkt unter wp-content erledigen. Ihr könnt aber mit einem symbolischen Link Abhilfe schaffen:

    Für Plugins:

    cd ~/pfad/zu/wordpress/wp-content/plugins
    ln -s ~/pfad/zu-eurem-plugin/mein-plugin mein-plugin
    Code-Sprache: JavaScript (javascript)

    Für Themes:

    cd ~/pfad/zu/wordpress/wp-content/themes
    ln -s ~/pfad/zu-eurem-theme/mein-theme mein-theme
    Code-Sprache: JavaScript (javascript)

    Fazit

    Ich bin echt ein großer Fan von Laravel Valet und finde es deutlich praktischer als eine Entwicklungsumgebung auf Docker- oder Virtualbox-Basis. Kein Starten, kein Abschalten um Arbeitsspeicher zu sparen und eine einfache Bedingung sind große Vorteile. Die Installation ist sicherlich etwas aufwendig aber kein Hexenwerk.

    Laravel Tools für WordPress

    Dieser Beitrag ist Teil meiner kleinen Serie Laravel Tools für WordPress, wo ich euch Tools vorstelle, die ich aus der Laravel-Welt kenne aber auch problemlos für WordPress genutzt werden können.

    Debuggen mit dd & dump statt print_rLokale Entwicklungsumgebung mit ValetWebpack in elegant mit Laravel Mix 6

Erwähnungen

  • Teilnehmerinnen und Teilnehmer sowie alle Beiträge zur #Projekt26 Challenge im Jahr 2020
  • Johannes

Schreibe einen Kommentar

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