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

התרחישים הבאים מייצגים כמה מהשגיאות הנפוצות ביותר שזוהו בהטמעה של 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 async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
// Also correct, if using Limited Ads
<script async src="https://pagead2.googlesyndication.com/tag/js/gpt.js"></script>

תרחיש 2: הסתמכות על מאזינים של תגי הסקריפט gpt.js

תיאור תרחיש לדוגמה כללי בהנחה ש-GPT API מוכן להפעלה כשקובץ ה-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, כדי שתוכלו להגיע לטענות מהימנות.

תרחיש 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. דוגמאות של הזמנות חלקיות ותקינות:
  • הגדרה-הפעלה-הצגה
    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");