Effiziente WordPress Theme-Programmierung mit Git Deployment

Veröffentlicht:
Aktualisiert:
Illustration von Entwickler:innen am Laptop mit hervorgehobenem Git-Push-Button, im Hintergrund WordPress-Logo und Docker-Container – Symbolbild für automatisierte WordPress Theme-Entwicklung mit Git und Docker.

Die klassische WordPress-Entwicklung hat viele Stolperfallen: unübersichtliche CSS-Monster, inkonsistente Umgebungen zwischen Development und Live-System und manuelles Hochladen via FTP. Mit einer modernen Build-Pipeline auf Git-Basis lassen sich diese Probleme elegant lösen.

In diesem Tutorial zeigen wir euch, wie wir eine WordPress Build-Pipeline mit Git aufsetzen, die es uns ermöglicht, lokal entspannt mit SCSS zu arbeiten und Änderungen automatisch per Git-Deploy auf den Server zu bringen.

Ein zentraler Vorteil dabei ist, dass wir mit Docker Compose lokal arbeiten. Dadurch können wir unser Theme direkt in einer echten WordPress-Umgebung testen, genauso wie es später auf dem Server läuft. Wir entwickeln also nicht ins Blaue hinein, sondern sehen jederzeit sofort das Ergebnis.

Hinzu kommt: Wir müssen nicht mehr den gesamten WordPress-Ordner lokal und live synchron halten, was aufgrund der Datenmengen oft unpraktisch ist. Stattdessen pushen wir nur den Theme-Ordner. Das macht Deployments schlanker, strukturierter und effizienter.

Zusätzlich liegt das Theme jederzeit als Backup im Git-Repository vor. Wir haben dadurch Versionierung, Nachvollziehbarkeit und die Sicherheit, dass wir unser Theme jederzeit wiederherstellen können.

Mit dieser Pipeline behalten wir sowohl in der Entwicklungsumgebung als auch auf der Live-Umgebung stets den gleichen Stand und profitieren von einem sauberen, performanten Workflow.

Vorteile dieser Pipeline:

  • Lokal entwickeln mit SCSS
  • Automatisiertes Deployment mit einem Kommando
  • Gleicher Stand in der Entwicklungs- und Live-Umgebung
  • Saubere Projektstruktur
  • Schnelles Hinzufügen neuer Features
  • Schnellers Arbeiten durch Rebuild in Echtzeit
  • Versionierung und Teamwork
  • Automatisches Backup des Themes im Git-Repository

Vorbereitung

Bevor wir mit der eigentlichen Build-Pipeline starten, legen wir den technischen Rahmen fest. Unser Ziel ist eine saubere und moderne Entwicklungsumgebung, in der wir Themes effizient programmieren, testen und deployen können. Dazu setzen wir auf einen klar definierten Tech Stack:

  • Docker Compose: für eine lokale WordPress-Instanz, die der Live-Umgebung entspricht.
  • Node.js & npm – für die Integration von Build-Tools, SCSS-Compiler und BrowserSync.
  • Sass (SCSS) – für sauberen, modularen und strukturierten CSS-Code.
  • Git & GitHub/GitLab – für Versionskontrolle, Backup-System und Deployment.

Bevor es losgeht, solltet ihr sicherstellen, dass Docker Desktop, Node.js und Git auf eurem System installiert sind. Diese Basis ermöglicht uns, das Projekt strukturiert aufzubauen.

Struktur & Aufbau

Zunächst legen wir die Projektstruktur und die grundlegenden Code-Bausteine an, um unser Theme lokal entwickeln zu können. Anschließend lassen wir das Ganze in einem WordPress-Container über Docker laufen. Hierfür legen wir den Ordner für unsere lokale Entwicklungsumgebung an. Windows-User führen diesen Schritt am besten über das Windows Subsystem for Linux (WSL) aus, während Mac-User das Ganze direkt im Terminal erledigen können. Falls der Ordner noch nicht existiert, erstellen wir ihn.

bash
mkdir -p ~/local-dev/mein-theme

