חיפוש ]

אופטימיזציה של Contact Form 7 לביצועים טובים יותר

התוסף Contact Form 7 הוא תוסף מצוין ומהנפוצים ביותר ליצירת טפסים (forms) באתרי וורדפרס. הוא מאפשר יצירת טפסים מגוונים, התאמה אישית של הטופס, עובד ב-Ajax ומאפשר גם שימוש ב-CAPTCHA.

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

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

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

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

ביטול טעינת הקבצים מכל הדפים

Contact Form 7 מספק שתי דרכים לבטל את טעינת הקבצים באופן גורף. הראשונה היא הוספת שורות אלו לקובץ wp-config.php:

define('WPCF7_LOAD_JS', false);
define('WPCF7_LOAD_CSS', false);

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

הגישה המומלצת היא לבטל את הטעינה באמצעות פילטרים בקובץ functions.php של התבנית:

add_filter( 'wpcf7_load_js', '__return_false' );
add_filter( 'wpcf7_load_css', '__return_false' );

שתי השיטות משיגות את אותה תוצאה: קבצי ה-CSS וה-JavaScript לא נטענים יותר באף דף. גישת הפילטרים עדיפה מכיוון שהיא שומרת על קובץ wp-config.php נקי ומאפשרת לתוספים אחרים או לתבנית ילד לדרוס את ההתנהגות במידת הצורך.

טעינת הקבצים רק בדפים שאנו מעוניינים בהם

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

שימוש בתבנית עמוד

אם דף יצירת הקשר משתמש בתבנית עמוד ייעודית (למשל contact.php), ניתן לקרוא לפונקציות הטעינה ישירות בתבנית. שורות אלו חייבות להופיע לפני הקריאה לפונקציה wp_head:

<?php
    if ( function_exists( 'wpcf7_enqueue_scripts' ) ) {
        wpcf7_enqueue_scripts();
    }

    if ( function_exists( 'wpcf7_enqueue_styles' ) ) {
        wpcf7_enqueue_styles();
    }
?>

שימוש בפונקציה מותנית (מומלץ)

אם דף יצירת הקשר אינו משתמש בתבנית עמוד משלו, או שאתם מעדיפים גישה נקייה יותר, השתמשו בפונקציה מותנית המחוברת ל-wp_enqueue_scripts.

ראשית, מצאו את מזהה העמוד. גשו ללוח הבקרה של וורדפרס > עמודים ורחפו עם העכבר על העמוד שמכיל את הטופס. בתחתית הדפדפן תראו שורה המכילה את המזהה (ID) של העמוד – post=xxxx. זכרו מספר זה.

מציאת מזהה הטופס ב Contact Form 7

כעת הוסיפו את הקוד הבא לקובץ functions.php של התבנית:

<?php
/**
 * Contact Form 7
 *
 * Prevent the JavaScript and styles from loading on every page.
 * Load them only on the Contact page.
 */
function load_cf7_on_contact_page() {
    if ( is_page( xxx ) ) {
        if ( function_exists( 'wpcf7_enqueue_scripts' ) ) {
            wpcf7_enqueue_scripts();
        }

        if ( function_exists( 'wpcf7_enqueue_styles' ) ) {
            wpcf7_enqueue_styles();
        }
    }
}
add_action( 'wp_enqueue_scripts', 'load_cf7_on_contact_page' );
?>

החליפו את xxx במזהה העמוד שמצאתם. ניתן גם להעביר מספר מזהים כמערך: is_page( array( 10, 25, 98 ) ).

השתמשו ב-hook בשם wp_enqueue_scripts ולא ב-wp_footer לטעינת קבצי CF7. כך ה-CSS ייכלל ב-<head> ותמנעו מהבהוב של תוכן ללא עיצוב (FOUC) כשהטופס נטען לראשונה.

זיהוי אוטומטי באמצעות Shortcode

אם אתם משתמשים ב-Contact Form 7 במספר דפים ולא רוצים לתחזק רשימת מזהי עמודים, ניתן לזהות את ה-shortcode באופן אוטומטי:

function load_cf7_only_when_needed() {
    global $post;

    if ( is_singular() && has_shortcode( $post->post_content, 'contact-form-7' ) ) {
        if ( function_exists( 'wpcf7_enqueue_scripts' ) ) {
            wpcf7_enqueue_scripts();
        }

        if ( function_exists( 'wpcf7_enqueue_styles' ) ) {
            wpcf7_enqueue_styles();
        }
    }
}
add_action( 'wp_enqueue_scripts', 'load_cf7_only_when_needed' );

גישה זו בודקת האם הדף הנוכחי מכיל shortcode של [contact-form-7] וטוענת את הקבצים רק כשהוא קיים. זה עובד בכל הדפים והפוסטים ללא צורך בהזנת מזהים ידנית.

אל תשכחו את reCAPTCHA ו-Turnstile

אם אתם משתמשים ב-reCAPTCHA או ב-Cloudflare Turnstile עם Contact Form 7, שימו לב ששירותים אלו גם הם טוענים JavaScript משלהם בכל דף באתר כברירת מחדל.

