Custom WordPress Theme erstellen – Schritt für Schritt Tutorial

In diesem Tutorial erfährst du, wie du ein minimalistisches eigenes WordPress Theme erstellst. Du bekommst das Grundgerüst mit den wichtigsten Dateien, Codeschnipseln & guten Tipps zum Start.


1. Ordnerstruktur anlegen

Lege im WordPress-Theme-Verzeichnis wp-content/themes/ einen neuen Ordner an, z.B. mein-theme. Dieser enthält mindestens folgende Dateien:

  • style.css
  • index.php
  • header.php
  • footer.php
  • functions.php

2. style.css – Metadaten & Grundstyle

Diese Datei muss unbedingt den Theme-Header enthalten, damit WordPress das Theme erkennt:

/*
Theme Name: Mein Theme
Theme URI:  https://deine-seite.de/mein-theme
Author:     Dein Name
Author URI: https://deine-seite.de
Description: Ein einfaches, flexibles WordPress Theme für den Einstieg.
Version:    1.0
License:    GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: mein-theme
Tags:       custom-theme, responsive, clean
*/

body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
  line-height: 1.6;
}

3. index.php – Haupttemplate mit Loop

Die Hauptdatei zeigt Beiträge (Posts) dynamisch:

<?php get_header(); ?>

<main>
  <?php 
  if (have_posts()) :
    while (have_posts()) : the_post(); ?>

      <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div><?php the_content(); ?></div>
      </article>

    <?php endwhile;
  else : ?>
    <p>Keine Beiträge gefunden.</p>
  <?php endif; ?>
</main>

<?php get_footer(); ?>

4. header.php

Kopfbereich mit Aufruf zum Einbinden von Styles & Scripts

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title><?php wp_title('|', true, 'right'); ?> <?php bloginfo('name'); ?></title>
  <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<header>
  <h1><a href="<?php echo esc_url(home_url('/')); ?>"><?php bloginfo('name'); ?></a></h1>
  <nav>
    <?php
    wp_nav_menu(array(
      'theme_location' => 'primary',
      'container' => false,
      'menu_class' => 'menu',
    ));
    ?>
  </nav>
</header>

5. footer.php

Fußzeile mit WordPress Hooks

<footer>
  <p>&copy; <?php echo date('Y'); ?> <?php bloginfo('name'); ?>. Alle Rechte vorbehalten.</p>
</footer>
<?php wp_footer(); ?>
</body>
</html>

6. functions.php

Theme-Support und Menü registrieren

<?php
// Grund-Funktionen aktivieren
function mein_theme_setup() {
  add_theme_support('title-tag');
  add_theme_support('post-thumbnails');
  
  register_nav_menus(array(
    'primary' => __('Hauptmenü', 'mein-theme'),
  ));
}
add_action('after_setup_theme', 'mein_theme_setup');

// Styles einbinden
function mein_theme_scripts() {
  wp_enqueue_style('mein-theme-style', get_stylesheet_uri());
}
add_action('wp_enqueue_scripts', 'mein_theme_scripts');

Schritt-für-Schritt Erklärung

  • style.css: Definiert Theme-Metadaten und grundlegende Styles.
  • index.php: WordPress Loop zum Anzeigen von Beiträgen.
  • header.php: Enthält <head>-Inhalte und den Seitenkopf mit Navigation.
  • footer.php: Fügt Fußzeile und WordPress-Funktionen am Ende ein.
  • functions.php: Registriert Menüs, aktiviert Funktionen und bindet Styles ein.

Fazit

Mit diesem Grundgerüst hast du ein funktionales WordPress Theme, das du beliebig erweitern kannst – z.B. mit weiteren Templates wie single.php, page.php, Widget-Areas uvm.

Gerade für individuelle Designs und Projekte ist ein eigenes Theme oft die beste Wahl!


Um dein Theme zu testen:

  1. Erstelle den Ordner mein-theme in wp-content/themes/ deiner WordPress-Installation.
  2. Lege die gezeigten Dateien dort ab.
  3. Aktiviere das Theme im WordPress Backend unter Design > Themes.
  4. Deine Seite zeigt nun Beiträge mit deinem eigenen Theme an.

FAQ: Custom WordPress Theme erstellen

Welche Mindestdateien und Ordner braucht ein funktionales Theme?

Mindestens ein Theme‑Ordner unter wp-content/themes/mein-theme mit diesen Dateien: style.css (mit Theme‑Header/Metadaten), index.php (Haupttemplate/Loop), header.php (DOCTYPE, head, wp_head(), Beginn body), footer.php (wp_footer(), schließendes HTML) und functions.php (Theme‑Setup, Enqueue). Zusätzlich empfehlenswert: screenshot.png (Vorschau im Backend), /languages (Übersetzungen), /template-parts für modulare Teile. Diese Struktur sorgt dafür, dass WordPress das Theme erkennt und zuverlässig Inhalte darstellt. Beim Anlegen lokal arbeiten, Versionierung (Git) verwenden und erst auf Staging/Live deployen.

Warum ist der Theme‑Header in style.css so wichtig und welche Metadaten gehören rein?

WordPress liest den Kommentarblock an Anfang von style.css als Theme‑Meta: Theme Name, Author, Version, Text Domain, Description etc. Ohne diesen Header wird das Theme nicht in Design > Themes angezeigt. Die Text Domain ist wichtig für Übersetzungen; Version hilft bei Wartung. Ergänze außerdem eine screenshot.png für eine schnelle Vorschau im Backend. Pflege diese Metadaten korrekt, damit Theme‑Distribution und Support später einfacher sind.

