Start / Blog / Wordpress / Special mail-tags in CF 7 außerhalb des Post Contents

Special mail-tags in CF 7 außerhalb des Post Contents

Zusammenfassen mit ChatGPT

Contact Form 7 (CF7) gehört zu den beliebtesten Kontaktformular-Plugins für WordPress. Es bietet eine Vielzahl von Funktionen, darunter sogenannte Post-spezifische Mail-Tags wie [_post_id], [_post_title] oder [_post_author_email].

Mit diesen speziellen Tags lassen sich ganz einfach Informationen über den Post abrufen, in dem ein Formular eingebettet ist. Doch was passiert, wenn ein Formular außerhalb des eigentlichen Post-Inhalts (z. B. in einer Sidebar oder einem Widget) eingebunden ist? Genau hier entsteht ein Problem.

Ohne Anpassungen würden Tags wie [_post_author_email] oder [_post_title] im Contact Form 7 Formular leer bleiben.

Warum wir unser Sidebar-Formular benötigt haben und optimiert haben

Als wir bei Konfuzio unser Sidebar-Formular eingeführt haben, wollten wir Leserinnen und Lesern eine einfachere und gezieltere Möglichkeit bieten, mit den Autorinnen und Autoren unserer Beiträge in Kontakt zu treten. Besonders wichtig war uns dabei, dass wir den Prozess sowohl für die Leser als auch für die Autorinnen effizient und sicher gestalten. Von dort aus ergab sich eine spannende Aufgabe: Wie können wir die E-Mail-Adresse der Autorin oder des Autors dynamisch in das Formular integrieren, ohne sie dabei öffentlich im Frontend preiszugeben?

Warum das Formular für uns so wichtig ist:

  1. Direkter Kontakt zum Autor/Kontaktschnittstelle für Leser
    Leserinnen und Leser haben oft spezifische Nachfragen oder möchten das im Artikel behandelte Thema weiter vertiefen. Unser Ziel war es, darüber eine direkte Brücke zu den Autorinnen des Contents zu schlagen – nicht etwa über ein anonymes Feedback-System, sondern über ein zielgerichtetes und kontextgetriebenes Kommunikationstool. Gleichzeitig konnten wir verhindern, dass die E-Mail-Adresse des Autors direkt sichtbar im Frontend erscheint, um Spam oder Missbrauch zu vermeiden.
  2. Gezieltes Feedback für kontinuierliche Qualitätsverbesserung
    Gutes Feedback ist essenziell, um qualitativ hochwertige Inhalte zu schaffen und weiterzuentwickeln. Mit dem Formular geben wir Leserinnen die Möglichkeit, nicht nur direkte Rückfragen zu stellen, sondern auch Feedback zu unseren Inhalten zu geben. Welche Themen bewegen sie? Wo gibt es möglicherweise noch Informationslücken? Dieses Feedback wird direkt an unsere Redaktions- und Autorenteams weitergeleitet und hilft dabei, Inhalte langfristig zu verbessern.
  3. Trigger für regelmäßige Bearbeitung und Updates von Posts
    Ein weiterer positiver Effekt des Formulars ist, dass es unsere Autorinnen und Autoren daran erinnert, ihre Beiträge regelmäßig zu überprüfen und fortlaufend aktuelle Informationen hinzuzufügen. Ein Leser, der einen Post anfragt oder kommentiert, ist ein Zeichen dafür, dass der Inhalt für unsere Zielgruppe relevant bleibt. Dies war Motivation genug für uns, an einer robusten Lösung zu arbeiten, die diese Funktion auch in der Sidebar ohne Einschränkungen ermöglicht.
  4. Lob und Belohnung für engagierte Autorinnen und gute Inhalte
    Inhalte, die Leserinnen aktivieren und zu direktem Austausch mit den Autorinnen anregen, sind für uns ein Zeichen, dass wir nicht nur Themen entwickeln, sondern Beziehungen mit unserer Community aufbauen. Dem Autor oder der Autorin eines Posts die Möglichkeit zu geben, Kontakt zu motivierten Lesern zu haben, ist eine Art Belohnung für die Mühe, die in den Content geflossen ist – ein Anreiz, weiteren hochwertigen Content zu erstellen.

Die technische Herausforderung