In diesem Ordner legen wir nun die grundlegende Projektstruktur an. Den Start macht der /src-Ordner, in dem unser eigentlicher Theme-Code liegt. Darin strukturieren wir die Inhalte sauber in Unterordner: /fonts für alle Schriftdateien, /images für Bilder, /js für JavaScript-Dateien, /sass für unsere SCSS-Stylesheets und /templates für die PHP-Templates des Themes. Auf die Inhalte und den basis-Code der Ordner /js, /scss und /templates gehen wir im nächsten Schritt detailliert ein. Die Inhalte in den Ordnern /fonts und /images sind in der Regel selbsterklärend, da sie lediglich die benötigten Assets beinhalten. Die finale Ordner-Struktur sollte dann wie folgt aussehen:

Ordner-Struktur für den /src Folder

JavaScript Templates

Im Ordner /js legen wir die Datei main.js an. Diese Datei dient ausschließlich dazu, alle weiteren JavaScript-Dateien, die sich im selben Ordner befinden, zu importieren. Auf diese Weise bleibt unser Code sauber strukturiert, wir vermeiden ein riesiges und unübersichtliches Script und können Features modular aufteilen. Jede Funktionalität bekommt also ihre eigene Datei (z. B. dropdownmenu.js oder burger.js) und wird dann in der main.js gebündelt. So behalten wir auch bei wachsenden Projekten den Überblick.

javascript
import './dropdownmenu.js'
import './burger.js'

SCSS Templates

Damit unser CSS sauber, modular und gut wartbar bleibt, unterteilen wir die Stylesheets in mehrere Dateien. Jede hat eine klare Aufgabe.

reset.scss: Enthält ein CSS-Reset, um Browser-Defaults zurückzusetzen und eine einheitliche Basis zu schaffen.

css
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
  display: block;
}
body {
  line-height: 1;
}
ol, ul {
  list-style: none;
}
blockquote, q {
  quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
  content: '';
  content: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}

variables.scss: Definiert globale Variablen wie Farben, Schriften oder Breakpoints. So behalten wir Konsistenz und können zentrale Werte leicht ändern.

css
// BREAKPOINTS
$mobile: 1200;
$desktop: 1201;

// COLORS
$white: #ffffff;
$black: #000000;
$green: #66ff00;
$grey: #d3d3d3;

base.scss: Enthält grundlegende Stilelemente wie Body-Defaults, Standard-Typografie oder grundlegende Links.

css
@function pem($px, $base: 16) {
  @return calc($px / $base) + em;
}

@function rem($px, $base: 16) {
  @return calc($px / $base) + rem;
}

@mixin breakpoint($min, $max: 0) {
  @if $max == 0 {
    @media (min-width: rem($min)) {
      @content;
    }
  } @else {
    @media (min-width: rem($min)) and (max-width: rem($max)) {
      @content;
    }
  }
}

@mixin hidden {
  display: none;
  visibility: hidden;
}

.hidden {
  @include hidden;
}

@mixin show {
  display: block;
  visibility: visible;
}

.show {
  @include show;
}

fonts.scss: Lädt und definiert die Schriftarten, die wir im Theme nutzen.

css
@font-face {
  font-display: swap;
  font-family: 'Helvetica Light';
  font-style: normal;
  font-weight: 300;
  src: url('./fonts/helvetica-light.woff2') format('woff2');
}

global.scss: Globale Styles, die für die gesamte Seite gelten (z. B. Header, Footer oder generelle Layouts).

css
*,
*:after,
*:before {
  box-sizing: border-box;
}

::selection {
  background-color: #1e1e1e; /* Hintergrundfarbe beim Markieren */
  color: #ffffff; /* Textfarbe beim Markieren */
}

html {
  scroll-behavior: smooth;
  background-color: #ffffff;
  max-width: 100vw;
  overflow-x: hidden;
  margin: 0 auto;
}

style.scss: Die zentrale Datei, die alle anderen SCSS-Dateien importiert. Ganz oben kommt der Theme-Header, der später beim Kompilieren ins finale style.css übernommen wird. Ohne diesen Header kann WordPress das Theme nicht erkennen.

css
/* 
Theme Name: Mein-Theme
Theme URI: /
Description: Meine rstes WordPress-Theme
Author: Stefan
Version: 1.0
Tags: /
*/
@use 'base' as *;
@use 'variables' as *;
@use 'reset';
@use 'global';
@use 'fonts';

