Skip to content

Alles für WordPress, Webentwicklung — und mehr

📋 Vollständiger WordPress-Spickzettel

📋 Vollständiger WordPress-Spickzettel

functions.php geöffnet und vergessen, wie man die Sidebar einbindet? Das passiert jedem, der ein WordPress-Theme von Hand programmiert. Sie brauchen eine Seite griffbereit, nicht zehn Tabs von developer.wordpress.org.

Hier finden Sie das WordPress-Entwicklungs-Essential: 13 Template-Dateien und die Hierarchie zu ihrer Auswahl, den grundlegenden Loop, Include-Tags und bloginfo()-Parameter, danach Hooks und Filter, Conditional Tags, Script-Enqueueing, Shortcodes, WP_Query, Daten-Escaping, REST-API und WP-CLI-Befehle. Alle Codebeispiele funktionieren. Lassen Sie diesen Tab während der Entwicklung geöffnet und prüfen Sie bei Bedarf nach.

💡 Kurzübersicht:

  • Setzen Sie ein Lesezeichen auf diese Seite und halten Sie sie beim Theme-Bau in einem separaten Tab geöffnet.
  • Beginnen Sie mit dem Abschnitt „Anatomie eines Themes": Legen Sie die Theme-Dateien aus der Liste an, bevor Sie Code schreiben.
  • Kopieren Sie den grundlegenden WordPress Loop in die index.php und umschließen Sie ihn mit Include-Tags für Header, Sidebar und Footer.
  • Setzen Sie bloginfo()- und get_bloginfo()-Tags aus der Tabelle direkt in Templates ein und gleichen Sie sie mit der Spalte „Ausgabe" ab.
  • Gehen Sie vor der Veröffentlichung die style.css-Regeln durch: CSS validieren, minimieren und Druck-Styles hinzufügen.
  • Weiter unten auf der Seite die Referenz: Template-Hierarchie, Hooks und Filter, Conditional Tags, Script-Enqueueing, Shortcodes, WP_Query, Escaping, REST-API und WP-CLI.

Anatomie eines WordPress-Themes

Diagramm der WordPress-Theme-Dateistruktur

Ein WordPress-Theme ist ein Satz von PHP-Dateien, die durch eine gemeinsame Logik verbunden und durch die Template-Hierarchie gesteuert werden. Die Schlüsselkomponente: style.css, die das visuelle Styling übernimmt und zugleich als Theme-Kennung im Admin dient. Das Fundament jedes klassischen Themes sind jedoch PHP-Templates: Jedes bearbeitet seinen eigenen Seitenabschnitt und wird in der von der WordPress-Hierarchie vorgegebenen Reihenfolge aufgerufen.

Für ein Standard-Theme benötigen Sie die folgenden Dateien, dreizehn an der Zahl, die jeweils eine bestimmte Site-Zone abdecken:

  • header.php, der <head>-Bereich und Seitenkopf: Metadaten, Seitentitel, Einbindung von style.css, öffnendes <body>-Tag.
  • index.php, das Haupt-Template, Einstiegspunkt. Fügt andere Dateien über Include-Tags zu einer einheitlichen Seite zusammen. Existiert kein spezialisiertes Template, greift WordPress auf index.php zurück.
  • sidebar.php, die Seitenleiste: Widgets, Kategorien, Suche, sekundäres Menü.
  • footer.php, der Footer: Copyright, Social Links, Analyse-Skripte, schließende </body></html>-Tags.
  • page.php, Template für Seiten (statische Inhalte, „Über uns", „Kontakt").
  • single.php, Template für einen einzelnen Blogbeitrag.
  • comments.php, Kommentarblock und Absendeformular.
  • 404.php, 404-Fehlerseite. Fehlt diese Datei, zeigt WordPress eine Standard-Systemmeldung, was für den Besucher schlechter ist.
  • search.php, Template für Suchergebnisse.
  • searchform.php, Suchformular (in klassischen Themes; moderne nutzen oft ein Widget).
  • archive.php, Template für Archive: Kategorien, Schlagwörter, Datumsarchive.
  • functions.php, das funktionale Herz des Themes: eigene Hooks, Script- und Style-Enqueueing, Menü-Registrierung, Widget-Bereiche, Custom Post Types. Alles, was Theme-Funktionalität hinzufügt, lebt hier.
  • style.css, die einzige Nicht-PHP-Datei der Liste, aber ohne sie existiert das Theme nicht: Sie speichert den Theme-Header und definiert das Erscheinungsbild der Site.

