אימות מספר טלפון ישראלי לבעלי אתרים ישראליים אשר משתמשים בתוסף Contact Form 7 הוא חלק חשוב אשר לא קיימת לו התייחסות בתוסף.

הבעיה עם Contact Form 7

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

if ( 'tel' == $tag->basetype ) {
    if ( $tag->is_required() && '' == $value ) {
        $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
    } elseif ( '' != $value && ! wpcf7_is_tel( $value ) ) {
        $result->invalidate( $tag, wpcf7_get_message( 'invalid_tel' ) );
    }
}

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

function wpcf7_is_tel( $tel ) {
	$result = preg_match( '/^[+]?[0-9() -]*$/', $tel );
	return apply_filters( 'wpcf7_is_tel', $result, $tel );
}

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

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

אימות מספר טלפון ישראלי

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

יש לפתוח את קובץ הפונקציות של התבנית שלנו functions.php ולהדביק את הקוד הנ״ל בתחתית הקובץ.

/**
 * Validate [tel] field value if is a valid Israeli phone number.
 *
 * @param WPCF7_Validation $result field validation object.
 * @param WPCF7_Shortcode  $tag    field tag object.
 *
 * @return WPCF7_Validation
 */
function dorzki_validate_phone_number( $result, $tag ) {

	$phone_number = $_POST[ $tag->name ];
	$phone_regex = '/^0?(([23489]{1}\d{7})|[5]{1}\d{8})$/';

	if( $tag->is_required() && empty( $phone_number ) ) {

		$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );

	} else {

		if( ! preg_match( $phone_regex, $phone_number ) ) {

			$result->invalidate( $tag, __( 'יש למלא מספר טלפון חוקי', 'dorzki' ) );

		}

	}

	return $result;

}

add_filter( 'wpcf7_validate_tel*', 'dorzki_validate_phone_number', 20, 2 );

אנחנו משתמשים בפילטר wpcf7_validate_tel* על מנת להתערב במנגנון אימות.
ע״י השימוש בפילטר הזה אנו מבקשים להריץ את הפונקציה שכתבנו אך ורק בשדות מסוג טלפון [tel] אשר מוגדרים כחובה.

כאשר הפונקציה רצה, היא מקבלת 2 פרמטרים, הראשון הוא $result אשר מכיל אובייקט מסוג WPCF7_Validation אשר מייצג את תוצאת הבדיקה.
הפרמטר השני הוא $tag אשר מכיל אובייקט מסוג WPCF7_Shortcode אשר מייצג את השדה עצמו.

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

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

הסבר מבנה הביטוי הרגולרי

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

/^0?(([23489]{1}\d{7})|[5]{1}\d{8})$/

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

בדיקת טלפון נייח

בדיקת מספר טלפון נייח בודקת האם אחרי ה-0 יש את אחד מהמספרים הבאים:

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

בדיקת טלפון נייד

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

בדיקת אופציות נוספות

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

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

/^((0\d{1,2}\-\d{7})|(0\d{8,9}))$/

סיכום

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

    כתיבת תגובה

    1. רוב

      איך אפשר להוסיף גם בדיקה לטלפון שהוא לא חובה?
      יש לי טופס עם שני שדות לטלפון, שאחד חובה והשני לא

      הגב
      1. דור צוברי

        היי רוב,
        תשתמש בפילטר wpcf7_validate_tel וזה יהיה תקף לשדות שהם לא חובה, אבל יהיה צריך לשנות קצת את הקוד.

    2. עידו

      אחלה! שתי שאלות:
      1. האם הריג'קס האחרון עושה ולידציה גם למספר עם מקף (אם הבנתי נכון)?
      2. האם יש דרך לוודא שאין מספר טלפון שהספרה הראשונה של המספר (אחרי הקידומת) היא 0? כמו למשל 05000000000

      הגב
      1. דור צוברי

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

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

    שתפו