איך לערוך אימייל שיוצא מ-Contact Form 7 באופן דינאמי

‏ • 3 במאי, 2017

לפני מספר ימים נתקלתי בדילמה הזו, וחשבתי לשתף בפיתרון שהגעתי אליו. תחילה אציג את הבעיה: לפלאגין Contact Form 7 של וורדפרס, שהוא הפלאגין הפופולארי ביותר ליצירה וניהול טפסים בוורדפרס, יש מנגנון מובנה ששולח אימייל למנהל האתר (או לכל יעד אחר שמגדירים לו) לאחר שהגולש ממלא את הטופס.

יש מקרים שבהם אנחנו רוצים לקלוט ערך אוטומטי כלשהו לטופס, כזה שהמשתמש לא צריך להזין (או לראות בכלל), וכזה שהוא לא ידוע מראש.

דוגמא אחת – נניח שאנחנו צריכים לקלוט את כתובת העמוד שממנה התבצעה הפניה, או פרמטר מעקב אחר כלשהו שנמצא בכתובת של האתר כשהמשתמש מגיע לעמוד שמכיל את הטופס. בדוגמא הזו, הפיתרון הקלאסי בעיני הוא בצד הלקוח. השיטה שאני משתמש בה היא ליצור את השדה הנסתר ב-Contact Form 7 עצמו, להשאיר את הערך ריק ונסתר, ואז כשהגולש מגיע לדף שמכיל את הטופס – לשתול בצורה נסתרת את הערך הרלוונטי בשדה הנסתר, מה שיגרום לכך שכשהטופס ישלח – הפרמטר יתעדכן וכמובן יכלל באימייל שנשלח למנהל האתר. בשיטה הזו אפשר לתת למנהל האתר חיווי על מקור ההפנייה של הגולשים, ויש כמובן עוד הרבה שימושים האחרים.

דוגמא שניה, מורכבת יותר – באתר מסויים הייתי צריך לשמור את כל הנתונים שממולאים בטופס לתוך Custom Post Type. מסיבות שונות לא יכלתי להשתמש בפלאגינים הנפוצים לשמירת המידע כמו Flamingo ודומיו, אלא הייתי צריך CPT משלי. הפיתרון שהשתמשתי בו הוא להצמיד hook ל-wpcf7_before_send_mail, שבהתאם לשם שלו – רץ אחרי שהגולש מילא את הטופס אך עוד לפני שהפלאגין שולח את האימייל למנהל האתר, ושם אני קולט את כל מה שהמשתמש מילא, ויוצר מהמידע הזה CPT חדש.

הנה הקוד עד השלב הזה:

add_action('wpcf7_before_send_mail', 'form_to_post');

function form_to_post($wpcf7_obj)
{
if ($wpcf7_obj->id() == 121) {
$wpcf7 = WPCF7_ContactForm::get_current();
$submission = WPCF7_Submission::get_instance();

if ($submission) {

$data = $submission->get_posted_data();
if (!empty($data)) {

// create post
$postarr = array(
"post_title" => "New Event"
"post_status" => "new",
"post_type" => "events",
"post_status" => "publish"
);

$post_id = wp_insert_post($postarr, $wp_error = false);

// add meta
foreach ($data as $key => $value) {
if ($key && $value && !strpos($key, "_wpcf7")) {

add_post_meta($post_id, $key, $value, false);
}
}
}
}
return $wpcf7;
}
}

כעת האתגר היה: איך להוסיף לאימייל שנשלח למנהל האתר את מספר הפוסט החדש שנוצר. הייתי זקוק למספר הזה כדי לתת למנהל לינק ישיר לעמוד שנוצר.

לאחר הרבה חיפושים מצאתי את הדרך, והשיטה היא – רגע אחרי יצירת הפוסט ולפני שהאימייל נשלח (כלומר מייד אחרי סגירת ה-foreach), להתחבר למידע שיושב בתוך האובייקט wpcf7 ולערוך אותו. מסתבר שבנקודת הזמן הזו הפלאגין כבר סיים לייצר את תבנית האימייל שהוא התכוון לשלוח למנהל האתר. כל מה שנותר לי הוא לקלוט את הערך הזה, להוסיף לו את המידע שהייתי צריך, ולאחסן אותו חזרה בתוך האובייקט wpcf7. ולאחר מכן לשחרר את הפונקציה לדרכה, והאימייל שהלקוח יקבל הוא זה שעידכנתי.

$mailProp = $wpcf7_obj->get_properties('mail');
$mailProp['mail']['body'] .= '<p>Post ID: ' . $post_id . '</p>';
$wpcf7_obj->set_properties(array('mail' => $mailProp['mail']));

זהו, טיפ קצר שאני מקווה שיהיה יעיל למי שיתקל במשימה דומה בעתיד 🙂

תגיות: , ,

תגובות בפייסבוק