ביטול טעינת קבצי CF7 לא מבטל אוטומטית את סקריפטי ה-CAPTCHA. ייתכן שעדיין תראו בקשות חיצוניות ל-google.com/recaptcha או challenges.cloudflare.com בדפים ללא טפסים.

כדי לטפל בכך, ניתן להסיר את סקריפט ה-reCAPTCHA מדפים שלא צריכים אותו:

function remove_recaptcha_from_non_form_pages() {
    if ( ! is_page( xxx ) ) {
        wp_dequeue_script( 'google-recaptcha' );
        wp_dequeue_script( 'wpcf7-recaptcha' );
    }
}
add_action( 'wp_enqueue_scripts', 'remove_recaptcha_from_non_form_pages', 100 );

החליפו את xxx במזהה העמוד/ים בהם הטופס נמצא. העדיפות 100 מוודאת שהקוד רץ אחרי ש-CF7 כבר טען את הסקריפטים.

החל מגרסה 6.1 של Contact Form 7, התוסף תומך גם ב-Cloudflare Turnstile כחלופה ל-reCAPTCHA. אם עברתם ל-Turnstile, יישמו את אותה גישה של טעינה מותנית גם לסקריפטים שלו.

שאלות נפוצות

שאלות נפוצות בנושא אופטימיזציה של Contact Form 7:

האם ביטול טעינת קבצי CF7 ישבור את הטופס?
רק אם תשכחו להפעיל מחדש את הקבצים בדף שמכיל את הטופס. לאחר ביטול הטעינה הגלובלית, עליכם לטעון את הקבצים בדפים הספציפיים בהם הטופס מופיע. אם זה נעשה כראוי, הטופס עובד בדיוק כמו קודם.
מה עדיף - קבועים ב-wp-config או פילטרים ב-functions.php?
גישת הפילטרים (ב-functions.php) עדיפה ברוב המקרים. היא שומרת על קובץ wp-config.php נקי, ניתנת לדריסה על ידי תבניות ילד או תוספים אחרים, ועוקבת אחר תקני הקידוד של וורדפרס. הקבועים ב-wp-config עובדים גם כן, אך קשה יותר לנהל אותם ולא ניתן לדרוס אותם.
האם ניתן לטעון את קבצי CF7 במספר דפים?
כן. העבירו מערך של מזהי עמודים לפונקציה is_page(), כך: is_page( array( 10, 25, 98 ) ). לחילופין, השתמשו בשיטת זיהוי ה-shortcode המתוארת במדריך זה, שטוענת את הקבצים אוטומטית בכל דף שמכיל טופס של CF7.
האם האופטימיזציה הזו תשפר את ציון ה-PageSpeed?
כן, אך השיפור תלוי בהגדרות הכלליות של האתר. הסרת שתי בקשות HTTP מיותרות (CSS ו-JS) מכל דף מפחיתה משאבים חוסמי עיבוד ואת המשקל הכולל של הדף. באתרים קלים, זה יכול לשפר באופן מורגש מדדים כמו First Contentful Paint ו-Total Blocking Time.
האם זה עובד עם תוספי קאש?
כן. תוספי קאש כמו LiteSpeed Cache או WP Rocket ישמרו את הדף עם או בלי קבצי CF7 בהתאם למה שנטען. לאחר ביצוע השינוי, נקו את הקאש כדי שהגרסאות השמורות ישקפו את הטעינה המעודכנת.
מה לגבי סקריפטי reCAPTCHA שנטענים בכל דף?
ביטול טעינת קבצי CF7 לא עוצר אוטומטית את סקריפטי reCAPTCHA או Turnstile מלהיטען באופן גלובלי. עליכם להסיר אותם בנפרד מדפים שלא מכילים טפסים. ראו את הסעיף "אל תשכחו את reCAPTCHA ו-Turnstile" במדריך זה לקוד המתאים.

לסיכום

על ידי מניעת טעינת קבצי Contact Form 7 בכל דף, אתם מפחיתים בקשות CSS ו-JavaScript מיותרות ומשפרים את מהירות הטעינה וציוני הביצועים.

לאתרים עם דף יצירת קשר אחד, הגישה המותנית עם is_page() עובדת מצוין. לאתרים עם טפסים במספר דפים, שיטת זיהוי ה-shortcode נוחה יותר לתחזוקה. בכל מקרה, זכרו לטפל גם בסקריפטי reCAPTCHA או Turnstile בנפרד.

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

דיון ותגובות
4 תגובות  ]
  • אורי 2 יולי 2015, 11:07

    עובד פגז, תודה

  • בצלאל 27 ספטמבר 2015, 1:20

    מעניין ושימושי. טנקס

  • ברק 16 ספטמבר 2017, 10:33

    אז בעצם את הקוד שמבטל את הטעינה כליל צריך להכניס לקובץ ה functions, ואת הקוד שדורש טעינה רק בעמוד שאנחנו בוחרים צריך להכניס ל template הנכון?

    • רועי יוסף 16 ספטמבר 2017, 11:25

      נכון, אך האמת שיהיה נכון יותר להשתמש בדרך השנייה שתיארתי. תשתמש בפונקציה is_page_template במקום is_page ושים את הקוד ב functions.php..

השאירו תגובה

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

Savvy WordPress Development official logo