Sie kommen mit weniger Templates aus, zum Beispiel bilden index.php + style.css bereits ein Minimal-Theme. Für eine vollwertige Site ist es jedoch besser, alle dreizehn vorzuhalten: Jede Datei ist auf ihre eigene Aufgabe zugeschnitten, und WordPress wählt selbst die richtige nach Hierarchie aus. Eine typische index.php sieht so aus:

1<?php get_header(); ?>
2
3<!-- Main content, including the Loop -->
4
5<?php get_sidebar(); ?>
6<?php get_footer(); ?>

Weiter zum wichtigsten Code-Fragment, ohne das kein einziger Beitrag angezeigt wird.

Der WordPress Loop

Der Loop ist der zentrale Mechanismus zur Ausgabe von Inhalten. Ohne ihn müssten Sie die Anzeige jedes Beitrags und jeder Seite manuell im Theme-Template programmieren. Der Loop tut genau das, was sein Name verspricht: Er durchläuft alle Beiträge, die zur aktuellen Abfrage passen, und wendet auf jeden Ihr festgelegtes HTML/PHP-Markup an.

Grundlegende Loop-Syntax:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <!-- HTML markup and template tags for each post -->
3<?php endwhile; endif; ?>

have_posts() prüft, ob Beiträge zur Ausgabe vorhanden sind. Wenn ja, initialisiert the_post() den internen WordPress-Zeiger auf den aktuellen Beitrag, wonach Dutzende Template-Tags innerhalb des Loops verfügbar werden: the_title() für den Titel, the_content() für den Beitragstext, the_permalink() für den Link, the_excerpt() für den Auszug und viele weitere.

Der Loop steht üblicherweise in der index.php, um eine Beitragsliste auszugeben, aber nichts hindert Sie daran, ihn in single.php, page.php oder archive.php zu verwenden, die Logik ist dieselbe, nur der Kontext unterscheidet sich. Fügen Sie innerhalb des Loops beliebige HTML-Wrapper und PHP-Tags hinzu, WordPress wendet sie der Reihe nach auf jeden Beitrag an.

Praxisbeispiel, Ausgabe von Titel und Datum jedes Beitrags:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <article>
3 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
4 <time><?php echo get_the_date(); ?></time>
5 </article>
6<?php endwhile; endif; ?>

Nun dazu, wie der Loop mit dem Rest des Themes interagiert, über Include-Tags.

Template-Include-Tags

Include-Tags sind PHP-Funktionen, die den Inhalt einer Theme-Datei in eine andere laden. Sie bilden das Skelett einer typischen index.php: Header, Inhalt, Sidebar, Footer. Vier grundlegende Funktionen:

  • <?php get_header(); ?>, bindet header.php ein. Üblicherweise die erste Zeile in index.php und jedem anderen Template, das einen Header benötigt.
  • <?php get_sidebar(); ?>, bindet sidebar.php ein. Wird die Sidebar nicht benötigt, entfernen Sie einfach den Aufruf.
  • <?php get_footer(); ?>, bindet footer.php ein. Steht immer am Ende des Templates und schließt die Seite ab.
  • <?php comments_template(); ?>, bindet comments.php ein. Wird innerhalb von single.php platziert, nach der Ausgabe des Beitragsinhalts.

Alle vier Funktionen suchen die Dateien im aktiven Theme-Ordner. Existiert die Datei nicht, gibt WordPress einfach nichts aus (außer bei get_header() und get_footer(), deren Fehlen das Layout zerstört).

Die nächste Ebene, Tags, die nicht nur Dateien einbinden, sondern Daten aus der Datenbank extrahieren.

Bloginfo-Tags

Beispiel für die Ausgabe von Website-Daten über die bloginfo-Funktion in WordPress

Die bloginfo()-Tags extrahieren Informationen über die Site aus der WordPress-Datenbank, dieselben Informationen, die Sie unter Einstellungen → Allgemein und im Benutzerprofil hinterlegen. Die Funktion gibt einen String zurück und gibt ihn direkt auf dem Bildschirm aus. Die am häufigsten verwendeten Parameter:

Parameter

Ausgabe

<?php bloginfo('name'); ?>

Titel der Website

<?php bloginfo('url'); ?>

URL der Website

<?php bloginfo('description'); ?>

Untertitel (Beschreibung der Website)

<?php bloginfo('charset'); ?>

Zeichensatz (Standard UTF-8)

<?php bloginfo('stylesheet_url'); ?>

URL der style.css des aktiven Themes

<?php bloginfo('version'); ?>

Installierte WordPress-Version

<?php bloginfo('language'); ?>

Sprache der Website

<?php bloginfo('rss_url'); ?>

URL des RSS-Feeds (RSS 0.92)

<?php bloginfo('rss2_url'); ?>

URL des RSS-Feeds (RSS 2.0)

Das ist nur die Spitze des Eisbergs, die vollständige Parameterliste finden Sie in der WordPress-Dokumentation.

Get_bloginfo(), wenn Sie speichern statt ausgeben müssen

Für Fälle, in denen Site-Informationen im Code verwendet und nicht nur auf der Seite angezeigt werden sollen, nutzen Sie die Funktion get_bloginfo():

1<?php $info = get_bloginfo( $show, $filter ); ?>
  • $show, das Schlüsselwort. Unterstützte Werte sind 'name' (Titel), 'url' (Adresse), 'description' (Untertitel), 'admin_email' (Admin-E-Mail) und weitere; vollständige Liste in der Dokumentation.
  • $filter, Filtermodus: 'raw' (Wert „wie er ist", Standard) oder 'display' (Wert wird durch wptexturize() geleitet, wandelt Anführungszeichen, Gedankenstriche, Zeichen um).

Beispiel: Die Seitenbeschreibung abrufen und mit einem Präfix ausgeben:

1<?php $site_description = get_bloginfo( 'description' ); ?>
2<?php echo 'Your site tagline: ' . esc_html( $site_description ); ?>

Ergebnis: „Ihr Website-Untertitel: Beste Premium-WordPress-Themes".

Neben bloginfo verfügt WordPress über ein umfangreiches System von Template-Tags: allgemeine Tags, Autoren-Tags, Thumbnail-Tags, Kategorie-Tags, Link-Tags, die alle sowohl innerhalb als auch außerhalb des Loops funktionieren, und Kombinationen daraus geben Ihnen die volle Kontrolle über die Inhaltsausgabe.

Theme-Stylesheet

style.css erfüllt zwei Aufgaben. Erstens die Identifikation: Der Header ganz oben in der Datei teilt WordPress Theme-Name, Autor, Version und Lizenz mit. Zweitens die visuelle Darstellung: alle CSS-Regeln, die das Erscheinungsbild der Website steuern. Ein Standard-Header sieht so aus:

1/*
2Theme Name: Theme Name
3Theme URI: https://www.example.com/theme
4Author: Your Name
5Author URI: https://www.example.com/
6Description: Responsive WordPress theme with support for...
7Version: 1.0
8License: GNU General Public License v2 or later
9License URI: http://www.gnu.org/licenses/gpl-2.0.html
10Tags: responsive, two-columns, right-sidebar, custom-header
11Text Domain: mythemename
12*/

Bewährte Vorgehensweisen bei der Arbeit mit style.css:

  • Befolgen Sie die WordPress CSS Coding Standards, einheitlicher Stil vereinfacht die Wartung.
  • Validieren Sie das CSS mit dem W3C-Validator.
  • Minifizieren Sie CSS in der Produktion, behalten Sie aber eine lesbare Quelle für die Entwicklung.
  • Fügen Sie Druckstile hinzu (@media print), viele Leser drucken Artikel aus.
  • Stylen Sie alle Standard-HTML-Elemente, die im Beitragsinhalt vorkommen können.

WordPress Template-Hierarchie

Bei jeder Anfrage entscheidet WordPress selbst, welche Theme-PHP-Datei eingebunden wird, das ist die Template-Hierarchie. Eine Regel: von der spezifischsten Datei zur allgemeinsten, mit index.php als letztem Fallback für jeden Zweig. Wer die Reihenfolge kennt, spart sich die Frage „Warum erscheint meine Änderung an single.php nicht auf der Kategorieseite".

1Single post → single-{post_type}-{slug}.php → single-{post_type}.php → single.php → singular.php → index.php
2Page → {template from editor}.php → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php
3Category → category-{slug}.php → category-{id}.php → category.php → archive.php → index.php
4Archive → archive-{post_type}.php → archive.php → index.php
5Search → search.php → index.php
6404 error → 404.php → index.php
7Front page → front-page.php → home.php → index.php

WordPress nimmt die erste existierende Datei von links nach rechts. single-product.php überschreibt also single.php nur für Einträge des Beitragstyps product und lässt den Rest unberührt.

Hooks: Actions und Filter

Hooks sind Erweiterungspunkte in WordPress: Sie erlauben es, in die Kernfunktionalität einzugreifen, ohne deren Dateien zu bearbeiten. Actions führen einen Seiteneffekt aus (Skript einreihen, E-Mail versenden), Filter erhalten einen Wert, modifizieren ihn und müssen ihn zurückgeben. Ein vergessenes return in einem Filter ist die häufigste Ursache für leere Inhalte.

1// Registration
2add_action( 'hook_name', 'callback', 10, 1 ); // priority, number of arguments
3add_filter( 'hook_name', 'callback', 10, 1 );
4
5// Execution (in core or your code)
6do_action( 'hook_name', $arg ); // action: returns nothing
7apply_filters( 'hook_name', $value, $arg ); // filter: RETURNS value
8
9// Removal (priority must match the one used when adding)
10remove_action( 'hook_name', 'callback', 10 );

Beispiel: Einen Absatz am Ende jedes Beitrags hinzufügen:

1add_filter( 'the_content', 'my_append_note', 20 );
2function my_append_note( $content ) {
3 return $content . '<p>Thanks for reading!</p>'; // without return content disappears
4}

Wichtige Theme-Hooks:

  • after_setup_theme, registriert Feature-Unterstützung (add_theme_support()), Menüs, Thumbnail-Größen.
  • wp_enqueue_scripts, der einzig korrekte Ort, um Frontend-CSS und -JS einzureihen.
  • init, frühe Initialisierung: Beitragstypen und Shortcodes registrieren.
  • the_content, filtert Beitrags-HTML vor der Ausgabe.

Niedrigere Priorität läuft früher (Standard 10). Soll ein Callback mehr als ein Argument erhalten, erhöhen Sie den vierten Parameter accepted_args.

Conditional Tags

Conditional Tags sind Funktionen, die true oder false zurückgeben, je nachdem, welche Seite gerade geöffnet ist. Sie bilden die Logik für „Zeige Sidebar hier, aber nicht auf der 404-Seite".

1is_home() // blog post feed
2is_front_page() // site front page
3is_single() // single post
4is_page() // single page
5is_singular() // any single post/page/CPT
6is_archive() // any archive
7is_category() // category archive
8is_search() // search results page
9is_404() // 404 error page
10is_user_logged_in() // user is logged in
11is_admin() // request is in admin (NOT "user is administrator")

Die Hauptfalle: Query Conditional Tags (is_single, is_page, is_home und andere) funktionieren erst, nachdem die Hauptabfrage gebildet wurde, also innerhalb von Template-Dateien und dem Loop oder ab dem template_redirect-Hook. Ein Aufruf zu früh in functions.php oder auf init ist zu zeitig: WordPress gibt _doing_it_wrong() aus und liefert ein falsches Ergebnis. Ausnahmen sind is_admin() und is_user_logged_in(), sie hängen nicht von der Abfrage ab und sind früher verfügbar. Und denken Sie daran: is_admin() prüft den Kontext (Admin vs. Frontend), nicht die Rolle; für die Rolle nutzen Sie current_user_can( 'manage_options' ).

Einreihen von Skripten und Styles

Die Versuchung, <link> und <script> direkt in header.php zu schreiben, ist groß, aber es ist ein Fehler: Sie verlieren Abhängigkeitsmanagement, Versionierung für Cache-Busting, defer/async-Strategien und den Schutz vor doppeltem Laden (zwei Plugins können leicht zweimal jQuery einreihen). Der korrekte Weg ist die WordPress-Warteschlange auf dem wp_enqueue_scripts-Hook.

1add_action( 'wp_enqueue_scripts', 'my_theme_assets' );
2function my_theme_assets() {
3 // Theme style with version from style.css header
4 wp_enqueue_style(
5 'my-theme',
6 get_stylesheet_uri(),
7 array(),
8 wp_get_theme()->get( 'Version' )
9 );
10
11 // Script with dependency and modern syntax (WP 6.3+)
12 wp_enqueue_script(
13 'my-app',
14 get_theme_file_uri( 'assets/js/app.js' ),
15 array( 'jquery' ), // dependencies
16 '1.0.0', // version → cache busting
17 array(
18 'in_footer' => true,
19 'strategy' => 'defer',
20 )
21 );
22}

Seit WordPress 6.3 ist der letzte Parameter von wp_enqueue_script() ein $args-Array (in_footer, strategy), wobei die alte Form mit booleschem true für Footer weiterhin funktioniert. Für das Frontend nutzen Sie wp_enqueue_scripts, für das Admin-Backend admin_enqueue_scripts, für die Login-Seite login_enqueue_scripts.

Shortcodes

Shortcodes verwandeln einen kurzen Eintrag in eckigen Klammern in beliebiges HTML, praktisch für Buttons, Galerien und Formulare innerhalb von Inhalten. Der Handler muss einen String zurückgeben, nicht per echo ausgeben, sonst „springt" das Ergebnis an den Seitenanfang.

1add_shortcode( 'btn', 'my_button_shortcode' );
2function my_button_shortcode( $atts, $content = null, $tag = '' ) {
3 $a = shortcode_atts(
4 array( 'url' => '#', 'label' => 'Button' ),
5 $atts,
6 $tag
7 );
8 return sprintf(
9 '<a class="btn" href="%s">%s</a>',
10 esc_url( $a['url'] ), // escape on output
11 esc_html( $a['label'] )
12 );
13}
14// Usage in post: [btn url="https://example.com" label="Buy"]

shortcode_atts() legt Benutzerattribute über Standardwerte. Müssen Sie Shortcodes innerhalb eines Strings oder Templates ausführen, umschließen Sie sie mit do_shortcode(), aber um Ihre eigene Funktion aufzurufen, rufen Sie sie direkt auf, ohne den Umweg.

WP_Query und benutzerdefinierte Abfragen

WP_Query ist die Klasse für beliebige Beitragsauswahlen: neueste Nachrichten in der Sidebar, Kategorie-Zusammenstellung, Feed eines benutzerdefinierten Beitragstyps. Rufen Sie nach Ihrem Loop immer wp_reset_postdata() auf, sonst erhalten Template-Tags weiter unten auf der Seite den falschen Beitrag.

1$q = new WP_Query( array(
2 'post_type' => 'post',
3 'posts_per_page' => 5,
4 'category_name' => 'news',
5 'orderby' => 'date',
6 'order' => 'DESC',
7) );
8
9if ( $q->have_posts() ) {
10 while ( $q->have_posts() ) {
11 $q->the_post();
12 the_title( '<h3>', '</h3>' );
13 }
14 wp_reset_postdata(); // restore global $post
15}

Um die Hauptabfrage der Seite zu modifizieren (zum Beispiel Anzahl der Beiträge auf der Startseite), nutzen Sie nicht das veraltete query_posts(), es führt eine zusätzliche Datenbankabfrage aus und zerstört die Paginierung. Der korrekte Ansatz ist der pre_get_posts-Hook, der die Abfrage vor ihrer Ausführung modifiziert:

1add_action( 'pre_get_posts', 'my_main_query' );
2function my_main_query( $query ) {
3 if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
4 $query->set( 'posts_per_page', 12 );
5 }
6}

