Heute nach langer Zeit mal wieder mal ein kleines Snippet von mir, welches ich selber für ein Projekt benötigt habe. Die Aufgabe war es, Contact Form 7 sowohl in der Mail als auch im Template eine unique ID zuzuweisen um einen eindeutigen Referrer für den Adcell Tracking Code (start eines eigenen Partnerprogramms) zu bekommen. Leider gibt es von Hause aus dafür keine Möglichkeit in CF7, weder als kompletten Hack noch als Extension.
Vorbereitung der Lösung
Natürlich musste ich mir erstmal Gedanken machen, wie das ganze funktionieren sollte. Der Trackingcode benötigt einen eindeutigen Referrer um Anfragen über das Partnerprogramm von denen aus der organischen Suche bzw. Adwords zu unterscheiden.
Benötigt wird also eine eindeutige ID, die lediglich auf der Formularseite erstellt wird und dann auf der „Danke“ Seite im Footer dynamisch in den Trackingcode integriert wird. Nach mehreren Erfolglosen versuchen das ganze über hidden Fields oder Session Vars zu machen, habe ich mich entschlossen, dafür einen Cookie zu setzen. Dieser wird nur bei Aufruf der Formularseite erstellt und ist 24 Stunden gültig um Mehrfachanfragen zu identifizieren.
Folgende Probleme hab ich dabei festgestellt.
- CF7 hat keine Hidden Fields die Funktionen ausführen. Dies ließ sich durch die Installation des Contact Form 7 Dynamic Text Extension beheben.
- Warum auch immer, ließ sich die generierte ID mit den gefundenen Snippets nicht in die Session integrieren. Für eine tiefergehende Recherche warum das so ist fehlt mir allerdings einfach die Zeit und die Lust.
- Der Cookie soll ausschließlich auf der Page mit dem Kontaktformular gesetzt werden und der Trackingcode ausschließlich auf der Danke Seite integriert werden. Letzteres ist einfach mit der WordPress is_page() Funktion bewerkstelligen. Ersteres ist ein Problem da add_action mit init keine is_page() abfrage akzeptiert, da die aufgerufene Seite noch gar nicht ausgelesen wurde. add_action wp dies zwar behebt und den Cookie erstellt, allerdings dann das Formular nicht mehr den Cookie auslesen konnte um ihn ins hidden Field zu packen. Hier musste also eine Zusatzfunktion her, die dies behebt damit die ID auch in der versendeten Mail landet.
Der Code damit alles Funktioniert wie ich mir das vorgestellt habe
Als erstes muss natürlich die Ticket bzw. Tracking ID erstellt werden. Dies geschieht mit folgender Funktion. Füge nachfolgenden Code in deine functions.php ein. Achtung!!! Immer ein Childtheme benutzen, da die Änderungen bei einem Update sonst weg sind.
function wpup_genTicketString()
{
$length = 12;
$characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters) - 1)];
}
return $string;
}
Hier habe ich mich für eine 12 stellige alphanumerische ID, die nur aus Zahlen und Großbuchstaben besteht, entschieden. Das kann sich jeder natürlich individuell anpassen indem er einfach die Werte in $length und $characters ändert. Im nächsten Schritt generieren wir den Cookie mit dieser ID.
function wpup_set_newuser_cookie()
{
if (!is_admin() && !isset($_COOKIE['cf7_ticket']) && is_page('123')) {
setcookie('cf7_ticket', wpup_genTicketString(), time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN, false);
}
}
add_action('wp', 'wpup_set_newuser_cookie');
Der Cookie wird nur erstellt wenn der User kein Admin ist, der Cookie noch nicht gesetzt wurde und die Page mit ID 123 aufgerufen wird. Diese müsst Ihr gegen die ID eurer eigenen Formular Seite austauschen. Ihr bekommt sie, wenn Ihr in WP eingeloggt seid, die Formularseite aufruft und mal mit der Maus auf „Seite bearbeiten“ in der Adminbar geht (post=123).
Im 3. Schritt benötigen wir noch einen Shortcode für das Formular selber der den Platzhalter für die Ticketid in der Mail stellt. Ursprünglich sollte die Tracking ID direkt in ein Hidden Field des Formulares geschrieben werden, aber das funktioniert nur wenn die function mit add_action init aufgerufen wird und dann wird der Cookie bereits beim Aufruf irgendeiner Seite generiert, was ich nicht wollte. Bleibt aber jedem selber überlassen… Möchtest du den Cookie gleich sidewide dann entferne das && is_page(‚123‘) ändere in add_action das ‚wp‘ in ‚init‘.
function wpup_sb_cf7_cookie($atts)
{
extract(shortcode_atts(array(
'key' => -1,
), $atts));
if ($key == -1) return '';
$val = '';
if (isset($_COOKIE[$key])) {
$val = $_COOKIE[$key];
}
return $val;
}
add_shortcode('SB_CF7_COOKIE', 'wpup_sb_cf7_cookie');
Im letzten Schritt muss nun noch der Cookie vor dem Versenden der Anfrage Mail ausgelesen werden und in den Mailbody eingefügt werden. Durch den vorgenannten Code haben wir bereits den passenden Platzhalter dafür in unserem Mailtemplate.
add_action('wpcf7_before_send_mail', 'wpup_save_form');
function wpup_save_form($wpcf7)
{
$submission = WPCF7_Submission::get_instance();
$submited['posted_data'] = $submission->get_posted_data();
//add to array reference code
$submited['posted_data']['ticket'] = $_COOKIE['cf7_ticket'];
$mail = $wpcf7->prop('mail');
// Find/replace the "special" tag as defined in your CF7 email body
$mail['body'] = str_replace("[ticket]", $submited['posted_data']['ticket'], $mail['body']);
// Save the email body
$wpcf7->set_properties(array("mail" => $mail));
return $wpcf7;
}
Das war es eigentlich schon fast. Nun noch das Formular und das Mailtemplate anpassen und schon habt Ihr bei jeder anfrage über euer Formular eine Unique ID.
Das Formular anpassen
Als erstes installieren wir die Dynamic Text Extension für CF7 und aktivieren sie. Dadurch erhaltet Ihr 2 neue Shortcodes für Euer Formular. Wir benötigen den Shortcode „dynamichidden“. Dieser sieht wie folgt aus.
[dynamichidden ticket "SB_CF7_COOKIE key='cf7_ticket'"]
Dynamichidden erstellt ein verstecktes Input field. ticket stellt den Platzhalter bereit, der später im Mailtemplate verwendet wird SB_CF7_COOKIE ruft als shortcode die function wpup_sb_cf7_cookie() auf um den cookie auszulesen, was aber wegen der vorgenannten Probleme mit dem is_page() nicht so funktioniert wie es soll. Somit ist der value im hidden Field erstmal leer. Speilt aber keine Rolle, da der Cookie erstellt wurde und später vor dem Versand der Mail ausgelesen wird. So sieht das komplette Formular aus.
Ins Mail Tempalte muss nun noch der [ticket] Platzhalter. Achtung, die Anpassungen funktionieren nur für die Mail die Ihr selber bekommt. Sollen eure Besucher ebenfalls die Ticket ID in der Mail haben. muss die wpup_save_form erweitert bzw gekloned werden. Also den entsprechenden Part der Function durch diesen ersetzen und den Platzhalter ins Mailtemplate einbauen. Achtung !!! ungetestet da nicht benötigt.
$mail2 = $wpcf7->prop('mail_2');
$mail2['body'] = str_replace("[ticket]", $submited['posted_data']['ticket'], $mail2['body']);
// Save the email body
$wpcf7->set_properties(array("mail" => $mail,"mail_2" => $mail2));
return $wpcf7;
Zum Schluss: Cookie auslesen und Trackingcode in der Danke Seite ausgeben
Dies ist recht einfach. sofern noch nicht vorhanden, kopiert die Datei footer.php in Euer Childtheme. Öffnet sie mit dem Texteditor Eures Vertrauens und fügt am Ende vor wp_footer() folgendes ein.
Den Code innerhalb der if Abfrage könnt Ihr natürlich auch gegen jeden anderen Code tauschen, der eine unique ID benötigt.
321 ist die ID Euerer Danke Seite. Auf diese leitet Ihr mit folgendem Code in den erweiterten Formulareinstellungen weiter. Muss natürlich an Eure URL angepasst werden
Das wars. Sollte jemand eine bessere oder einfachere Lösung haben oder mein Snippet optimieren können, tut Euch keinen Zwang an mir eine Mail zu schreiben oder einen Kommentar zu hinterlassen . Viel Spass


