חיפוש ]

שימוש ב wp_localize_script להעברת מידע מ PHP ל JavaScript

אחד האתגרים שתיתקלו בהם כשאתם מפתחים תבניות וורדפרס הוא לגרום למידע בצד השרת (הנגיש באמצעות PHP) להיות זמין גם בקבצי ה-JavaScript שלכם. לדוגמה, ייתכן שיש לכם פופאפ שההודעה שלו צריכה להיות ניתנת לתרגום, או בקשת AJAX שצריכה את כתובת ה-admin.

וורדפרס מספקת דרך מובנית להעביר מידע מ-PHP ל-JavaScript. הגישה המסורתית היא wp_localize_script(), והגישה המודרנית המומלצת היא wp_add_inline_script(). בפוסט זה נסקור את שתיהן.

הפונקציה wp_localize_script()

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

חתימת הפונקציה נראית כך:

wp_localize_script( $handle, $object_name, $data );

בואו נסביר את הפרמטרים:

  • $handle – ה-handle של הסקריפט אליו אתם מעבירים את המידע (אותו handle שהשתמשתם בו בעת ה-enqueue).
  • $object_name – שם אובייקט ה-JavaScript שיכיל את המידע. חייב להיות מזהה JavaScript תקין – ללא מקפים או תווים מיוחדים. רצוי להשתמש ב-prefix כדי למנוע קונפליקטים עם סקריפטים אחרים.
  • $data – מערך אסוציאטיבי של זוגות מפתח-ערך. יכול להיות מערך חד-ממדי או רב-ממדי.

דוגמה מעשית עם ACF

נניח שיש לכם שדה ACF בשם marketo_id בעמוד, ואתם צריכים להעביר את ערכו לקובץ JavaScript. ראשית, טענו את הסקריפט ולאחר מכן קראו ל-wp_localize_script():

function sv_enqueue_marketo_script() {
    wp_enqueue_script(
        'localize-marketo',
        get_stylesheet_directory_uri() . '/js/localize-marketo.js',
        array(),
        '1.0',
        true
    );

    wp_localize_script( 'localize-marketo', 'acfVars', array(
        'marketoId' => get_field( 'marketo_id' ),
    ));
}
add_action( 'wp_enqueue_scripts', 'sv_enqueue_marketo_script' );

שימו לב שהפרמטר הראשון של wp_localize_script() תואם ל-handle של הסקריפט. הפרמטר השני (acfVars) הופך לאובייקט JavaScript גלובלי, והפרמטר השלישי הוא מערך הנתונים.

העברת מידע מ ACF ל JavaScript באמצעות wp_localize_script

העברת מידע מ ACF ל JavaScript באמצעות wp_localize_script

אם אתם רוצים ללמוד עוד על השימוש ב-ACF, עיינו במדריך הבסיסי ל-Advanced Custom Fields.

גישה למידע ב-JavaScript

בקובץ localize-marketo.js, גשו למידע דרך שם האובייקט והמפתח:

document.addEventListener( 'DOMContentLoaded', function() {
    var marketoId = acfVars.marketoId;
    console.log( marketoId );
});

המשתנה acfVars זמין באופן גלובלי מכיוון שוורדפרס מייצרת תגית <script> עם המידע ממש לפני הסקריפט שטענתם.

החלופה המודרנית: wp_add_inline_script()

למרות ש-wp_localize_script() עדיין עובדת, היא תוכננה עבור תרגומים ולא להעברת מידע כללי. ליבת וורדפרס ממליצה כיום להשתמש ב-wp_add_inline_script() בשילוב עם wp_json_encode() להעברת מידע מ-PHP ל-JavaScript.

תיעוד המפתחים של וורדפרס מציין במפורש שיש להשתמש ב-wp_localize_script() "רק כאשר אתם באמת רוצים לבצע לוקאליזציה של מחרוזות." להעברת מידע, wp_add_inline_script() היא הגישה המומלצת.

הנה אותה דוגמה בגישה המודרנית:

function sv_enqueue_marketo_script() {
    wp_enqueue_script(
        'localize-marketo',
        get_stylesheet_directory_uri() . '/js/localize-marketo.js',
        array(),
        '1.0',
        true
    );

    $data = array(
        'marketoId' => get_field( 'marketo_id' ),
    );

    wp_add_inline_script(
        'localize-marketo',
        'const acfVars = ' . wp_json_encode( $data ) . ';',
        'before'
    );
}
add_action( 'wp_enqueue_scripts', 'sv_enqueue_marketo_script' );

הפונקציה wp_add_inline_script() מקבלת שלושה פרמטרים:

  • $handle – ה-handle של הסקריפט שאליו מצרפים את הקוד ה-inline.
  • $data – קוד JavaScript בתור מחרוזת.
  • $position'before' או 'after' (ברירת מחדל). השתמשו ב-'before' כדי שהמידע יהיה זמין כשהסקריפט שלכם נטען.

למה להעדיף את wp_add_inline_script()?