Eines unserer größten Hindernisse war, dass Contact Form 7 standardmäßig keine [_post_*]-Tags unterstützt, wenn Formulare außerhalb des Inhalts eines Posts eingebunden werden – wie in unserem Fall in der Sidebar. Ohne Anpassungen würden Tags wie [_post_author_email] oder [_post_title] leer bleiben.

Mit einer maßgeschneiderten Lösung haben wir dieses Problem umgangen. Dank dynamischer Einbindung der Post-ID als verstecktes Feld konnten wir die Tags serverseitig füllen und sämtliche Kontextinformationen sicher abrufen. Mit dieser Lösung funktioniert unser Formular jetzt auch in der Sidebar zuverlässig, und unsere Leserinnen und Autoren profitieren gleichermaßen von einem reibungslosen Feedback-Prozess.

Funktionsweise der Post-spezifischen Mail-Tags

Die genannten [_post_*]-Tags in CF7 erlauben es, automatisch Daten des Posts in die E-Mail zu integrieren, die beim Absenden des Formulars verschickt wird.

Dazu gehören:

  • [_post_id]: Liefert die ID des aktuellen Posts.
  • [_post_name]: Der Slug (Name) des Posts.
  • [_post_title]: Der Titel des jeweiligen Posts.
  • [_post_url]: Die URL des Posts.
  • [_post_author]: Der Name des Post-Autors.
  • [_post_author_email]: Die E-Mail-Adresse des Post-Autors.

In der Theorie sind diese Tags ein cleveres Werkzeug, um dynamische Inhalte je nach Post einzubinden, ohne jedes Mal ein eigenes Formular für jeden Post manuell zu erstellen.

Problem:

Diese [_post_*]-Tags funktionieren allerdings nur, wenn das Formular Teil des Post-Inhalts ist, also innerhalb des Content-Bereichs eingebettet wird. Wenn das Formular hingegen in der Sidebar, in einem Widget oder einer Theme-Datei (etwa single.php) geladen wird, sind diese speziellen Tags leer. Dies liegt daran, dass CF7 den Post-Kontext außerhalb des eigentlichen Inhalts nicht automatisch erkennt.

Warum treten diese Probleme auf?

Contact Form 7 ist darauf angewiesen, dass das Formular in einer Umgebung gerendert wird, in der die WordPress Haupt-Query (Main Query) den aktuellen Post korrekt setzt. Wenn ein Formular jedoch in einer Sidebar oder einem Widget eingebunden wird, fehlt der direkte Bezug zur Main Query. CF7 weiß in diesem Fall nicht, welcher Post aktuell dargestellt wird, und füllt die [_post_*]-Tags dementsprechend nicht aus.

Beispiel: Ein Formular in der Sidebar

Angenommen, Sie haben ein Blogpost mit der ID 123 und ein CF7-Formular in der Sidebar. Das Formular sollte eigentlich den Titel My Blog Post und die E-Mail-Adresse des Post-Autors einfügen. Da das Formular jedoch außerhalb des Posts gerendert wird, bleiben die Tags wie [_post_title] und [_post_author_email] leer.

Lösung: Dynamische Erkennung des Post-Kontexts

Um dieses Problem zu lösen, können wir den Post-Kontext manuell und serverseitig hinzufügen, sodass die benötigten Tags in jeder Umgebung funktionieren — auch in der Sidebar oder in Widgets. Hier zeigen wir eine Lösung mit zwei einfachen Schritten:

Schritt 1: Post-ID als Hidden Field hinzufügen

Zunächst stellen wir sicher, dass die aktuelle Post-ID jedem Formular hinzugefügt wird, unabhängig davon, wo es eingebettet ist. Hierzu nutzen wir den Hook wpcf7_form_hidden_fields, um ein verstecktes Feld mit der Post-ID (post_id) in das Formular einzufügen:

/**
 * Add the current post ID as a hidden field in CF7 forms.
 */
add_filter('wpcf7_form_hidden_fields', function ($hidden_fields) {
    if (is_singular()) {
        global $post;
        $post_id = get_queried_object_id() ?: ($post->ID ?? null);
        if ($post_id) {
            $hidden_fields['post_id'] = absint($post_id); // Ensure the post ID is valid and sanitized.
        }
    }
    return $hidden_fields; // Return the modified hidden fields.
});

