אחד האתגרים שתיתקלו בהם כשאתם מפתחים תבניות וורדפרס הוא לגרום למידע בצד השרת (הנגיש באמצעות 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, עיינו במדריך הבסיסי ל-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().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 נכון ומתאימה להמלצות הנוכחיות של ליבת וורדפרס.



אני לא מצליח להבין את הנושא ואשמח שתחדד לי. הסקריפט php רץ לפני הגאווה סקריפט, אז למה לא להוסיף את הנתונים שנרצה על הקובץ בבקשת GET?
איך בעצם מתבצעת ההעברה שתיארת? תוכל לפרט בבקשה?
היי עידן 🙂
לעשות זאת באמצעות GET אינה הדרך בה עושים זאת בוורדפרס, גם לא ניתן לבצע זאת בצורה שאתה מתאר. איך תעביר מערך ב GET? וורדפרס מספקת את הפונקציה שתיארתי בדיוק בשביל זה.
איני יודע כיצד בפועל מתבצעת ההעברה, לא ירדתי לעומק עד כדי כך… אולי אחרים פה יודעים לענות לך על כך..
תודה רועי.
הייתי מנסה להעביר את המערך ב-JSON או בכמה משתנים…
אתה יודע איך זה מתבצע שלא בוורדפרס?
זה ממש מעניין, הייתי בטוח ש-ajax או עם GET/POST זו הדרך היחידה להעביר מידע בין קבצים.
מה השם של השיטה?
היי עידן,
הפקודה wp_localize_script כותבת תגית script בתוך ה-html, ומגדירה בו משתנה שיש בו המידע שהעברנו מה-php. למשל, אם נשתמש בדוגמה שרועי יצר, מה שייכתב ב-html זה:
תודה לאה, אלופה!
איזה יופי של הסבר.
גם אני הייתי צריכה את הפונקציה הזאת לפני כמה זמן, והיא פשוט גואלת, נכון? איזה כיף לפגוש עוד מישהו שהיה צריך אותה והתלהב ממנה עד כדי כתיבת פוסט 🙂 . וכעת, תודות לפוסט שלך, שיפרתי בו את ההסברים…
היי לאה, מצויין!
הפונקציה אכן גואלת ואחלה פוסט כתבת 🙂 מעניינת גם הדרך בה היא פועלת שתיארת…