הימנעות מטעויות נפוצות בהטמעה

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

כל תרחיש כולל גישה מומלצת לפתרון הבעיה שמוצגת.

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

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

טעויות נפוצות

תרחיש 1: שימוש בעותק לא רשמי של ספריות JavaScript של GPT

תיאור כללי של תרחיש לדוגמה אירוח של gpt.js, pubads_impl.js או כל ספריות שהם טוענים מהשרתים שלכם, או טוען את הקבצים האלה ממקור לא רשמי.
דוגמה לקטע קוד עם שגיאה
// Incorrect: Accessing these files from an unofficial source
<script async src="https://www.example.com/tag/js/gpt.js"></script>
הצעות לתיקון השגיאה
// Correct: Access these files from a Google domain
<script src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" crossorigin="anonymous" async></script>
// Also correct, if using Limited Ads
<script src="https://pagead2.googlesyndication.com/tag/js/gpt.js" async></script>

תרחיש 2: הסתמכות על פונקציות ה-listener של תגי הסקריפט של gpt.js

תיאור תרחיש לדוגמה כללי בהנחה שה-API של GPT מוכן לקריאה כשקובץ ה-JavaScript ה-gpt.js נטען באופן שגוי, מאחר שחלקים מסוימים של ה-API מסופקים על ידי קובץ pubads_impl.js. הסתמכות על כל דרך שהיא (כולל frameworks) על ה-API לכן, מתוך אירועי event listener שמצורפים לתג הסקריפט, יש שגיאה.
דוגמה לקטע קוד עם שגיאה
var tag = document.createElement('script');
tag.type = 'text/javascript';
tag.src = (useSSL ? 'https:' : 'http:') +
        '//www.googletagservices.com/tag/js/gpt.js';
// Incorrect: Attaching a callback to the script's onload event.
tag.onload = callback;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(tag, node);
הצעות לתיקון השגיאה
// Make sure that googletag.cmd exists.
window.googletag = window.googletag || {};
googletag.cmd = googletag.cmd || [];
// Correct: Queueing the callback on the command queue.
googletag.cmd.push(callback);
הסבר או תיאור של התיקון googletag.cmd שומר רשימת פקודות שירוצו מיד ב-GPT מוכן. זו הדרך הנכונה לוודא שהקריאה החוזרת (callback) תופעל אחרי הטעינה של GPT.

תרחיש 3: בדיקה של אובייקט googletag כדי לדעת אם GPT מוכן

תיאור כללי של תרחיש לדוגמה יכול להיות ש-GPT API לא יהיה מוכן כשקובץ ה-JavaScript gpt.js נטען או כשהאובייקט googletag מוגדר, ולכן אי אפשר לסמוך על בדיקה של האובייקט הזה כדי לבדוק אם GPT API זמין.
קטע קוד לדוגמה עם שגיאה
// Incorrect: Relying on the presence of the googletag object
// as a check for the GPT API.
if (typeof googletag != 'undefined') {
 functionProcessingGPT();
}
הצעות לתיקון השגיאה
// Correct: Relying on googletag.apiReady as a check for the GPT API.
if (window.googletag && googletag.apiReady) {
 functionProcessingGPT();
}
הסבר או תיאור של התיקון GPT יאכלס את הדגל הבוליאני googletag.apiReady בהקדם ה-API מוכן לקריאה כדי שתהיה לכם אפשרות לטעון טענות נכונות (assertions) מהימנות.

תרחיש 4: הסתמכות על תחביר של קוד מעורפל

תיאור כללי של תרחיש לדוגמה אם אתם מסתמכים על תחביר מדויק של קוד ספריית ה-GPT הממוזער, סביר להניח שתבחינו בבעיות. חשוב להגביל את השימוש שלכם ל-API שמתואר במדריך העזרה של ה-API, כי אנחנו משנים כל הזמן את האופן שבו GPT פועל כדי לשפר אותו.
לדוגמה, דרישות נפוצות הן לזהות מתי PubAdsService נטען במלואו כדי לבצע קריאה ל-refresh().
דוגמה לקטע קוד עם שגיאה
// Incorrect: Relying on an obfuscated property.
if (googletag.pubads().a != null) {
 functionProcessingGPT();
}
הצעות לתיקון השגיאה
// Correct: Relying on public GPT API methods
// (i.e. googletag.pubadsReady in this case).
if(window.googletag && googletag.pubadsReady) {
 functionProcessingGPT();
}
הסבר או תיאור של התיקון אפשר להסתמך רק על ה-API הציבורי. כדי לזהות אם PubAdsService נטען במלואו, יש לנו את הערך הבוליאני googletag.pubadsReady.

תרחיש 5: החלפת פונקציה או משתנה של GPT