Alle weiteren SCSS-Dateien, die ihr im Laufe der Entwicklung erstellt – beispielsweise eine home.scss für eure Startseite oder eine buttons.scss für wiederverwendbare UI-Elemente – kommen ebenfalls in den /sass-Ordner.

Wichtig ist: Damit diese Dateien auch im finalen CSS landen, müsst ihr sie in der style.scss importieren. Nur so werden sie beim Build-Prozess berücksichtigt und in das kompilierte style.css übernommen, das WordPress später lädt.

So bleibt euer Projekt übersichtlich, modular und jederzeit erweiterbar – neue Styles werden einfach als eigene Datei abgelegt und über einen @import in die zentrale style.scss eingebunden.

PHP Templates

Damit WordPress ein Theme korrekt lädt und darstellt, sind bestimmte Template-Dateien notwendig. Diese Dateien liegen im /templates-Ordner und enthalten das Grundgerüst für unser Theme.

index.php: Der Fallback-Template für alle Seiten. Wenn kein spezielleres Template gefunden wird, nutzt WordPress automatisch index.php.

php
<?php
/*
Template Name: Index
*/
?>
<?php get_header(); ?>
  <body>
  <?php wp_body_open(); ?>
    <header>
    </header>
  <?php get_footer(); ?>

header.php: Enthält den oberen Bereich der Seite, meist inklusive <head>-Tag, Meta-Informationen, Stylesheets und Navigation.

php
<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title><?php wp_title('|', true, 'right'); ?></title>
    <link rel="stylesheet" href="./style.css" />
    <script src="main.js" defer></script>
    <?php wp_head(); ?>
  </head>

footer.php: Enthält den unteren Bereich der Seite, oft mit Footer-Inhalten, Scripts und schließendem </body>/</html>.

php
<footer>

</footer>
    <?php wp_footer(); ?>
  </body>
</html>

functions.php: Das „Gehirn“ des Themes. Hier registrieren wir Styles und Scripts, Menüs, Sidebars, Theme-Support (z. B. Thumbnails), und können eigene Funktionen hinzufügen.

