אייר

page template מתוך תוסף

זוכרים את התוסף שיוצר טופס תשלום, זה שיוצר כפתור בעורך הטקסט, ואז פותח חלונית שבה אפשר להזין את הערכים שיופיעו ברשימה הנפתחת של התשלום, ואז נוצר shortcode שיוצר את טופס התשלום בפוסט?

תמונת הטופס ברשומה

אז אחרי שכתבתי עליו כ”כ יפה וחשבתי שהוא יכול לנוח בשלום על משכבו, התבקשתי לשדרג אותו: שכשלוחצים על כפתור התשלום, במקום להגיע מייד לאתר התשלום, קודם יגיעו לדף עם תקנון התנהגות באירוע, ורק אחרי לחיצה על צ’ק בוקס שאומר שהעקרונות נקראו והובנו, יהיה אפשר ללחוץ על כפתור שיוביל לאתר התשלום:

1. יצירת template לדף שבו יופיעו העקרונות

אז לשם כך, צריך קודם כל שהתוסף ייצור template של דף, שאליו יועבר המשתמש שלוחץ על הכפתור. למה צריך template? כי ארצה לשים בדף הזה טופס שיש בו:

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

לכן יצרתי קובץ בשם pelepay_principles_page_template.php, והעתקתי אליו את התוכן של page.php מהתבנית.

2. הכנסת הטופס ל-template

את הטופס אני רוצה להראות אחרי התוכן של העמוד. תוכן העמוד יכיל את העקרונות הרלוונטיים לאותו אירוע, לכן  הפעלתי action אחרי הצגת תוכן הדף. יצרתי action חדש בשם pelepay_add_form_after_principles את ה-add_action הוספתי בפונקציה שמגדירה את כל ה-action-ים שמתרחשים בצד של האתר:

/* hook that runs in the pelepay page template and adds the form */
$this->loader->add_filter('pelepay_add_form_after_principles', $plugin_public, 'pelepay_add_form_after_principles');

וקראתי ל- do_action ב-page template שיצרתי:

<?php the_content(); ?>
<?php echo apply_filters( 'pelepay_add_form_after_principles', '' ) ?>

3. העברת הגולש לדף ה-template

איך שולחים את הגולש ל-page-template בלחיצה על כפתור התשלום? יוצרים פונקציה בתוסף, שתשב על hook, ובתנאים מסויימים, תעביר את הגולש לדף הזה.
לפי WPSE, הפונקציה הזאת יכולה לשבת על ה-hook של page_template, או על ה-hook של template_include. אני בחרתי את האחרון.
התנאי היה קצת יותר מאתגר.
אפשר, למשל, שהתנאי יבדוק מאפיין מסוים בדף (למשל slug) ובהתקיימו תעביר לדף ה-template שיצרנו. הבעיה היא שבדיקת slug היא קצת ספציפית מדי,  ואולי זה יכול היה להיות בסדר לו גם ככה התוסף היה תפור לאתר מסויים, אבל רציתי תוסף שבנוי יחסית גנרית, והתבאסתי להרוס אותו עם ספציפיות כזאת.
לכן חשבתי ללכת על כיוון של שדות מיוחדים. בתוסף שלי, בפונקציה שחיברתי ל-template_include, אני בודקת אם זה דף (כלומר page ולא single. זאת כדי לא להצטרך לבדוק שדה מיוחד בעלייה של כל פוסט). אם אכן זה דף – בודקת אם יש לו שדה מיוחד בשם principles_page. אם כן, מבצעת redirect ל-page template ששמתי בתיקיית ה-public של התוסף שלי:

/**
 * Use custom field in page to indicate a page that should embed a pelepay form
 /* http://wordpress.stackexchange.com/questions/3396/create-custom-page-templates-with-plugins
 * @param string $page_template
 * @return string
 */
 public function page_template($page_template) {
     /* this page template will only be applied to pages */
     if (is_page()) {
         if (get_post_meta(get_the_ID(), 'principles_page')) {
             $page_template = dirname(__FILE__) . '/pelepay_principles_page_template.php';
         }
     }
 return $page_template;
 }

את החיבור של הפונקציה ל-hook ביצעתי בפונקציה שמגדירה את כל ה-hook-ים בצד הקדמי של התוסף:

/* hook for showing the pelepay page template */
 $this->loader->add_filter( 'template_include', $plugin_public, 'page_template' );

4. הצגת דפי ה-template בחלונית בעורך הטקסט – ביצירת הטופס

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

מובן שגוגל נחלץ לעזרתנו. אמנם נזקקתי למספר חיפושים עד שתמללתי נכון את רצוני, אבל היה שווה – החיפוש "wordpress get values listbox tinymce button" הניב את התוצאה של שאלה שנשאלה בפורומים של וורדפרס לפני 9 חדשים, ונענתה אך לפני חודש. התשובה מכילה קישור למדריך מפורט בדיוק למשימה הזאת. כאילו נכתב במיוחד עבורי.

העתקתי, שיניתי הפרמטרים לפי הצורך – העברתי post_id בתור value ואת כותרת העמוד בתור ה-text, ו-פפם!

5. קבלת הערך מהחלונית והמרתו לקישור לדף

אחרי שהצגתי את הרשימה בחלונית,  עלי לקבל את הערך שנבחר ע”י מזין התוכן, להעביר אותו לפונקציית ה-shortcode, ולהמיר אותו לכתובת הדף.
ב-JS הוספתי את המשתנה החדש לשאר המשתנים:

onsubmit: function (e) {
  editor.insertContent("[pelepay_form price_list='" + e.data.price_list + "' price_text='" + e.data.price_text + "' payment_for='" + e.data.payment_for + "' payments='" + e.data.payments + "' principles_page='" + e.data.page_rprinciples_pageedirect + "' ]");
}

וב-PHP הגדרתי משתנה $form_action שמקבל את כתובת דף העקרונות (אם נבחר) ע”י שימוש ב-ID של הדף, שהוא הערך שמועבר. אם לא נבחר דף עקרונות – במקרה שעורך האתר החליט שהגולש אמור לעבור מיד לאתר התשלום – $form_action יקבל את כתובת אתר פלאפיי, ששמור במשתנה basic_form_action:

$form_action = (isset($atts['principles_page']) && $atts['principles_page'] != 0) ? get_permalink( $atts['principles_page'] ) : $this->basic_form_action;

6. הצגת דפי ה-template בחלונית בעורך הטקסט – בעריכת הטופס

ואז נזכרתי, שלמעשה יותר חשוב שזה יעבוד בעריכה של ה-shortocde, כי זה הדבר שעורך האתר משתמש בו, יותר מאשר בחלונית של יצירה. מיד רצתי לקוד הדוגמה של shortcake וחיפשתי איך יוצרים רשימה. מצאתי שם משהו יותר טוב ממה שציפיתי: אפשר להוסיף רשימת פוסטים! זה סוג שדה מיוחד בשם post_select שמאפשר להעביר ארגומנטים כמו שמעבירים ל-WP_Query. מאחר שאני משתמשת בזה גם בפונקציה שמזינה את קובץ ה-JS, יצרתי ב-class שלי משתנה שמכיל את הארגומנטים הללו, והשמתי אותו לשדה query בשדה ה-post_select. וזה עבד! ובדיוק כמו שרציתי – הטקסט של כל אופציה הוא כותרת העמוד, וה-value הוא ה-ID! יותר פשוט מזה אי אפשר (ורק תהיתי לעצמי מה הייתי עושה לו רציתי סתם רשימה, לא של פוסטים. אבל דיה לצרה בשעתה).

שני דברים קטנים נוספים:

  • בסופו של דבר התברר שטופס התשלום שמופיע בפוסט המקורי והטופס שנוצר בדף העקרונות, חופפים ברוב שדותיהם. לכן יצרתי פונקציה אחת שיוצרת את הטופס, והפרמטרים שלה מקבלים את הערכים שמבדילים בין שני הטפסים  (PHP).
  • יצרתי צ’ק בוקס שרק בסימונו, כפתור השליחה נהיה לחיץ (JS).

7. בדיקות בטופס התשלום המקורי

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

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

8. וזה הסוף. סוף סוף.

עדכון: מצאתי מאמר שמראה על דרך אחרת להוסיף Page template מתוך תוסף, ועוד בצורה מונחת עצמים.

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.