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

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

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

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

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

כדי להימנע מבעיות, יש לכתוב את הקוד ללא ההנחה שהוא מתפקד הוצב בתור הפקודות יבוצע מיד, ויש לנקוט זהירות בנוגע לכללי ההיקפים של 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);
}