Theme Reference
Theme Panel
Site settings page.
Sections
- Admin Panel — Gutenberg, admin bar, dashboard
- Security — XML-RPC, REST API, version hiding
- Extensions — Forms, SMTP, Telegram, reCAPTCHA
- WooCommerce — WooCommerce settings
- Theme Settings — Field backend, migration tools
- Search — Search configuration
Abfragen
Erstelle wiederverwendbare WP_Query-/get_terms()-Auswahlen. Nutze sie auf zwei Arten: Ruf ein Query-Preset aus einem PHP-Template auf oder häng eine Custom Query über HTML-Attribute an ein Schleifen-Element.
Aus einem PHP-Template (Query Presets)
Erstelle ein Preset im Unter-Tab Post/Term Query Presets, gib ihm einen Query Code und ruf es im Template-Code auf:
- Posts:
$q = new WP_Query(tf_get_query('your-code')); - Terms:
$terms = tf_get_term_query('your-code'); - Auto-apply: Binde ein Preset im Tab „Auto-apply“ an ein Beitragstyp- oder Taxonomie-Archiv, und es überschreibt die Hauptabfrage automatisch (über pre_get_posts) — ohne Template-Änderung.
Über HTML-Attribute (Custom Queries)
Benenne eine Abfrage im Unter-Tab Custom Queries / Term Queries und verweise dann auf dem Schleifen-Element darauf — oder schreib die Argumente direkt hinein. Nur das erste Kindelement dient als Wiederholungsvorlage.
- Benannt:
<div wp-select="catalog"> … </div>(Alias:wp-query-name) - Inline:
<div wp-query="'post_type'=>'product','posts_per_page'=>8"> - Begriffsliste:
<div wp-term-query="'taxonomy'=>'product_cat','parent'=>0">·wp-term-select="name" - WooCommerce:
<div wp-product-query="get_related_products(4)">
In der Schleife — Felder
Auf Elementen innerhalb der Schleife gibst du Werte mit WordPress-Attributen oder ACF/SCF-Feld-Attributen aus:
- WordPress:
wp="post-title",wp="post-image",wp="post-link",wp="term-title",wp="term-link" - ACF / SCF:
fld-text,fld-image,fld-link,fld-loop(Alternatives Format:f_text,f_image,f_loop)
Kompatibilität
Die Runtime liest drei Quellen in Prioritätsreihenfolge: TF-Presets, dann Query Master (ältere importierte Websites), dann die Abfragen des veralteten Konfigurators. Neue Presets werden immer im TF-Speicher gespeichert; vorhandene Daten funktionieren weiterhin.
Eigene Beitragstypen & Taxonomien
Registriere eigene Beitragstypen und Taxonomien direkt im Panel — jede Wiederholer-Zeile entspricht einem WordPress-Registrierungsaufruf, kein Code nötig.
Eigene Beitragstypen
Jede Zeile entspricht register_post_type(). Das Feld „Name“ ist der Beitragstyp-Schlüssel (Kleinbuchstaben Latein, keine Leerzeichen). Leg Plural-/Singular-/Menü-Bezeichnungen, ein Dashicons-Symbol, die unterstützten Funktionen (Titel, Editor, Beitragsbild, …), den Archiv-URL-Slug, REST/Gutenberg, die öffentliche Abfragbarkeit, einen „Öffentliches Archiv“-Schalter (Feed /slug/ für Service-Typen abschaltbar) fest — und optional eine „Archiv-Landingpage“, die das Archiv bearbeitbar macht (siehe Abschnitt „Archiv-Landingpages“ unten).
Eigene Taxonomien
Jede Zeile entspricht register_taxonomy(). Wähl hierarchisch (wie Kategorien) oder flach (wie Schlagwörter), verknüpfe sie mit einem oder mehreren Beitragstypen und leg Slug und REST-Sichtbarkeit fest.
Wie sie zusammenhängen
Neue Beitragstypen und Taxonomien erscheinen automatisch in den Dropdowns der Query-Presets. Permalinks werden beim Speichern aktualisiert. Templates folgen den WordPress-Konventionen: single-{type}.php, archive-{type}.php, taxonomy-{taxonomy}.php.
Archiv-Landingpages
Eine Archiv-URL (Blog, Shop-Katalog, Archiv eines eigenen Beitragstyps) rendert eine LISTE von Beiträgen — sie hat keine eigene Seite, es gibt dort also normalerweise nichts zu bearbeiten. ThemeForge gibt jedem Archiv eine Landingpage: eine echte Seite aus der Seitenliste, deren Felder zum bearbeitbaren Inhalt des Archivs werden (Hero-Titel, Einleitungstext, Bilder, SEO), während der Feed weiterhin die Liste ausgibt. Redakteure ändern das Archiv wie jede andere Seite.
So funktioniert es
Platziere auf der Archivseite deines Webflow-Projekts (archive-post, archive-product, archive-{type}) Feld-Attribute AUSSERHALB der Listenschleife — also außerhalb des Elements mit wp="posts" / wp="products". Diese Felder werden in der Verwaltung automatisch an die Landingpage angehängt und auf der Archiv-URL von ihr gerendert.
- Außerhalb der Schleife funktioniert jedes Einzelwert-Feld: fld-text, fld-image, fld-link, fld-bg-image, fld-editor und der Rest der fld-*-Familie — plus wp="post-title" und wp="post-content", die Titel und Inhalt der Landingpage selbst ausgeben.
- Felder INNERHALB der Schleife behalten ihre gewohnte Bedeutung: Sie lesen jeden gelisteten Beitrag, genau wie zuvor.
- Mehrsprachige Websites lösen die Landingpage pro Sprache automatisch auf (Polylang / WPML): Jede Sprache bearbeitet ihre eigene Übersetzung der Landingpage.
- SEO: Bei Archiven eigener Beitragstypen speist die Landingpage auch Yoast — das Archiv erhält ihren SEO-Titel und eine korrekte Canonical-URL, auch auf paginierten Seiten.
Blog
Die Blog-Landingpage ist die native WordPress-„Beitragsseite“. Erstelle eine Seite (z. B. /blog/), weise sie unter Einstellungen → Lesen zu, und die außerhalb der Schleife auf dem archive-post-Template platzierten Felder hängen sich an diese Seite — keine weitere Einrichtung nötig.
archive-postWooCommerce-Katalog
Der Shop-Katalog nutzt die WooCommerce-Shop-Seite als Landingpage. Felder außerhalb der Produktschleife auf dem archive-product-Template hängen sich an die Shop-Seite und werden auf der Katalog-URL gerendert.
archive-productEigene Beitragstypen
Ein Archiv eines eigenen Beitragstyps hat in WordPress keine native Landingpage, also fügt ThemeForge eine hinzu: Erstelle eine Seite, deren URL dem Archiv-Slug entspricht (z. B. /portfolio/ für einen Typ mit Archiv-Slug „portfolio“), und wähl sie in der Zeile dieses Beitragstyps im Theme Panel aus. Die Archiv-URL rendert weiterhin das Feed-Template, die gewählte Seite trägt seine bearbeitbaren Felder. Deklariert das Archiv-Template deines Webflow-Projekts eine Feldgruppe, erstellt (oder übernimmt) ThemeForge die Landingpage automatisch — in jeder Sprache der Website, so wie WooCommerce seine Shop-Seite anlegt.
archive-{type}Die gebundene Seite BESITZT die Archiv-URL: Benenne die Seite um, und das Archiv zieht mit (das Slug-Feld ist ausgeblendet, solange eine Seite gebunden ist). Ohne gebundene Seite kommt der Slug aus dem Theme Panel. Die Seite selbst wird nie direkt angezeigt — sie ist die Bearbeitungsfläche hinter dem Archiv.
Gut zu wissen
- Gruppenfelder außerhalb der Schleife (Repeater, Gruppe, Flexible Content, Galerie) werden genau wie Einzelwert-Felder von der Landingpage gelesen. Die einzige Ausnahme ist eine Gruppe mit loop-mode="0" — der Logs-Tab des Projekts markiert sie als „archive-scope-unsupported".
- Ein Feld INNERHALB einer Listenschleife gehört den gelisteten Beiträgen — deklariere es auf dem entsprechenden single-{type}-Template, damit es auf deren Bearbeitungsseiten erscheint.
- Ist keine Landingpage konfiguriert, geht nichts kaputt: Das Archiv rendert exakt wie zuvor. Die Landingpage lässt sich jederzeit ohne Neugenerierung des Themes hinzufügen.
Forms Extension
Built-in form handling.
Features
- SMTP email sending
- reCAPTCHA v3 / v2
- Telegram notifications
- Spamschutz ohne Schlüssel — auf neuen Websites aktiv
- Auto-reply
- JustValidate client-side validation
- CPT
tf_form_entry— submission storage - CSV export
Spamschutz
Funktioniert ohne Schlüssel und externe Dienste. Auf einer neuen Website ist er von Anfang an aktiv; auf einer Website, die bereits Anfragen erhält, schaltest du ihn mit „Grundlegender Spamschutz“ unter Formulare → Einstellungen ein.
- Sortiert Einsendungen aus, die ein verstecktes Fallenfeld ausfüllen, ohne das Seitenskript eintreffen, schneller gesendet werden, als ein Mensch tippen kann, mehrere Links enthalten oder das Bild-Captcha umgehen. Wie oft eine Adresse senden kann, ist begrenzt.
- Aussortierte Einsendungen werden nirgendwohin gesendet: Sie liegen 30 Tage im Spam-Ordner unter Einträge, und eine irrtümlich aussortierte lässt sich mit „Kein Spam“ zurückholen.
- Die eigenen Formulare von WordPress schützt ein separater Schalter „Spamschutz für WordPress-Formulare“, standardmäßig aktiv: Kommentare und Produktbewertungen, Registrierung und Passwort-Zurücksetzung. Ein Kommentar, den ein Bot sendet, ohne die Seite zu öffnen, wird abgelehnt und nirgends gespeichert; ein Grenzfall landet unter Kommentare → Spam; eine verdächtige Registrierung oder Zurücksetzungsanfrage wird mit der Bitte um einen neuen Versuch abgelehnt. Das Anmeldeformular und angemeldete Benutzer werden nicht geprüft.
- Das Bild-Captcha spricht die Sprache der Seite: Die Texte werden pro Sprache festgelegt, und es zeichnet nur Zeichen, die ein Besucher ohne Umschalten des Tastaturlayouts tippen kann (ukrainische, russische, lateinische Buchstaben oder Ziffern).
Gegen Bots, die gezielt einen Menschen nachahmen, hilft reCAPTCHA mit Google-Schlüsseln — sie wird in denselben Einstellungen aktiviert.
wp-field — ein Feldschlüssel, der Umbenennungen übersteht
Standardmäßig wird ein Formularfeld unter der in Webflow eingegebenen Beschriftung übertragen. Wird diese später umbenannt, passen E-Mail-Vorlage und Weiterleitungszuordnung nicht mehr — und zwar stillschweigend, denn die Anfrage kommt weiterhin an. Markiere das Feld (oder seinen Container mit der Beschriftung), und der Schlüssel hängt nicht mehr von der Beschriftung ab.
<input type="tel" wp-field="phone">
<div class="row" wp-field="phone">
<label for="tel">Telefon</label>
<input type="tel" id="tel">
</div>
Der Schlüssel wird beim Generieren des Themes in das Feld geschrieben; danach ist keine Konfiguration nötig. Verwende lateinische Buchstaben, Ziffern, _ und -; vom Formular-System belegte Namen werden abgelehnt und im Projektprotokoll aufgeführt. Felder, deren Name von WordPress oder WooCommerce vorgegeben ist — Kommentare, Bewertungen, Kasse — verwenden ihre eigenen Markierungen.
Engine für benutzerdefinierte Felder
Das Theme speichert benutzerdefinierte Felder über eine ACF-kompatible Engine. Zwei austauschbare Engines teilen sich dieselben Felder und Daten, sodass du ohne Wertverlust wechseln kannst.
Zwei Engines, ein Datenformat
Standard ist Secure Custom Fields — ein kostenloses WordPress.org-Plugin, das sich selbst aktualisiert und alle ACF-PRO-Feldtypen ohne Lizenz bietet. Du bevorzugst dein eigenes lizenziertes ACF PRO? Installiere es, das Theme erkennt es automatisch.
Mehrsprachige Optionen
Integrierte Mehrsprachunterstützung für Theme-Optionen und Seitenfelder. Aktiviert sich automatisch mit Polylang oder WPML.
Funktionsweise
Das Theme erkennt Polylang oder WPML automatisch und lädt die entsprechende Integration.
- Automatische Erkennung: Polylang (pll_current_language) oder WPML (ICL_SITEPRESS_VERSION)
- Sprachspezifische Speicherung: jede Sprache erhält eigene Optionswerte
- Fallback: leere Sprachfelder erben Werte von „Alle (Standard)"
- Benutzerdefinierte Flaggen: eigene Sprachflaggen aus der Mediathek hochladen
Optionen nach Sprache verwalten
Verwende die Sprachumschaltung auf der Optionsseite, um Werte für jede Sprache zu bearbeiten.
| Action | Description |
|---|---|
| „Alle (Standard)" | Master-Werte. Werden als Fallback verwendet, wenn eine Sprache keinen eigenen Wert hat. |
| Bearbeitung pro Sprache | Wechsle zur Sprache, um deren Werte zu bearbeiten. Leere Felder erben von „Alle". |
| Vererbung | Lass ein Feld auf der Sprachseite leer, um im Frontend den Wert von „Alle (Standard)" zu verwenden. |
Felder automatisch übersetzen
Integrierte maschinelle Übersetzung von Feldwerten. Verfügbar in der Seitenleiste auf Bearbeitungs- und Optionsseiten.
- „Übersetzen"-Button neben jedem Textfeld
- „Alle übersetzen" in der Seitenleiste — übersetzt alle Felder auf einmal, auch versteckte Tabs und Repeater
- Link-Felder werden automatisch übersprungen (Erkennung nach Feldname und URL-Muster)
- Kein API-Schlüssel erforderlich — nutzt den kostenlosen Google Translate Endpunkt
- WYSIWYG-Felder (Rich Text) unterstützt — HTML-Struktur bleibt erhalten
Protected Files
These files are preserved during theme updates.
user-functions.php— Custom PHP functionscss/user.css— Custom CSS stylesjs/user.js— Custom JavaScript
CSS-Ladereihenfolge: main.css → themeforge.css → user.css.
Import System
Data and media import from pages.json and menus.json.
Import Order (Important!)
- Step 1: Upload images (import_images)
- Step 2: Import data (import_data)
Images must be uploaded before data import.
Import Actions
| Action | Description |
|---|---|
/?action=import_images | Upload all media files |
/?action=import_data | Import all field data |
/?action=import_page_media&slug=X | Upload media for a specific page |
/?action=import_page_data&slug=X | Import data for a specific page |
/?action=import_menu_data | Import all menus |
Quelle des Seitentitels
Beim Erstellen von WordPress-Seiten während des Imports wird der Seitentitel aus dem Quell-HTML in folgender Priorität übernommen:
<meta property="og:title">— Open Graph<title>— HTML title tag- Template-Name (z.B. „About" aus page-about)
Image Filename Resolution
The import system resolves image filenames using a fallback chain:
- URL-decode filename
- Strip Webflow hash prefix
- sanitize_file_name() + DB LIKE query
Sprachbezogener Import
Füg &lang=xx hinzu, um Daten für eine bestimmte Sprache zu importieren. Die Import-Metabox auf der Bearbeitungsseite erkennt die Seitensprache automatisch.
/?action=import_page_data&slug=theme-options&lang=en| Kontext | Description |
|---|---|
| Theme-Optionen | Speichert Optionen mit einem Locale-Suffix (options_LOCALE_field). Verwende den Sprachumschalter auf der Optionsseite. |
| Seiten | Findet oder erstellt den Polylang-Übersetzungsbeitrag und importiert Daten dorthin. Originalseite wird unabhängig vom Sprachfilter gefunden. |
| Import-Metabox | Auf Seiten: erkennt Sprache aus dem Beitrag (pll_get_post_language). Auf Optionen: liest ?lang= aus der URL. |
Entwickler-Referenz
Technische Details für Entwickler und KI-Assistenten. HTML-Attribute, Feldtypen, Menüsystem, JavaScript-Hooks, Hilfsfunktionen.
Field Types
ACF-/SCF-Feldtyp-Zuordnung. Jeder Attributtyp ist einem bestimmten HTML-Element zugeordnet.
| ACF / SCF Type | Element | Attribute Example |
|---|---|---|
| text | div, span, p, h1-h6 | fld-text="name" |
| textarea | div, p | fld-area="name" |
| wysiwyg | div | fld-editor="name" |
| image | img (src) | fld-image="name" |
| link / url | a (href) | fld-link="name" |
| true_false | wrapper div | fld-show="name" |
| color_picker | any (bg) | fld-bg-color="name" |
| repeater | wrapper div | fld-loop="name" |
| group | wrapper div | fld-group="name" |
| gallery | wrapper div | fld-gallery="name" |
| tab | container div | fld-tab="name" |
Field Groups (wp-fields-group)
The wp-fields-group attribute creates field groups in WordPress admin.
Usage
<div wp-fields-group="Section Name"> ... fields ... </div>- Wraps fields into a named group
- Multiple wp-fields-group groups per page supported
- On theme-options: all groups merge into one container
- Without wp-fields-group: fields generate PHP only
wp-show-editor
WordPress-Texteditor auf Seiten mit benutzerdefinierten Feldern sichtbar halten.
Verwendung
<body wp-show-editor wp-fields-group="Section">- Auf dem <body>-Tag platzieren — standardmäßig ist der Editor auf Seitenvorlagen mit Feldern ausgeblendet
- Zusammen mit wp-fields-group verwenden, wenn die Seite sowohl benutzerdefinierte Felder als auch the_content() benötigt
- Gilt nicht für Einzelbeitragsvorlagen (single, single-product) — der Editor bleibt dort immer sichtbar
ACF-/SCF-Datenkompatibilität
Secure Custom Fields ist ein kostenloser, direkt einsetzbarer Fork von ACF PRO, der auf WordPress.org gepflegt wird. Er ist API-identisch und speichert Werte exakt am selben Ort, sodass SCF, ACF PRO und vorhandene ACF-Daten vollständig austauschbar sind.
Dieselben Felder, dieselben Daten
Ein Engine-Wechsel migriert oder überschreibt deine Inhalte nie — beide Engines lesen dieselben Feldschlüssel aus wp_postmeta / wp_options. Vorhandene ACF-Daten aus einem anderen Theme oder einer manuellen Einrichtung werden anhand des Feldnamens übernommen, unabhängig davon, welche Engine sie erstellt hat.
Vorhandene & Drittanbieter-ACF-Daten
Wenn bereits ACF- (oder SCF-)Daten vorhanden sind — von einem anderen Generator, einem früheren Theme oder einer manuellen Feldgruppe — liest das Theme sie unverändert anhand des Feldnamens. Nichts zu importieren oder zu konvertieren; die Werte erscheinen im Editor unter der jeweils aktiven Engine.
JavaScript Hooks
Benutzerdefinierte Callback-Funktionen in custom.js. Das Theme prüft diese Funktionen und ruft sie zum richtigen Zeitpunkt auf.
Allgemeine Hooks
| Hook | Wann aufgerufen |
|---|---|
tf_webflow_init() | Nach AJAX-Inhaltsladen (Webflow-Interaktionen neu initialisieren) |
tf_after_filter() | Nach dem Laden der AJAX-Filterergebnisse |
WooCommerce-Hooks
| Hook | Wann aufgerufen |
|---|---|
tf_cart_data_modify(data) | Vor dem Hinzufügen zum Warenkorb (Warenkorbdaten ändern) |
tf_after_add_to_cart() | Nach dem Hinzufügen des Produkts zum Warenkorb |
tf_after_cart_data_modify() | Nach Änderung der Warenkorbdaten |
tf_after_variation_change() | Nach Änderung der Produktvariante |
tf_after_recalc_checkout() | Nach Neuberechnung der Kassensummen |
Definiere diese Funktionen in custom.js. Ältere Namen mit wfp_-Präfix werden aus Kompatibilitätsgründen ebenfalls unterstützt.
Benutzerdefinierte Abfragen
Erstelle WP_Query- und Term-Abfragen über die Theme-Panel-Oberfläche — kein Code erforderlich.
Beitragsabfrage
Einrichtung in Theme-Panel → Custom Queries. Jede Abfrage enthält: Name, Beitragstyp, Beiträge pro Seite, Paginierung, Taxonomie-Filter.
$args = select_query_by_name('my_query');
$query = new WP_Query($args);Term-Abfrage
Einrichtung in Theme-Panel → Custom Term Queries. Jede Abfrage enthält: Name, Taxonomie, hide_empty, orderby, order.
$args = select_term_query_by_name('my_terms');
$terms = get_terms($args);Hilfsfunktionen
PHP-Funktionen verfügbar in Templates und user-functions.php.
Allgemein
| Funktion | Gibt zurück |
|---|---|
tf_default_thumbnail() | Standard-Platzhalter-Bild-URL (konfigurierbar in Theme-Einstellungen) |
tf_declense($n, $f1, $f2, $f5) | Slawische Pluralform: korrekte Wortform für eine Zahl wählen |
tf_num_decline($n, $titles) | Plural mit Zahlenpräfix. Akzeptiert Array oder kommagetrennte Zeichenkette. |
search_context($chars) | Textauszug um den Suchtreffer ausgeben |
device_is($type) | Gerät erkennen: phone, tablet, mobile, desktop, ios, android |
WooCommerce
| Funktion | Gibt zurück |
|---|---|
is_sale() | Ob das aktuelle Produkt im Angebot ist |
get_price($type, $format) | Produktpreis: "price", "price_sale", "price_regular". Format: "default", "extreme", "range" |
get_cart_info($info) | Warenkorbsummen: total_without_discount, total_with_discount, discount_amount, discount_percentage, coupon_discounts |
get_cart_volume() | Gesamtvolumen des Warenkorbs in Kubikmetern |