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

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

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

תיאור תרחיש לדוגמה כללי יכול להיות שה-API של GPT לא יהיה מוכן כשקובץ ה-JavaScript gpt.js נטען או כשמוגדר אובייקט googletag, יש לבדוק את האובייקט כדי לראות אם ה-API של GPT לא זמין בצורה לא מהימנה.
דוגמה לקטע קוד עם שגיאה
// 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: הסתמכות על תחביר קוד מעורפל (obfuscated)

תיאור תרחיש לדוגמה כללי אם אתם מסתמכים על תחביר מדויק של קוד ספריית 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. דוגמה תקינה הזמנות חלקיות כוללות:
  • הגדרה-הפעלת תצוגה
    1. קביעת הגדרות ברמת הדף
    2. הגדרת משבצות
    3. enableServices()
    4. משבצות תצוגה
  • הפעלת הגדרה-תצוגה
    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, סגירות מתעדים משתנים באמצעות הפניה ולא באמצעות ערך. כלומר שאם משתנה מוקצה מחדש, אז המערכת תשתמש בערך החדש שלו כשהפונקציה סגירת הכביש שתיעדה אותו מבוצעת מאוחר יותר. כלומר ההתנהגות של הקוד בחסימה. עשוי להשתנות בהתאם לביצוע הקריאה החוזרת באופן מיידי או באיחור.

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

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

תרחיש 8: העברת קונטיינרים של יחידות קיבולת (Slot) בתוך ה-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");