Entwickler-AnleitungenMit WP-CLI automatisieren

Mit WP-CLI automatisieren

Prüf Icons in der CI mit echten Exit-Codes, bring Pakete von einer Seite auf viele und kontrollier Deploys in der Shell mit den wp easy-svg Befehlen.

Easy SVG Pro bringt sieben WP-CLI-Befehle mit. Zusammen kannst du damit Icons prüfen, bevor sie live gehen, Icon-Sets von einer Seite auf viele kopieren und nach einem Deploy bestätigen, dass jede Sammlung da ist. Dieses Tutorial zeigt dir, wie du eine Seite dafür einrichtest, auf welche Exit-Codes du dich verlassen kannst, und drei Pipelines zum Kopieren.

Die Befehle im Überblick

BefehlWas er machtSchreibt er etwas?
wp easy-svg icons listJede Sammlung mit Anzahl, Herkunft und ProblemzahlNein
wp easy-svg icons problemsJede Datei, die ein Quellordner nicht verwenden konnte, und warumNein
wp easy-svg icons validateProbelauf eines Ordners gegen den Sanitizer der SeiteNein
wp easy-svg icons importKopiert einen Ordner in ein Drop-in unter wp-content/easy-svg-iconsDateien
wp easy-svg pack listJede exportierbare Sammlung, auch als JSONNein
wp easy-svg pack exportEine Sammlung als Paket-ZIPEine ZIP-Datei
wp easy-svg pack importEin Paket-ZIP als neues Icon-SetDatenbank

Die Seite vorbereiten

Jeder Befehl prüft zuerst zwei Dinge: Die Lizenz ist aktiv, und die Funktion WP-CLI ist unter Icons → Funktionen eingeschaltet. Fehlt eins davon, bekommst du Turn on WP-CLI under Icons → Features (a license is required). und Exit-Code 1. Einen WordPress-Benutzer brauchen die Befehle nicht, sie laufen ohne Anmeldung.

Beide Plugins aktivieren

Easy SVG Support bringt den Sanitizer mit. Ohne ihn verweigern validate und beide Importe den Dienst.

wp plugin activate easy-svg easy-svg-pro

Die Lizenz einmal binden

Trag den Schlüssel in die wp-config.php ein, am besten aus einer Umgebungsvariable:

define( 'EASY_SVG_PRO_LICENSE_KEY', getenv( 'EASY_SVG_PRO_LICENSE_KEY' ) );

Die Seite aktiviert sich aus dieser Konstante auf admin_init, also wenn eine Administratorin (auf Multisite ein Netzwerk-Admin) zum ersten Mal wp-admin öffnet. WP-CLI löst admin_init nicht aus. Eine Seite, die nur WP-CLI sieht, bindet sich also nie. Öffne nach dem Setzen der Konstante einmal wp-admin, oder trag den Schlüssel unter Icons → Lizenz ein. Danach hält die Seite einen Site-Token, und der Schlüssel wird nicht mehr gebraucht.

Die Funktion WP-CLI einschalten

Schalte sie unter Icons → Funktionen ein oder in der Shell. Ergänze dabei die gespeicherten Flags, statt sie zu überschreiben, sonst geht jede andere Funktion aus:

wp eval '
$flags        = (array) get_option( "easy_svg_pro_features", array() );
$flags["cli"] = true;
update_option( "easy_svg_pro_features", $flags );
'

Was deine Sammlungen brauchen, schaltest du genauso ein: sources für Theme- und Drop-in-Ordner, editor für Icon-Sets.

Prüfen

wp easy-svg icons list

Kommt eine Tabelle, ist die Seite bereit.

Nimm für die Automatisierung eine dauerhafte Seite, zum Beispiel deinen Staging-Server. Jede Aktivierung belegt einen Platz deiner Lizenz, und ein Wegwerf-Container in der CI, der bei jedem Lauf neu entsteht, bräuchte jedes Mal eine neue Aktivierung, die er ohne Besuch in wp-admin nicht bekommt. Lass die Befehle stattdessen per SSH gegen Staging laufen, etwa mit einem Alias @staging in der wp-cli.yml.
Leg den echten Lizenzschlüssel nie in ein Repository, ein CI-Log oder ein Docker-Image. Lies ihn aus einem Secret in eine Umgebungsvariable und halte die wp-config.php aus der Versionskontrolle heraus.

Exit-Codes, auf die du dich verlassen kannst

BefehlExit 0Exit 1
alleLizenz inaktiv oder Funktion WP-CLI aus
icons validateGelaufen, egal mit welchem ErgebnisMit --strict: mindestens eine Datei übersprungen. Außerdem: Sanitizer fehlt oder ist zu alt
icons problemsSauber und mit Problemen
icons importKopiert, auch mit übersprungenen oder null DateienUngültiges --collection, Ordner nicht anlegbar, Sanitizer fehlt
pack exportZIP geschriebenUnbekannter Slug, kein ZipArchive, Schreiben gescheitert
pack importSet gespeichert, auch mit abgelehnten Icons oder Slug-KollisionDatei nicht lesbar, nichts akzeptiert, kein freier Slug

