Zum Inhalt springen

Vorlage kopieren

Jeder Verein bekommt sein eigenes Child-Theme. Es trägt nur, was sich vom Parent wpce-theme unterscheidet: Farben, Schriften, ein paar Werte, im Notfall eine Vorlage. Alles andere kommt vom Parent und bleibt dadurch aktuell.

Du fängst nicht bei null an. Die Vorlage wpce-child-template ist ein fertiges, schlankes Child: ein Theme-Kopf, eine theme.json mit der Palette, eine leere Stylesheet-Datei und ein Skript zum Umbenennen. Du lädst sie als ZIP und machst daraus einmal je Verein ein eigenes Theme. Es läuft auf deinem Hosting, und du lieferst es selbst aus.

Die Vorlage wird kopiert, nicht aktualisiert. Verbesserungen an der Vorlage erreichen bestehende Childs nicht von selbst. Wer sie braucht, übernimmt sie von Hand.

Das Child braucht mindestens das Theme wpce-theme 1.0.0 und das Plugin WP Club Elements 1.0.0. Eine Prüfung der Versionen im Code gibt es nicht. Die Mindestzahlen stehen im Änderungsverlauf der readme.txt der Vorlage („Needs WPCE Theme 1.0 and WP Club Elements 1.0“). Mehr dazu auf der Seite Mindestversionen.

Die Vorlage gibt es als ZIP auf der Seite Installieren, im Abschnitt „Für Agenturen“. Ich habe das ZIP der Version 1.0.1 geöffnet. Es enthält:

wpce-child-template/
├─ style.css nur der Theme-Kopf (Template: wpce-theme, Text Domain = Slug)
├─ theme.json Palette und andere Token
├─ functions.php Text Domain, child.css laden, Update-Hook
├─ inc/updater.php meldet das Child beim Update-Server von Die Technikbude an
├─ assets/css/ child.css
├─ vendor/ die Update-Bibliothek dazu (fertig installiert)
├─ readme.txt Beschreibung und Änderungsverlauf
├─ README.md die Anleitung der Vorlage (englisch)
├─ LICENSE
├─ screenshot.png 1200 × 900, in der Vorlage das Bild des Produkts
├─ .gitlab/ Vorlage für Merge Requests
└─ bin/ rename.sh, screenshot.mjs, mark.svg

Das Child hat keinen Build-Schritt. Es hat keine Blöcke und kein SCSS. Wenn du das je brauchst, nimm das Setup vom Parent.

Der Update-Hook (inc/updater.php, vendor/) ist für Vereine da, die Die Technikbude selbst betreibt: Ihr Child kommt vom Update-Server updates.die-technikbude.de. Ein Child, das auf deinem eigenen Hosting läuft, braucht ihn nicht und nimmt ihn mit --no-updater heraus. Eine Pipeline-Datei (.gitlab-ci.yml), eine composer.json und eine .distignore brauchst du dafür nicht. Das ZIP enthält sie auch nicht.

Du brauchst Bash und, wenn du das Child in Git verwalten willst, Git. Auf Windows läuft das Skript in Git Bash oder WSL.

  1. Lade das ZIP, entpacke es und gib dem Ordner gleich den Namen des neuen Themes. WordPress erkennt ein Theme am Ordnernamen.
Terminal-Fenster
unzip wpce-child-template-1.0.1.zip
mv wpce-child-template wpce-tsvms
cd wpce-tsvms
  1. Benenne die Vorlage um und nimm den Update-Hook heraus. Das Skript bekommt das Kürzel des Vereins, seinen Namen und die Option --no-updater.
Terminal-Fenster
bin/rename.sh tsvms "TSV Musterstadt e. V." --no-updater

Das Kürzel besteht nur aus Kleinbuchstaben a-z und Ziffern, ohne Bindestrich. Aus tsvms wird der Slug wpce-tsvms. Das Skript ersetzt wpce-child-template durch den Slug und „WPCE Child Template“ durch den Vereinsnamen, in allen Dateien außer .git, vendor und bin. Es setzt den PHP-Namensraum auf WPCE\Child_tsvms und entfernt bin/screenshot.mjs und bin/mark.svg (sie zeichnen nur das Bild der Vorlage).

Mit --no-updater entfernt es außerdem inc/updater.php und die Zeile in functions.php, die sie lädt, den Ordner vendor/, die Zeile Update URI in style.css und den Satz über den Update-Server in readme.txt. Das Theme wpce-theme und das Plugin behalten ihre eigenen Update-Haken. Läuft das Skript ein zweites Mal, ändert es nichts mehr. Ich habe es auf dem ZIP der Version 1.0.1 laufen lassen und die umbenannte functions.php mit php -l geprüft.

Das Skript schreibt außerdem /bin und /README.md in eine .distignore. Das ist die Liste dessen, was die Pipeline von Die Technikbude nicht ins Paket eines Vereins packt. Wenn du dein Paket selbst packst, ignorier die Datei oder nimm sie als Merkzettel: bin/ und README.md sind Werkzeug, kein Teil des Themes.

  1. Setze die Palette in theme.json. Das steht auf der Seite Farben, Schriften, Abstände.
  2. Ersetze screenshot.png (1200 × 900 Pixel) und beschreibe den Verein in readme.txt. Das Bild der Vorlage zeigt das Zeichen von WP Club Elements und die Zeile „Die Vorlage für das Child-Theme“. Solange du es nicht ersetzt, zeigt WordPress es unter „Design“ → „Themes“ für das Child des Vereins. Nimm ein Bild der Startseite des Vereins.
  3. Pack den Ordner wpce-tsvms zu einem ZIP und spiel es ein, oder kopiere ihn nach wp-content/themes/. Wie du es auslieferst und aktualisierst, entscheidest du. Das Child bekommt von Die Technikbude keine Updates.

