Dynamische Formulare und Eingabemasken in WordPress: Tipps & Umsetzung mit HTML
Dynamische Formulare sind zentral für Interaktion, Leads und Prozessautomatisierung. In WordPress lassen sie sich als Custom-Code, mit Form-Plugins oder als Hybrid (Plugin + Custom-JS) umsetzen. Unten findest du ein sauberes HTML-Grundgerüst mit Fokus auf Barrierefreiheit, Validierung und WordPress-Konformität.
1) HTML-Grundlage für WordPress-Formulare
Statt eine eigene formularverarbeitung.php
aufzurufen, empfiehlt sich in WordPress die Nutzung von admin-post.php
(inkl. Nonce) – so bleibt es update-sicher und kompatibel mit Plugins/Caching.
<form action="/wp-admin/admin-post.php" method="post" novalidate aria-describedby="formHinweis">
<p id="formHinweis">Alle mit * gekennzeichneten Felder sind Pflichtfelder.</p>
<input type="hidden" name="action" value="kontakt_absenden">
<input type="hidden" name="kontakt_nonce" value="<?php echo wp_create_nonce('kontakt_nonce'); ?>">
<label for="name">Name *</label>
<input id="name" name="name" type="text" required autocomplete="name">
<label for="email">E-Mail *</label>
<input id="email" name="email" type="email" required inputmode="email" autocomplete="email">
<label for="nachricht">Nachricht *</label>
<textarea id="nachricht" name="nachricht" required rows="6"></textarea>
<!-- Honeypot gegen Spam -->
<div class="hp" aria-hidden="true">
<label for="website">Website</label>
<input id="website" name="website" type="text" tabindex="-1" autocomplete="off">
</div>
<button type="submit">Absenden</button>
</form>
Serverseitige Verarbeitung (Beispiel im Theme/Plugin)
<?php
// functions.php (oder eigenes Mini-Plugin)
add_action('admin_post_nopriv_kontakt_absenden', 'handle_kontakt_form');
add_action('admin_post_kontakt_absenden', 'handle_kontakt_form');
function handle_kontakt_form() {
if ( empty($_POST['kontakt_nonce']) || ! wp_verify_nonce($_POST['kontakt_nonce'], 'kontakt_nonce') ) {
wp_die('Sicherheitsprüfung fehlgeschlagen', 403);
}
// Honeypot
if ( ! empty($_POST['website']) ) {
wp_safe_redirect(home_url('/danke/?spam=true')); exit;
}
$name = sanitize_text_field($_POST['name'] ?? '');
$email = sanitize_email($_POST['email'] ?? '');
$msg = wp_kses_post($_POST['nachricht'] ?? '');
if ( empty($name) || empty($email) || empty($msg) || ! is_email($email) ) {
wp_safe_redirect(home_url('/kontakt/?error=1')); exit;
}
wp_mail(get_option('admin_email'), 'Neue Kontaktanfrage', "Von: $name <$email>\n\n$msg");
// Optional: in DB speichern oder an API senden
// wp_remote_post( 'https://api.example.com/leads', [ 'body' => [ 'name' => $name, 'email' => $email, 'message' => $msg ] ] );
wp_safe_redirect(home_url('/danke/')); exit;
}
2) Styling & Interaktion (barrierearm & performant)
Nutze semantische Labels, klare Fokuszustände und sichtbare Fehlermeldungen. CSS nach Möglichkeit in eine Datei auslagern; hier ein kompaktes Beispiel:
<style>
form { max-width: 640px; }
label { display:block; margin:.5rem 0 .25rem; }
input, textarea, button { width:100%; padding:.75rem; border:1px solid #ccc; border-radius:.5rem; }
input:focus, textarea:focus { outline:2px solid; outline-offset:2px; }
.error { margin-top:.25rem; font-size:.875rem; }
.hp { position:absolute; left:-9999px; }
</style>
Clientseitige Validierung (progressive Enhancement)
<script>
(function(){
const form = document.querySelector('form[action*="admin-post.php"]');
if(!form) return;
form.addEventListener('submit', function(e){
const email = document.getElementById('email');
if(email && !email.value.includes('@')){
e.preventDefault();
alert('Bitte gib eine gültige E-Mail-Adresse ein.');
email.focus();
}
});
})();
</script>
3) Dynamik: Bedingte Felder, Masken & Live-Checks
- Bedingte Felder: Zeige Zusatzeingaben erst, wenn eine Auswahl getroffen wurde (z. B. Firma/Privat).
- Eingabemasken (Input Masks): Für Tel.-Nummern oder Postleitzahlen via JS (z. B.
pattern
im HTML, oder eine kleine Masking-Lib). - Live-Validierung:
input
/change
-Listener für unmittelbares Feedback; Server-Checks viawp_ajax_*
möglich.
4) Integration in WordPress
HTML kann direkt im Block-Editor (Custom-HTML-Block) oder als Shortcode/Mini-Plugin eingebunden werden. Für komplexe Use-Cases sind Form-Plugins ideal (z. B. Contact Form 7, Gravity Forms, Ninja Forms, Fluent Forms). Vorteile: Drag-&-Drop-Felder, Spam-Schutz, Webhooks, Zapier/Make-Anbindung, Datei-Uploads.
5) Sicherheit & Performance
- Nonce & Sanitizing: Immer Nonce prüfen und Eingaben säubern.
- Spam-Schutz: Honeypot + Zeitstempel; optional reCAPTCHA/Turnstile.
- Caching: Form-Endpoints vom Full-Page-Cache ausschließen.
- DSGVO: Zweck, Speicherort, Aufbewahrungsdauer nennen; Einwilligung (Checkbox) protokollieren.
Fazit
Mit sauberem HTML, barrierebewusstem UI, solider Validierung und WP-konformer Verarbeitung implementierst du dynamische, skalierbare Formulare – als Custom-Lösung oder per Plugin-Hybrid.