Wie binde ich Styles und Skripte korrekt ein (wp_enqueue)?

Nie CSS/JS direkt in Templates hard‑coden. Verwende functions.php + wp_enqueue_style() / wp_enqueue_script() und hänge die Callback an wp_enqueue_scripts. So werden Abhängigkeiten, Versionen und Ladeort (Footer vs Head) korrekt verwaltet. Für externe Libraries (z. B. jQuery‑Plugin) prüfe, ob WordPress bereits eine sichere Version liefert; vermeide doppelte Inklusion. Nutze außerdem Versioning für Cache‑Bust (z. B. filemtime) und lade kritische CSS inline nur dort, wo es nötig ist (Critical CSS).

Wie nutze ich die Template‑Hierarchy sinnvoll und welche zusätzlichen Templates brauche ich?

WordPress liefert eine Template‑Hierarchie (single.php, page.php, archive.php, search.php, 404.php). Ergänze diese Dateien, um unterschiedliche Inhaltstypen individuell zu rendern. Verwende template parts (get_template_part()) für wiederkehrende Blöcke (Header, Footer, Card‑Layouts), dadurch bleibt der Code modular und wartbar. Für Post‑Typen eigene single-{posttype}.php anlegen; für Taxonomien taxonomy-{taxonomy}.php. So lässt sich Layout gezielt optimieren.

Welche Theme‑Features und Registrierungen gehören in functions.php?

In functions.php registrierst du Theme‑Unterstützung (add_theme_support(‚title-tag‘), ‚post-thumbnails‘, ‚custom-logo‘, ‚html5‘, ‚editor-styles‘), registrierst Menüs (register_nav_menus), Sidebars (register_sidebar), Bildgrößen (add_image_size) und enqueuest Assets. Achte darauf, setup‑Funktionen an after_setup_theme zu hängen, und Enqueue an wp_enqueue_scripts/wp_enqueue_style. Halte die Datei organisiert (Abschnitte, Kommentare) und vermeide zu viel Logik dort — wiederverwendbare Funktionen besser in Plugins auslagern.

Wie mache ich das Theme performant und mobil‑optimiert?

Performance ist zentral: mobile‑first CSS, kritisches CSS inline, restliches CSS asynchron laden, JS mit defer/async laden und nur bei Bedarf enqueuen. Reduziere HTTP‑Requests, kombiniere Assets im Build‑Prozess (Webpack, Gulp), minifiziere CSS/JS, nutze moderne Bildformate (WebP/AVIF) mit srcset/sizes für responsive Bilder und lazy‑loading. Teste Core Web Vitals (Lighthouse). Serverseitig: Caching, CDN, GZIP/Brotli. Vermeide unnötige Datenbankqueries in Templates — nutze Transients oder Caching für teure Abfragen.

Wie stelle ich Accessibility (A11y) sicher?

Accessibility beginnt bei semantischem HTML (header, main, nav, footer, landmarks). Sorge für: aussagekräftige Linktexte, Alt‑Texte für Bilder, sichtbare Fokuszustände, Tastaturnavigation, ARIA‑Attribute nur dort, wo nötig. Verwende ausreichende Farbkontraste (WCAG 2.1 AA), prüfe reduzierten Bewegungswunsch (@media prefers-reduced-motion) und teste mit Screenreadern (NVDA/VoiceOver) sowie Tools (axe, Lighthouse). Dokumentiere A11y‑Regeln im Design‑System, damit Redakteure später korrekt Inhalte pflegen.

Wie gehe ich mit Bildern, Icons und Logos um?

Nutze responsive images (srcset, sizes) und registriere sinnvolle image sizes mit add_image_size. Komprimiere und liefere WebP/AVIF, aber biete Fallbacks. Für Logos und Icons sind SVGs ideal (skalierbar, CSS‑steuerbar) — bei SVGs auf Sicherheit achten (Sanitize SVG). Wenn Bilder im Dark Mode schlecht aussehen, biete alternative Varianten oder setze CSS‑Overlays. Verwende lazy‑loading für below‑the‑fold Bilder, aber achte bei kritischen Bildern auf LCP‑Optimierung.

Wie mache ich ein Theme translation‑ready und mehrsprachig?

Verwende _(), e(), esc_html() etc. mit einer definierten Text Domain in allen Strings. Lade Übersetzungen mit load_theme_textdomain() im Theme‑Setup. Erstelle .pot‑Dateien (z. B. mit Poedit) und liefere /languages/*.po/.mo mit. Für mehrsprachige Seiten können Plugins wie WPML oder Polylang eingesetzt werden — achte darauf, dass dein Theme strings korrekt bereitstellt und Templates kompatibel sind.

Wie teste, debugge und deploye ich ein Theme sicher?

Entwickle lokal oder auf Staging. Aktiviere WP_DEBUG für Entwicklung, prüfe PHP‑ und Browser‑Konsole‑Fehler. Schreibe unit/acceptance tests wenn möglich, nutze BrowserStack für Cross‑Browser‑Tests und Lighthouse für Performance/A11y. Versioniere mit Git, nutze Build‑Pipeline (CI) für Asset‑Builds und automatisierte Tests. Beim Deploy: Backup vor Aktivierung, ggf. Wartungsmodus. Für Updates: Dokumentation, semantische Versionierung und bei Bedarf Child‑Theme/Plugin‑Strategie, damit Anpassungen update­sicher bleiben.

Kontakt

Webdesignstudio WedDesign

Eduard Wischnewski

Am Justusberg 7
41849 Wassenberg

    Ja, ich möchte den Newsletter erhalten