Erklärung:

  • is_singular(): Prüft, ob der aktuelle Post eine einzelne Seite, ein einzelner Beitrag oder ein benutzerdefinierter Post-Typ ist.
  • Die Post-ID wird als post_id im Feld $_POST des Formulars gespeichert und steht somit bei der Verarbeitung des Formulars zur Verfügung.

Schritt 2: Dynamische Verarbeitung der _post_*-Tags

Nun implementieren wir einen Hook, der die [_post_*]-Tags bei der Formularverarbeitung dynamisch füllt. Mit diesem Ansatz wird geprüft, ob eine Post-ID vorliegt, und die entsprechenden Daten werden dynamisch abgerufen.

/**
 * Dynamically populate all _post_* tags using the post ID passed as a hidden field.
 */
add_filter('wpcf7_special_mail_tags', function ($output, $tag_name) {
    // Process only _post_* tags.
    if (preg_match('/^_post_(id|name|title|url|author|author_email)$/', $tag_name, $matches)) {
        // Retrieve the post_id from the hidden fields in the form submission (sent through POST).
        $post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : null;
        // If a valid post ID is available, resolve the tag dynamically.
        if ($post_id) {
            switch ($tag_name) {
                case '_post_id':
                    return $post_id;
                case '_post_name':
                    return get_post_field('post_name', $post_id); // Retrieve the post slug.
                case '_post_title':
                    return get_the_title($post_id);
                case '_post_url':
                    return get_permalink($post_id);
                case '_post_author':
                    $author_id = get_post_field('post_author', $post_id);
                    return get_the_author_meta('display_name', $author_id);
                case '_post_author_email':
                    $author_id = get_post_field('post_author', $post_id);
                    $author_email = get_the_author_meta('user_email', $author_id);
                    return !empty($author_email) ? esc_html($author_email) : 'fallback@example.com';
                default:
                    return $output;
            }
        }
        // Return an empty value if the post ID is not available.
        return '';
    }
    // Default output for tags not matching _post_*.
    return $output;
}, 10, 2);

Erklärung:

  • Durch die Integration in wpcf7_special_mail_tags können wir jedes Tag individuell behandeln.
  • Die Daten (_post_id, _post_author_email, etc.) werden serverseitig auf Basis der Post-ID abgerufen.

Anwendungsbeispiel

  • In der Sidebar:
    Binden Sie das Formular mit

    Fehler: Kontaktformular wurde nicht gefunden.

    in die Sidebar ein:
<aside>
    <?php echo do_shortcode('[contact-form-7 id="123"]'); ?>
</aside>
  • CF7-Mail-Einstellungen:
    Nutzen Sie die _post_*-Tags in der Mail-Konfiguration:
  Post ID: [_post_id]
  Post Name: [_post_name]
  Post Title: [_post_title]
  Post URL: [_post_url]
  Post Author: [_post_author]
  Post Author Email: [_post_author_email]

Ergebnis:

Obwohl das Formular in der Sidebar eingebettet wird, werden die Werte korrekt ergänzt.

Fazit

Die Verwendung von Post-spezifischen Mail-Tags in Contact Form 7 außerhalb des Post-Inhalts ist standardmäßig problematisch. Durch die beschriebenen Anpassungen können wir sicherstellen, dass alle relevanten Post-Daten zuverlässig auch in der Sidebar oder Widgets verfügbar sind. Diese Lösung ist datenschutzfreundlich, sicher und dynamisch — und lässt die _post_*-Tags wieder wie gewohnt funktionieren.

Fanden Sie die Seite hilfreich?

Vielen Dank für Ihr Feedback!

Würden Sie mir Feedback geben? (anonym)

Wir entwickeln KI-Software für Unternehmen und verzichten bewusst auf störende Werbebanner. Durch unsere Artikel dokumentieren wir Themen, die uns beschäftigen, interessieren und auch unser tägliches Brot finanzieren.

Da unsere Inhalte kostenfrei sind, ist Ihr Feedback unser Lob.

Jeder Autor liest Ihr anonymes Feedback persönlich, obwohl KI es automatisieren könnten, und integriert konstruktive Vorschläge direkt in die nächste Überarbeitung oder nutzt es als Inspiration für den nächsten Artikel.



    de_DEDE