Drei Lücken solltest du kennen:

  • validate --strict geht bei einem Ordner durch, den es nicht gibt oder der keine .svg-Dateien hat. Zähl die Dateien vorher selbst.
  • icons problems scheitert nie. Such nach der Zeile Success:.
  • pack import weicht bei einer Kollision auf slug-2 aus und endet trotzdem mit 0. Such in der Ausgabe nach was taken.

Pipeline 1: Icons bei jedem Pull Request prüfen

Die Prüfung muss gegen ein echtes WordPress mit den Sanitizer-Einstellungen der Seite laufen. Der Job kopiert die Icons also auf Staging und prüft sie dort.

name: Icons
on:
  pull_request:
    paths:
      - "theme/assets/icons/**"

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: SSH-Schlüssel einrichten
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.STAGING_SSH_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan staging.example.com >> ~/.ssh/known_hosts
      - name: Icons auf Staging kopieren
        run: |
          rsync -a --delete theme/assets/icons/ deploy@staging.example.com:/tmp/icons-pr-${{ github.event.number }}/
      - name: Prüfen
        run: |
          ssh deploy@staging.example.com bash -s <<'SH'
          set -euo pipefail
          DIR=/tmp/icons-pr-${{ github.event.number }}
          n=$(find "$DIR" -maxdepth 1 -name '*.svg' | wc -l)
          if [ "$n" -eq 0 ]; then echo "Keine SVG-Dateien zum Prüfen"; exit 1; fi
          wp --path=/var/www/staging easy-svg icons validate "$DIR" --strict
          SH

Der Job scheitert mit der Tabelle im Log, sobald ein Icon übersprungen würde, und nennt den Grund: not-svg, no-drawing, duplicate, bad-name oder unreadable.

Pipeline 2: ein Icon-Set, viele Kundenseiten

Bau das Set einmal auf Staging, exportiere es und importiere es überall.

#!/usr/bin/env bash
set -euo pipefail

SLUG="agency-ui"
PACK="/tmp/$SLUG.zip"

wp @staging easy-svg pack export "$SLUG" --file="$PACK"
scp staging:"$PACK" "$PACK"

for site in client-a client-b client-c; do
	scp "$PACK" "$site":/tmp/
	out="$(wp @"$site" easy-svg pack import "/tmp/$SLUG.zip" --as="$SLUG" 2>&1)" || {
		echo "[$site] Import fehlgeschlagen: $out" >&2
		continue
	}
	if grep -q 'was taken' <<<"$out"; then
		echo "[$site] $SLUG gibt es schon, eine Kopie liegt unter einem anderen Slug. Bitte entfernen." >&2
	fi
	echo "[$site] $out"
done

Gut zu wissen:

  • pack import legt immer ein neues Set an. Zweimal ausgeführt hast du agency-ui und agency-ui-2. Um ein Set zu aktualisieren, änderst du es im Set-Editor oder entfernst vorher das alte.
  • Der Import löst easy_svg_pro_set_icons_written aus, also legt der Icon-Verlauf eine Revision an und deine eigenen Listener laufen. Siehe Auf Set-Änderungen reagieren.
  • Schlagwörter aus dem Manifest überleben den Weg in ein Icon-Set nicht.

Pipeline 3: einen Deploy prüfen

Nach einem Theme- oder Drop-in-Deploy bestätigst du, dass die Sammlungen da und vollständig sind:

#!/usr/bin/env bash
set -euo pipefail

expected=("theme" "acme")
list="$(wp easy-svg pack list --format=json)"

for slug in "${expected[@]}"; do
	jq -e --arg s "$slug" 'any(.[]; .slug == $s and .icons > 0)' <<<"$list" >/dev/null \
		|| { echo "Sammlung $slug fehlt oder ist leer" >&2; exit 1; }
done

problems="$(wp easy-svg icons problems)"
grep -q '^Success:' <<<"$problems" || { echo "$problems"; exit 1; }

Stolperfallen

  • Funktionen verstecken Sammlungen. Icon-Sets gibt es als Sammlungen nur, solange der Icon-Set-Editor an ist, Ordner nur mit Theme- und Ordner-Quellen. Fehlt nach einem Deploy eine Sammlung, ist oft eine Funktion aus.
  • icons import legt den Zielordner zuerst an. Ein Tippfehler im Quellpfad hinterlässt einen leeren Ordner und endet mit 0.
  • Pfade liegen auf dem Server. Mit einem Alias wie @staging lesen und schreiben validate, import und export Pfade auf dem Staging-Server, nicht auf deinem Rechner.
  • Deaktivieren hält nicht, solange die Konstante gesetzt ist. Gibst du den Platz unter Icons → Lizenz frei, bindet der nächste Besuch in wp-admin ihn wieder aus EASY_SVG_PRO_LICENSE_KEY. Entferne zuerst die Konstante.

Siehe auch