php
<?php
function add_theme_scripts_and_styles() {
    wp_enqueue_style('theme-style', get_stylesheet_uri());
    wp_enqueue_style('main-css', get_template_directory_uri() . '/style.css', array(), null);
    wp_enqueue_script('main-js', get_template_directory_uri() . '/main.js', array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'add_theme_scripts_and_styles');
add_theme_support('post-thumbnails');
register_nav_menu('main-menu', 'Main Menu');
?>

Build- und Docker-Setup

Damit unser Theme nicht nur strukturiert entwickelt, sondern auch direkt in einer echten WordPress-Instanz getestet werden kann, brauchen wir einen klaren Build-Prozess und eine lokale Container-Umgebung. So können wir jederzeit lokal arbeiten, testen und sicherstellen, dass das Ergebnis später auch auf dem Server exakt so läuft. Die nachfolgenden Dateien legen wir direkt im Root-Verzeichnis unseres Projekts an, also auf derselben Ebene, in der sich auch der Ordner /src befindet. Am Ende sollte die fertige Projektstruktur wie folgt aussehen:

Ordner Struktur für Build Prozess
Finale Ordner Struktur

docker-compose.yml: Legt fest, wie unser WordPress mit Datenbank und ggf. Nginx läuft. So starten wir in Sekunden eine komplette Instanz. Hier müssen wir noch den Containernamen sowie die Datenbank-Zugangsdaten anpassen, damit Docker unser Projekt eindeutig erkennt und WordPress mit der richtigen Datenbank verbunden wird.

yaml
version: '3.8'

services:
  wordpress:
    image: wordpress:php8.2-apache
    container_name: wp-projektname-local
    restart: always
    ports:
      - '8080:80'
    environment:
      WORDPRESS_DB_HOST: wp-projektname-db-local
      WORDPRESS_DB_NAME: projektnamedb
      WORDPRESS_DB_USER: projektnameuser
      WORDPRESS_DB_PASSWORD: password
    volumes:
      - ./wordpress:/var/www/html
    depends_on:
      - db
    networks:
      - devnet

  db:
    image: mariadb:10.6
    container_name: wp-projektname-db-local
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: projektnamedb
      MYSQL_USER: projektnameuser
      MYSQL_PASSWORD: password
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - devnet

networks:
  devnet:

Mit einem einzigen Befehl starten wir die Umgebung, danach ist WordPress unter http://localhost:8080 erreichbar:

bash
docker-compose up -d

build.sh: Damit wir lokal mit SCSS, modularen JS-Dateien und sauber getrennten Templates arbeiten können, brauchen wir ein Build-Skript. Dieses sorgt dafür, dass aus unserem /src-Ordner ein sauberes WordPress-Theme im /wordpress/wp-content/themes/-Verzeichnis entsteht. Dieses Skript kompiliert unsere SCSS-Dateien, bündelt JS und kopiert alle nötigen Dateien ins Theme-Verzeichnis:

bash
#!/bin/sh
npx sass ./src/sass/style.scss ./wordpress/wp-content/themes/projektname/style.css
cp -R ./src/templates/* ./wordpress/wp-content/themes/projektname
cp -R ./src/fonts ./wordpress/wp-content/themes/projektname
cp -R ./src/images ./wordpress/wp-content/themes/projektname
cp  ./src/screenshot.png ./wordpress/wp-content/themes/projektname
npx esbuild ./src/js/main.js --bundle --outfile=./wordpress/wp-content/themes/projektname/main.js  --minify

clean-build.sh: Wenn mal etwas schiefgeht oder man ein frisches Setup braucht, nutzen wir noch ein weiters Skript, welches den gesamten Theme-Ordner löscht und das Build-Skript erneut ausführt:

bash
#!/bin/sh

# Löscht alle Dateien und Ordner, außer .git
find ./wordpress/wp-content/themes/projektname -mindepth 1 -not -path '*/.git*' -exec rm -rf {} +

# Führe das Build-Skript aus
./build.sh

bs-config.js: Damit wir nicht ständig neu laden müssen, nutzen wir bs-config.js. Dieses Script sorgt dafür, dass Änderungen an SCSS oder JS sofort im Browser sichtbar sind und sich dieser automatisch aktualisiert:

javascript
module.exports = {
  proxy: 'http://localhost:8080',
  files: [
    'wordpress/wp-content/themes/projektname/**/*.php',
    'wordpress/wp-content/themes/projektname/**/*.css',
    'wordpress/wp-content/themes/projektname/**/*.js',
  ],
  injectChanges: true,
  open: false,
  port: 3000,
}

.gitignore: Damit unser Git-Repository schlank und übersichtlich bleibt, ignorieren wir bestimmte Verzeichnisse. Das erreichen wir mit einer .gitignore-Datei im Projekt-Root. So stellen wir sicher, dass nur die wirklich relevanten Dateien (Theme-Code, SCSS, Templates etc.) versioniert und über Git deployt werden.

javascript
node_modules/
db/

Bevor wir mit dem eigentlichen Build-Prozess starten können, müssen wir sicherstellen, dass unsere Skripte ausführbar sind und dass die Dateirechte korrekt gesetzt sind. Das ist wichtig, weil sonst Befehle wie ./build.sh oder ./clean-build.sh nicht gestartet werden können oder WordPress im Docker-Container keine Schreibrechte hat. Dazu führen wir im Projektverzeichnis folgende Befehle aus:

bash
chmod +x build.sh  
chmod +x clean-build.sh
sudo chown -R $USER:$USER ./wordpress

Damit wir unser Theme modern entwickeln können – z. B. mit SCSS und automatischem Browser-Reload – benötigen wir Node.js und die passenden Build-Tools. Hierzu initialisieren wir unser Projekt mit NPM (welches uns dann auch unseren /node_modules Ordner anlegt) und installieren dann alle nötigen Tools. Alle folgenden Befehle führen wir im Root-Verzeichnis unseres Projekts aus (dort, wo auch unser /src-Ordner und die Skripte wie build.sh liegen):

bash
npm init -y
npm install browser-sync --save-dev
npm install sass --save-dev

In der erzeugten package.json ergänzen wir im Bereich "scripts" unseren Dev-Befehl. Damit wird bei jedem npm run dev Kommando unser Browsersync mit der Konfiguration aus der bs-config.js gestartet.

json
"scripts": {
  "dev": "browser-sync start --config bs-config.js"
}

Jetzt können wir mit einem einzigen Befehl unser lokales Setup starten. Damit läuft WordPress über Docker (z. B. http://localhost:8080) und gleichzeitig unsere Entwicklungsumgebung mit SCSS und automatischem Reload (z. B. http://localhost:3000).

bash
npm run dev

Serverseitige Konfiguration

Nachdem unsere lokale Entwicklungsumgebung läuft, kümmern wir uns um die Produktivumgebung auf dem Server. Dafür nutzen wir ebenfalls Docker und richten alles so ein, dass unser WordPress-Theme sauber läuft und die Build-Pipeline deployen kann. Zuerst legen wir für jedes Projekt ein eigenes Docker-Setup an. Im Verzeichnis /docker/projektname/ erstellen wir eine docker-compose.yml und passen Containername sowie Datenbank-Zugangsdaten an.

yaml
version: '3.8'

services:
  wordpress:
    image: wordpress:php8.2-apache
    container_name: wp-projektname-server
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./wordpress:/var/www/html
    depends_on:
      - db
    networks:
      - wpnet
      - nginx-proxy

  db:
    image: mariadb:10.6
    container_name: wp-projektname-server-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - wpnet

networks:
  wpnet:
  nginx-proxy:
    external: true

Zusätzlich legen wir eine .env-Datei mit den individuellen Variablen für das Projekt an (z. B. DB-User, Passwort, Domain).

bash
MYSQL_ROOT_PASSWORD=supersecretroot
MYSQL_DATABASE=projektname-server-db
MYSQL_USER=projektname-server-db-user
MYSQL_PASSWORD=Start123

Damit unsere Seite über die richtige Domain erreichbar ist, müssen wir Nginx konfigurieren. Dazu erstellen wir im Proxy-Verzeichnis eine neue Konfigurationsdatei:

bash
nano /docker/proxy/nginx/conf.d/projekt.conf

Hier tragen wir den V-Host für die Domain ein.

bash
server {
    listen 80;
    server_name projektname.com;

    client_max_body_size 80M;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        proxy_pass http://wp-projektname:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Danach übernehmen wir die Änderungen, indem wir den Proxy-Container neu starten:

bash
cd /docker/proxy
docker-compose restart nginx

Standardmäßig sind die PHP-Limits oft zu niedrig für WordPress (z. B. beim Hochladen von Medien). Darum legen wir eigene PHP-Einstellungen für das Projekt an. Wechseln wir in das Projektverzeichnis:

bash
cd /home/webmaster/docker/projektname
mkdir -p php
nano php/php.ini

In die Datei php.ini tragen wir unsere individuellen Limits ein:

bash
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300

Damit Docker diese Datei berücksichtigt, binden wir sie in der docker-compose.yml des Projekts ein:

bash
volumes:
  - ./wordpress:/var/www/html
  - ./php/php.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
  - db

Anschließend starten wir den Container neu, damit die Änderungen aktiv werden:

bash
docker-compose restart

Git-Deployment

Damit unser Theme nach jedem Push automatisch auf dem Server aktualisiert wird, richten wir eine GitHub Actions Pipeline ein. Dadurch entfällt das manuelle Hochladen via FTP, und wir haben jederzeit Konsistenz zwischen unserer lokalen Entwicklungsumgebung und der Live-Umgebung.

Zuerst initialisieren wir unser Projekt als Git-Repository und verbinden es mit GitHub. Dazu führen wir im Projektverzeichnis folgende Befehle aus:

bash
git init 
git remote add origin git@github.com:<repo>.git 
git add . && git commit -m "Initial commit"
git branch -M main && git push -u origin main

Damit GitHub automatisiert auf unseren Server deployen darf, brauchen wir einen SSH-Key. Wir erzeugen ihn mit folgendem Befehl:

bash
ssh-keygen -t ed25519 -C "github-deploy" -f ~/.ssh/github-deploy-projektname -N ""

Nun registrieren wir die Schlüssel. Auf dem Server den Public Key in ~/.ssh/authorized_keys eintragen. In GitHub unter Settings → Secrets and variables → Actions ein neues Secret anlegen. Als Name verwenden wir DEPLOY_KEY und als Wert den Private Key. Anschließend testen wir die Verbindung:

bash
ssh -i ~/.ssh/github-deploy-projektname webmaster@93.94.12.143 "echo it works"

Jetzt definieren wir den Deployment-Prozess. Dazu legen wir lokal im Projekt unter .github/workflows/ eine Datei deploy.yml an. In dieser Datei konfigurieren wir den Workflow (z. B. Build ausführen, Dateien auf den Server übertragen). Die Pfade passen wir an unsere Projektstruktur an.

yaml
name: 🚀 Deploy Theme to Server

on:
  push:
    branches:
      - main
    paths:
      - 'wordpress/wp-content/themes/mein-theme/**'

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: 📥 Checkout Repository
        uses: actions/checkout@v3

      - name: 🔐 Setup SSH
        uses: webfactory/ssh-agent@v0.9.0
        with:
          ssh-private-key: ${{ secrets.DEPLOY_KEY }}

      - name: 🧷 Add server to known_hosts
        run: |
          ssh-keyscan -H 93.94.12.143 >> ~/.ssh/known_hosts

      - name: 🚀 Deploy via rsync
        run: |
          rsync -avz --delete \
            wordpress/wp-content/themes/mein-theme/ \
            webmaster@93.94.12.143:/home/webmaster/docker/meine-seite/wordpress/wp-content/themes/mein-theme

Damit WordPress die deployten Dateien auch lesen und schreiben kann, setzen wir auf dem Server die richtigen Berechtigungen:

bash
sudo chown -R webmaster:webmaster /home/webmaster/docker/meine-seite/wordpress/wp-content/themes/

Nachdem alles eingerichtet ist – also Git-Repo, SSH-Key und GitHub Actions Workflow – funktioniert der Deployment-Prozess super einfach. Wir arbeiten lokal an unserem Theme (z. B. in /src mit SCSS, Templates und JS). Änderungen werden gebaut und ins Theme-Verzeichnis geschrieben (z. B. per ./build.sh). Wir committen und pushen die Änderungen zu GitHub:

bash
git add .
git commit -m "Neues Feature oder Fix"
git push origin main

GitHub Actions startet automatisch den definierten Workflow (deploy.yml). Das Theme wird vom Repository genommen, über die SSH-Verbindung direkt auf den Server kopiert und in den richtigen Theme-Ordner deployt. Auf dem Server ist das Theme sofort aktualisiert – ohne manuelles FTP, ohne Versionskonflikte.

Fazit

Mit unserer WordPress Build-Pipeline haben wir einen klaren und effizienten Workflow geschaffen, der die Entwicklung von Themes enorm erleichtert. Statt unübersichtlichen CSS-Dateien, manuellem FTP-Upload und Versionskonflikten setzen wir auf eine saubere Struktur im /src-Ordner, moderne Tools wie SCSS, BrowserSync und Docker sowie ein automatisiertes Deployment über GitHub Actions.

Der große Vorteil:
Wir entwickeln lokal in einer realitätsnahen Docker-Umgebung, haben jederzeit Konsistenz mit der Live-Instanz und profitieren von einem sauberen Git-basierten Versionsmanagement. Änderungen am Theme werden mit einem simplen git push deployed. Schneller und sicherer geht es kaum.

Natürlich bedeutet dieser Ansatz etwas initialen Aufwand beim Setup, doch die Vorteile überwiegen deutlich: bessere Wartbarkeit, klare Trennung von Entwicklungs- und Produktionsumgebung, Backups über Git und eine stressfreie Zusammenarbeit im Team.

Am Ende steht ein schlanker, moderner Workflow, mit dem wir WordPress-Theme-Entwicklung auf ein neues Level heben: strukturiert, effizient und zukunftssicher. 🚀

Kontakt

Neugierig geworden?

Wir haben dein Interesse an unser­er Agentur geweckt? Dann zögere nicht und kontaktiere uns für ein unverbindliches Erstgespräch!

Erstgespräch

Mehr