Sicherheit: Escaping und Sanitization

Die goldene WordPress-Regel: Bereinigen Sie bei der Eingabe, escapen Sie bei der Ausgabe, validieren Sie überall. Jegliche Nutzerdaten werden vor dem Speichern in der Datenbank gesäubert und vor der Ausgabe in HTML escaped, selbst wenn sie bereits gesäubert wurden.

1// Escaping ON OUTPUT
2echo esc_html( $text ); // text inside tag
3echo esc_attr( $value ); // attribute value
4echo esc_url( $href ); // href/src links
5echo wp_kses_post( $rich_html ); // safe HTML set for content
6
7// Sanitization ON INPUT (before writing to DB)
8$clean = sanitize_text_field( $_POST['name'] );
9$email = sanitize_email( $_POST['email'] );
10$num = absint( $_POST['count'] );

Schützen Sie Formulare und Aktionen mit Nonces, einmaligen Tokens gegen CSRF:

1// In form:
2wp_nonce_field( 'my_save_action', 'my_nonce' );
3
4// During processing:
5if ( ! isset( $_POST['my_nonce'] ) ||
6 ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) {
7 return; // request rejected
8}

In der Praxis sind die meisten Theme- und Plugin-Schwachstellen genau versäumtes Output-Escaping. Machen Sie es sich zur Gewohnheit: Keine einzige Variable geht ohne esc_* in HTML.

