WordPress: Vollständige WooCommerce Datensicherung inkl. Bilder

WordPress: Vollständige WooCommerce Datensicherung inkl. Bilder

Es ist soweit! Dein WooCommerce/Wordpress Webshop läuft schon seit einiger Zeit, aber nun soll es endlich ein neuer Webshop mit modernen Webtechnologien sein, welcher endlich die lang ersehnte Individualität, sowie Konfigurations- und Funktionalitätsfreiheit zulässt.
Es kommt schnell die Frage auf: wie transferiere ich meine Daten von WooCommerce/Wordpress auf meinen neuen Webshop? Und noch wichtiger: Wie kann ich Daten wie Produktbilder sinnvoll sichern?

Dieser Post soll Dir zeigen, wie Du sämtliche Produktinformationen deines Webshops im JSON-Format, sowie alle dazugehörigen Bilder in einer sinnvollen Ordner- und Dateistruktur speichern kannst.

Was Du dafür benötigst:

  • den Zugang zu Deinem Wordpress Admin-Dashboard
  • Node.js

Schritt 1: Erzeuge WooCommerce API Consumer und Secret Key

Da WooCommerce für Deine eigene Seite eine leicht zugängliche Schnittstelle bereit stellt, ist dieser Schritt recht einfach.

  • Navigiere in dein altbekanntes Wordpress Admin-Dashboard (yoursite.com/wp-admin) und wähle den Menüpunkt "WooCommerce"
  • Wähle den Submenüpunkt "Einstellungen"
  • Wähle den Tabmenüpunkt "Erweitert"
  • Wähle den Subtabmenüpunkt "REST-API"
  • Drücke den Knopf "Schlüssel hinzufügen"
  • Füge eine kurze Beschreibung hinzu, wähle einen Benutzer aus und verwalte die Berechtigungen der zu generierenden Zugangsberechtigungen (für das simple sichern der Daten reicht die Berechtigung lesen)
  • Du hast mit diesen Daten nun Zugriff auf die WooCommerce Schnittstelle deines Webshops. Bewahre diese Daten sicher auf, leichtsinnig geteilte Zugangsdaten können großen Schaden verursachen.

Schritt 2: Installiere Node.js

Für den nächsten Schritt wird die JavaScript Laufzeitumgebung Node.js benötigt. Node.js kannst Du schnell und einfach hier herunterladen. Die Installation ist ebenso einfach.

Schritt 3: Schreibe ein Node.js Skript für die Datensicherung

In diesem Beispiel wird die auszuführende Skriptdatei backup.js genannt.

Jegliche Bezeichnungen, welche in Diamantoperatoren (<>) umschlossen sind, sind mit gültigen Daten auszutauschen.

Folgende Module werden benötigt:

const axios = require("axios");
const fs = require("fs");
const outputLocation = require("path").resolve(__dirname, "wc_backup.json");

Nachgehende Konstanten und globale Variablen werden verwendet:

const CONSUMER_KEY = "<WOOCOMMERCE_CONSUMER_KEY>";
const CONSUMER_SECRET = "<WOOCOMMERCE_CONSUMER_SECRET>";
const DIR = "./imagebackup";
const PERCENT_MULTIPLIER = 100;
const PRODUCTS_PER_PAGE = 100;
let GLOBAL_DOWNLOAD_COUNTER = 0;
let IMAGE_COUNTER = 0;

Die Funktion downloadImage lädt ein Bild über die gegebene URL herunter und speichert diese im Verzeichnis imagebackup:

const downloadImage = async (url, path) => {
  const writer = fs.createWriteStream(path);

  const response = await axios.get(url, { responseType: "stream" });

  await response.data.pipe(writer);

  return new Promise((resolve, reject) => {
    writer.on("finish", resolve);
    writer.on("error", reject);
  });
};

Die Funktion createJSONBackup erzeugt eine Backup-Datei deiner WooCommerce Produkte im JSON-Format:

const createJSONBackup = () => {
  return new Promise(async (resolve, reject) => {
    let products = [];
    let productsPerPageCount = 0;
    let page = 1;
    do {
      const res = await axios.get(
        `https://<yoursite.com>/wp-json/wc/v3/products?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}&per_page=${PRODUCTS_PER_PAGE}&page=${page}`
      );
      productsPerPageCount = Object.keys(res.data).length;
      for (var i = 0; i < productsPerPageCount; i++) {
        products.push(res.data[i]);
      }
      page++;
    } while (productsPerPageCount > 0);

    fs.writeFile(
      outputLocation,
      JSON.stringify(products, null, 4),
      function (err) {
        if (err) {
          console.log(err);
          reject(err);
        } else {
          console.log("JSON saved to " + outputLocation);
          resolve(outputLocation);
        }
      }
    );
  });
};

Die Funktion createImagesBackup lädt alle Bild-URLs aus Deiner Backup-Datei herunter und speichert diese in einem Ordner, welche nach der spezifischen Produkt ID benannt ist. So kannst Du später die Relation zwischen einem Bilderordner und einem Eintrag der Backup-Datei herstellen:

const createImagesBackup = async () => {
  const raw = fs.readFileSync("./wc_backup.json");
  const products = JSON.parse(raw.toString());
  const dir = "./imagebackup";

  products.forEach((product) => product.images.forEach(() => IMAGE_COUNTER++));

  fs.mkdirSync(dir, { recursive: true });

  products.forEach(async (product, i) => {
    fs.mkdirSync(DIR + `/${product.id}`, { recursive: true });
  });

  for await (const product of products) {
    for await (const image of product.images) {
      const path = DIR + `/${product.id}/${image.id}.jpeg`;
      console.log("Download image: ", image.id);
      await downloadImage(image.src, path).catch(() => {
        GLOBAL_DOWNLOAD_COUNTER++;
        console.log(
          "Download rejected - ",
          (GLOBAL_DOWNLOAD_COUNTER / IMAGE_COUNTER) * PERCENT_MULTIPLIER,
          "%"
        );
      });
      GLOBAL_DOWNLOAD_COUNTER++;
      console.log(
        "Downloaded image - ",
        (GLOBAL_DOWNLOAD_COUNTER / IMAGE_COUNTER) * PERCENT_MULTIPLIER,
        "%"
      );
    }
  }
};

Der folgende Code führt das Skript aus:

const promise = createJSONBackup();
Promise.resolve(promise).then(() => createImagesBackup());

Das Skript kann über ein Terminal mit dem Befehl node backup.js ausgeführt werden.

Wordpress/WooCommerce Backup Fortschritt: Ansicht im Terminal

Je nachdem, wie viele Dateien gesichert werden und wie schnell Deine Internetverbindung ist, kann das Sichern deiner Daten mehrere Stunden dauern.

Schlussendlich liegen Deine Bilder im Verzeichnis imagebackup wie folgt vor:

wordpress-image-backup-directory.png

Das war's! Deine Backup-Datei wc_backup.json und Dein Bilderverzeichnis imagebackup sind bereit für die weitere Verwendung.

Den Code findest Du auch auf GitHub.

Entdecken Sie die Vorteile­ unserer Individual­entwicklung

In einem kostenlosen Erstgespräch vor Ort - wahlweise auch am Telefon oder über Microsoft Teams - lernen wir uns unverbindlich kennen und erarbeiten gemeinsam mit Ihnen ein Lösungskonzept für Ihre Ziele. Wir freuen uns auf Sie!