תיאור כללי של תרחיש לדוגמה תרחישים לדוגמה שמבוססים על כתיבה מחדש של כל פונקציה או משתנה שבהם נעשה שימוש על ידי GPT עשויים להיפסק בכל שלב, כי זהו לא תרחיש לדוגמה נתמך. שינויים בתזמון באלמנטים הפנימיים של GPT עשויים להציג את המידע הזה התנהגות שגויה של כשברים.
קטע קוד לדוגמה עם שגיאה
// Incorrect: Haphazardly overwriting a googletag.* property.
googletag.cmd = [];
הצעות לדרכים לפתרון השגיאה
// Correct: Never overwrite googletag.* properties if they already exist.
// Always check before assigning to them.
googletag.cmd = googletag.cmd || [];

תרחיש 6: סידור שגוי של קריאות ל-GPT

תיאור כללי של תרחיש לדוגמה מרוץ תהליכים עלול לגרום לשיבושים כשהרכיבים הפנימיים של GPT מתפתחים. שגיאה קבוצה מסודרת של הצהרות שפעלו עקב תזמונים ספציפיים בביצוע ייתכן שלא יישארו פעילים בעתיד.
דוגמה לקטע קוד עם שגיאה
// Incorrect: Setting page-level key-value targeting after calling
// googletag.enableServices().
googletag.enableServices();
googletag.defineSlot(...);
googletag.pubads().setTargeting(e, a);
הצעות לתיקון השגיאה
// Correct: Setting page-level key-value targeting before calling
// googletag.enableServices().
googletag.pubads().setTargeting(e, a);
googletag.defineSlot(...);
googletag.enableServices();
הסבר או תיאור של התיקון כדי להימנע ממרוץ תהליכים, חשוב לפעול בהתאם לתזמון הרגיל של GPT. דוגמה תקינה הזמנות חלקיות כוללות:
  • Define-Enable-Display
    1. הגדרת הגדרות ברמת הדף
    2. הגדרת משבצות
    3. enableServices()
    4. משבצות של מודעות לרשת המדיה
  • Enable-Define-Display
    1. הגדרת הגדרות ברמת הדף
    2. enableServices()
    3. הגדרת משבצות
    4. משבצות תצוגה

תרחיש 7: שימוש לרעה בסגירות והיקפים של משתני JavaScript

תיאור כללי של תרחיש לדוגמה הנחות שגויות לגבי היקף המשתנים ב-JavaScript, והערך של המשתנים שנשמרים בפונקציה שמועברת אל googletag.cmd.push.
קטע קוד לדוגמה עם שגיאה
// Incorrect: Variable x is declared outside the anonymous function
// but referenced within it.
for (var x = 0; x < slotCount; x++) {
 window.googletag.cmd.push(
  function(){
    // If GPT is not yet loaded, this code will be executed subsequently when
    // the command queue is processed. Every queued function will use the last value
    // assigned to x (most likely slotCount).
    // This is because the function closure captures the reference to x,
    // not the current value of x.
    window.googletag.display(slot[x]);
  })
 }
}
הצעות לתיקון השגיאה
window.googletag.cmd.push(
 function(){
  // Correct: We both declare and reference x inside the context of the function.
  for (var x = 0; x < slotCount; x++){
   window.googletag.display(slot[x]);
  }
 }
)
הסבר או תיאור של התיקון

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

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

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

תרחיש 8: העברת מאגרי משבצות בתוך DOM אחרי קריאה להצגה

תיאור כללי של תרחיש לדוגמה העברה או הוספה של מאגרי מודעות ב-DOM אחרי קריאה להצגה עלולה להוביל לזרימה מחדש לא רצויה ולהתנהגות בלתי צפויה ב-GPT.
קטע קוד לדוגמה עם שגיאה
// Incorrect: Moving slot containers after calling display
googletag.defineSlot("/1234/travel/asia", [728, 90], "div-gpt-ad-123456789-0");
googletag.enableServices();
googletag.display("div-gpt-ad-123456789-0");
...
// Inserting another element before the slot container, pushing the slot container down the page.
document.body.insertBefore(someOtherElement, document.getElementById("div-gpt-ad-123456789-0"));
הצעות לתיקון השגיאה
// Correct: Make any DOM order changes before calling display

document.body.insertBefore(someOtherElement, document.getElementById("div-gpt-ad-123456789-0"));
...
googletag.defineSlot("/1234/travel/asia", [728, 90], "div-gpt-ad-123456789-0");
googletag.enableServices();
googletag.display("div-gpt-ad-123456789-0");

תרחיש 9: החלפת ממשקי ה-API של הדפדפן

תיאור כללי של תרחיש לדוגמה החלפה (שנקראת גם תיקון קופים, מילוי פוליגונים) של ממשקי ה-API לדפדפן לא נתמכת ב-GPT. שיטה זו עלולה לגרום לשיבושים בסקריפטים של צד שלישי כמו GPT בדרכים בלתי צפויות.
קטע קוד לדוגמה עם שגיאה
// Incorrect: Overwriting window.fetch
const { fetch: originalFetch } = window;
window.fetch = (...args) => {
 console.log('Fetching!');
 return originalFetch(resource, config);
};
הצעות לדרכים לפתרון השגיאה
// Correct: Avoid making changes to browser APIs.
// If you need custom logic, consider leaving the browser API intact.
const myFetch = (...args) => {
  console.log('Fetching!');
  return window.fetch(...args);
}