ישנם מספר יתרונות על פני wp_localize_script():

  • אתם יכולים להעביר כל ערך JavaScript, לא רק אובייקטים – מחרוזות, מספרים, booleans ומערכים עובדים.
  • קריאות מרובות לאותו handle מוסיפות מידע במקום לדרוס אותו.
  • wp_json_encode() מבצעת escaping נכון למידע, ומונעת פרצות XSS.
  • יש לכם שליטה מלאה על הצהרת המשתנה (const, let או var).

זכרו שמידע שמועבר בשתי השיטות מופיע בתגית <script> בקוד המקור של העמוד. לעולם אל תעבירו מידע רגיש כמו מפתחות API, סיסמאות או טוקנים של משתמשים בדרך זו. כל אחד יכול לראות אותו על ידי בדיקת קוד המקור של העמוד.

שאלות נפוצות

שאלות נפוצות בנושא העברת מידע מ-PHP ל-JavaScript בוורדפרס:

האם wp_localize_script() מיושנת (deprecated)?
לא, wp_localize_script() לא סומנה רשמית כ-deprecated ועדיין עובדת. עם זאת, ליבת וורדפרס ממליצה להשתמש ב-wp_add_inline_script() להעברת מידע ולשמור את wp_localize_script() ללוקאליזציה בפועל של מחרוזות.
אפשר לקרוא ל-wp_localize_script() מספר פעמים לאותו סקריפט?
כן, אבל כל קריאה חייבת להשתמש בשם אובייקט שונה (הפרמטר השני). אם תשתמשו באותו שם אובייקט, הקריאה השנייה תדרוס את הראשונה. עם wp_add_inline_script(), קריאות מרובות מוסיפות קוד במקום לדרוס.
צריך לטעון את הסקריפט לפני הקריאה ל-wp_localize_script()?
הסקריפט חייב להיות רשום או טעון לפני שאתם קוראים ל-wp_localize_script(). תוכלו להשתמש ב-wp_register_script() או wp_enqueue_script() קודם. אותו הדבר חל על wp_add_inline_script().
איך מעבירים את כתובת ה-AJAX ל-JavaScript בוורדפרס?
הוסיפו את admin_url( 'admin-ajax.php' ) למערך הנתונים שאתם מעבירים ל-wp_localize_script() או wp_add_inline_script(). כדאי גם לכלול nonce באמצעות wp_create_nonce() לצרכי אבטחה. עבור REST API, השתמשו ב-rest_url() במקום.
מה ההבדל בין wp_json_encode() ל-json_encode()?
wp_json_encode() היא wrapper של וורדפרס סביב json_encode() של PHP. היא מוסיפה בדיקת שגיאות ומבטיחה קידוד UTF-8. השתמשו תמיד ב-wp_json_encode() בוורדפרס כדי להימנע מבעיות קידוד עם תווים מיוחדים.

סיכום

להעברת מידע מ-PHP ל-JavaScript בוורדפרס, יש לכם שתי אפשרויות. הפונקציה המסורתית wp_localize_script() עדיין עובדת ומתאימה לשימושים פשוטים, במיוחד בלוקאליזציה של מחרוזות. להעברת מידע כללי, העדיפו את wp_add_inline_script() עם wp_json_encode() – היא נותנת לכם יותר גמישות, escaping נכון ומתאימה להמלצות הנוכחיות של ליבת וורדפרס.

דיון ותגובות
7 תגובות  ]
  • עידן טורנגי 5 יולי 2018, 21:07

    אני לא מצליח להבין את הנושא ואשמח שתחדד לי. הסקריפט php רץ לפני הגאווה סקריפט, אז למה לא להוסיף את הנתונים שנרצה על הקובץ בבקשת GET?

    איך בעצם מתבצעת ההעברה שתיארת? תוכל לפרט בבקשה?

    • רועי יוסף 5 יולי 2018, 21:29

      היי עידן 🙂

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

      איני יודע כיצד בפועל מתבצעת ההעברה, לא ירדתי לעומק עד כדי כך… אולי אחרים פה יודעים לענות לך על כך..

      • עידן טורנגי 6 יולי 2018, 0:57

        תודה רועי.
        הייתי מנסה להעביר את המערך ב-JSON או בכמה משתנים…
        אתה יודע איך זה מתבצע שלא בוורדפרס?
        זה ממש מעניין, הייתי בטוח ש-ajax או עם GET/POST זו הדרך היחידה להעביר מידע בין קבצים.
        מה השם של השיטה?

    • לאה 8 יולי 2018, 11:02

      היי עידן,

      הפקודה wp_localize_script כותבת תגית script בתוך ה-html, ומגדירה בו משתנה שיש בו המידע שהעברנו מה-php. למשל, אם נשתמש בדוגמה שרועי יצר, מה שייכתב ב-html זה:

      <script type='text/javascript'>
      /* <![CDATA[ */
          var acf_vars = {
             "my_localized_var":"some string" /* whatever is returned from get_field( 'marketo_id' ) */
          };
      /* ]]> */
      </script>
  • לאה 8 יולי 2018, 10:43

    איזה יופי של הסבר.

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

    • רועי יוסף 9 יולי 2018, 12:51

      היי לאה, מצויין!

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

השאירו תגובה

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

Savvy WordPress Development official logo