WordPress REST API

Die REST API liefert Seitendaten im JSON-Format, genutzt von mobilen Apps, Headless-Frontends und Integrationen. Die Basisadresse lautet /wp-json/wp/v2/.

1GET /wp-json/wp/v2/posts // posts
2GET /wp-json/wp/v2/pages // pages
3GET /wp-json/wp/v2/media // media files
4GET /wp-json/wp/v2/users // users
5GET /wp-json/wp/v2/posts/123 // single post
6GET /wp-json/wp/v2/posts?per_page=5&search=theme&_embed

Eigene Routen werden am rest_api_init-Hook registriert. Der Parameter permission_callback ist verpflichtend, ohne ihn gibt WordPress eine Warnung aus; für öffentliches Lesen nutzen Sie '__return_true'.

1add_action( 'rest_api_init', function () {
2 register_rest_route( 'myplugin/v1', '/items/(?P<id>\d+)', array(
3 'methods' => 'GET',
4 'callback' => 'my_get_item',
5 'permission_callback' => '__return_true',
6 ) );
7} );

WP-CLI: Befehle zur Hand

WP-CLI verwaltet die Seite vom Terminal aus, schneller und zuverlässiger als Klicks im Admin, besonders bei der Pflege mehrerer Seiten. Die gängigsten Befehle:

1wp core update # update WordPress core
2wp core version # what version is installed
3wp plugin install akismet --activate # install and activate plugin
4wp plugin list # plugin list with status and version
5wp theme activate twentytwentyfive # switch active theme
6wp db export backup.sql # database dump to file
7wp search-replace 'old.com' 'new.com' --dry-run # always dry run first
8wp user create bob [email protected] --role=editor # create user
9wp cache flush # flush object cache

wp search-replace versteht serialisierte Daten, ändert also beim Umzug einer Seite sicher die Domain, anders als eine direkte SQL-Abfrage, die die Serialisierung zerstört. Führen Sie vor jeder gefährlichen Operation wp db export aus.

Klassische und Block-Themes im Jahr 2026

Mitte 2026 (aktuelle Version: WordPress 7.0 „Armstrong", empfohlenes PHP 8.3+) sind klassische PHP-Themes weiterhin voll unterstützt und bleiben der am weitesten verbreitete Typ. Aber alle neuen Core-Werkzeuge entwickeln sich in Richtung Block-Themes und Full Site Editing (Full Site Editing): theme.json statt eines Teils der functions.php-Einstellungen, HTML-Templates statt PHP. Der Loop, bloginfo(), Conditional Tags und Hooks bleiben in Hybrid-Themes und jeglichen PHP-Fragmenten innerhalb von FSE-Themes relevant, sodass dieser Spickzettel seinen Wert nicht verliert. Der praktische Weg im Jahr 2026 ist ein klassisches Fundament plus gezielte Block-Unterstützung dort, wo sie tatsächlich benötigt wird.

⁉️🤔 Häufig gestellte Fragen

Ist es zwingend erforderlich, alle 13 Dateien für ein Theme zu erstellen?

Nein, das minimale funktionsfähige Theme besteht aus index.php + style.css. Für eine voll ausgestattete Website ist es jedoch besser, den vollständigen Satz beizubehalten: Jede Datei gibt WordPress die Möglichkeit, das optimale Template auszuwählen. Ohne single.php beispielsweise wird ein Beitrag über index.php gerendert und verliert den Kommentarblock.

Was ist der Unterschied zwischen get_bloginfo() und bloginfo()?

bloginfo() gibt den Wert sofort auf dem Bildschirm aus (echo). get_bloginfo() gibt einen String an eine Variable zurück, Sie können ihn verarbeiten, an ihn anhängen oder ihn innerhalb eines anderen Ausdrucks verwenden, bevor die eigentliche Ausgabe erfolgt.

Wo platziere ich den Loop, wenn die Seite mehrere Inhaltstypen hat?

Der Loop kann mehrfach gestartet werden. Typisches Szenario: ein Loop für die Hauptbeitragsliste, ein zweiter für ein Widget „Aktuelle Nachrichten" in der Seitenleiste. Setzen Sie vor dem zweiten Loop den Zeiger mit wp_reset_postdata() zurück, andernfalls erhält der nachfolgende Code auf der Seite den falschen Beitragskontext.

Funktioniert dieser Spickzettel für Block-Themes (FSE)?

Teilweise. Block-Themes (Full Site Editing) verwenden theme.json anstelle von functions.php für viele Einstellungen und Templates in HTML statt PHP. Aber der Loop, bloginfo() und Include-Tags bleiben für hybride Themes und alle PHP-Templates innerhalb von FSE-Themes relevant.

Was tun, wenn die functions.php zu umfangreich wird?

Lagern Sie die Logik in separate Dateien aus und binden Sie diese aus functions.php über require_once oder include ein. Zum Beispiel: require_once get_template_directory() . '/inc/custom-post-types.php';. Dies verbessert die Lesbarkeit und vereinfacht die Wartung, eine Best Practice für jedes Theme mit mehr als 20-30 Hooks.

Was ist der Unterschied zwischen einer Action und einem Filter?

Eine Action führt einen Seiteneffekt aus und gibt nichts zurück (ein Skript einreihen, eine E-Mail senden). Ein Filter empfängt einen Wert, modifiziert ihn und muss ihn zurückgeben, ein vergessenes return in einem Filter löscht den Inhalt. Sie werden identisch registriert: add_action() und add_filter().

Warum funktioniert is_single() nicht in der functions.php?

Query Conditional Tags sind erst verfügbar, nachdem die Hauptabfrage gebildet wurde, also in Template-Dateien oder ab dem template_redirect-Hook. Zu Beginn der functions.php ist die Abfrage noch nicht bereit, sodass WordPress _doing_it_wrong() ausgeben wird. Nur is_admin() und is_user_logged_in() funktionieren ohne Abfrageabhängigkeit.

Was Sie bei der Entwicklung mit WordPress griffbereit haben sollten

Dieser Spickzettel ist das Gerüst, von dem aus die WordPress-Entwicklung beginnt. Theme-Dateien und Template-Hierarchie, der Loop, Include-Tags und bloginfo() setzen das Theme zusammen, während Hooks und Filter, Conditional Tags, das Einreihen von Skripten, Shortcodes, WP_Query, Escaping, REST API und WP-CLI die überwiegende Mehrheit der Routineaufgaben abdecken. Der Rest ist Übung und Dokumentation.

Für ein vertieftes Studium ist das Theme-Entwicklerhandbuch auf developer.wordpress.org die erste Adresse. Die Referenz der Template-Tags mit Hunderten von Funktionen für alle Gelegenheiten finden Sie ebenfalls dort. Wenn Sie von einem HTML-Layout zu einem fertigen Theme gelangen möchten, beginnen Sie mit der Schritt-für-Schritt-Anleitung zur Erstellung eines WordPress-Themes aus HTML, wo der Loop und Tags im praktischen Kontext erklärt werden, vom Layout zum funktionierenden Theme.

Setzen Sie ein Lesezeichen für diesen Spickzettel und halten Sie ihn während der Entwicklung griffbereit.

Welchen Tag oder Hook schlagen Sie am häufigsten nach? Schreiben Sie in die Kommentare, auf welche WordPress-Aufgabe Sie gestoßen sind, und teilen Sie Ihren Anwendungsfall, der Austausch von Praxiserfahrung ist ein Dutzend offizieller Leitfäden wert.