Den Ordner des Themes hast du schon in Schritt 1 wpce-tsvms genannt. Das Skript benennt ihn nicht um.

Das Skript ersetzt den alten Slug wpce-child-template in allen Dateien, die ihn tragen. Danach muss das hier übereinstimmen:

Wo Was Beispiel
Ordnername des Themes der Slug wpce-tsvms
style.css, Text Domain derselbe Slug wpce-tsvms
style.css, Template immer der Parent, nie ändern wpce-theme
functions.php, load_child_theme_textdomain() derselbe Slug wpce-tsvms

Das Skript setzt außerdem den Theme-Namen im Kopf von style.css auf den Vereinsnamen und gibt dem PHP-Namensraum das Kürzel (WPCE\Child_tsvms). Den Ordner benennt es nicht um. Das machst du selbst.

So prüfst du, ob der Kopf stimmt: Lies das umbenannte Theme mit new WP_Theme( 'wpce-tsvms', $theme_root ) ein. Ein richtig umbenanntes Child nennt wpce-theme als Parent, meldet keinen Fehler und gilt als Block-Theme (is_block_theme()).

Ein Child für Vereine, die Die Technikbude selbst betreibt, läuft ohne --no-updater. Es behält den Update-Hook und die Zeile Update URI (https://updates.die-technikbude.de/wp/wpce-<kuerzel>) und wird als eigenes Paket vom Update-Server ausgeliefert. Dafür gibt es einen eigenen Weg über das Repository der Vorlage. Er ist nicht für Agenturen gedacht und steht hier nicht Schritt für Schritt.

Der Parent wpce-theme und das Plugin WP Club Elements müssen installiert sein. Dann unter Design → Themes das Child aktivieren. Die Namen und das Logo des Vereins muss das Child nicht ändern: WP Club Elements hält Website-Titel und Website-Logo gleich Name und Logo aus den Vereinsdaten.

Gehört hinein:

  • die Palette und andere Werte in theme.json,
  • Schriften, die der Verein eigens hat,
  • ein paar Zeilen CSS in assets/css/child.css, wenn theme.json etwas nicht ausdrücken kann,
  • im Ausnahmefall ein Pattern, ein Template-Teil oder eine Vorlage, die der Verein anders braucht.

Gehört nicht hinein:

  • Kopien von Parent-Dateien ohne Not. Eine kopierte Vorlage, ein Teil oder ein Pattern mit dem Slug des Parents bekommt keine Parent-Updates mehr. Sie hängt dann an dem Stand, von dem du kopiert hast.
  • Menü-Orte und add_theme_support(). Der Parent registriert sie schon. Wer sie ein zweites Mal anmeldet, bekommt doppelte Einträge oder Überraschungen.
  • Name und Logo des Vereins.
  • Eigene Blöcke und ein Build. Dafür ist ein Add-on da, siehe Eigene Inhaltstypen.

Die README.md der Vorlage hat eine Tabelle „What is overridden“. Halte sie aktuell. Sobald du eine templates/*.html, eine parts/*.html oder ein Pattern mit dem Slug des Parents kopierst, trägst du die Datei dort ein, mit dem Grund. Die README.md kommt nicht ins Paket des Vereins, aber sie bleibt in deinem Repository.

Datei Warum
parts/footer.html Fußzeile mit einer Zeile, der Verein hat keine Spalten

Die Liste zeigt, wie viel Arbeit vor dem nächsten Major des Parents ansteht. Jede Datei dort folgt dem Parent nicht mehr.

Ein Major bricht Dinge. Er erreicht eine Website nie von selbst: Eine Website fragt den Update-Kanal ihrer eigenen Hauptversion. Der Parent hat heute die Hauptversion 1.

Dein Child hat mit --no-updater keinen eigenen Kanal. Das Theme wpce-theme und das Plugin bekommen ihre Updates weiter vom Update-Server, mit ihrem eigenen Update-Hook, auch wenn das Child keinen hat. Kommt einmal die Hauptversion 2 des Themes und hast du dein Child dafür angepasst, stellst du die Website auf den neuen Kanal um. Das geht ohne Code in der wp-config.php, mit der Konstante DTB_UPDATES_MAJOR, einem Array mit einem Eintrag je Paket: define( 'DTB_UPDATES_MAJOR', array( 'wpce-theme' => 2 ) );. Für das Child selbst ist dabei nichts zu tun.

Ein Child mit Update-Hook (ohne --no-updater) sagt dagegen selbst, für welchen Major es gebaut ist, mit add_filter( 'dtb_updater_major/wpce-theme', fn() => 2 ); in seiner functions.php. Der Filter schlägt die Konstante. Die Update-Bibliothek kennt beides. Gegen ihren Quelltext gelesen, nicht auf einer Website ausprobiert. Mehr dazu auf der Seite Updates und Kanäle.