现有GPT标签与Prebid.js集成后无法返回广告的问题求助
GPT广告标签集成Prebid.js后无法返回广告的排查与修复
我们网站原本部署了非Prebid的GPT广告标签,近期集成Prebid.js后,Prebid代码运行正常,但原有GPT标签无法返回任何广告。经测试后做出以下假设:
- GPT标签与头部竞价(header bidding)存在冲突;
- GPT标签未调用defineSlot,因为广告标签未生成google-query-id。
原有GPT标签代码
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script> <script> window.googletag = window.googletag || {cmd: []}; googletag.cmd.push(function() { googletag.defineSlot('/xxxx/xxxx', 'div-gpt-ad-xxxxxx').addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); googletag.enableServices(); }); </script>
Prebid集成代码
var div_1_sizes = [ [300, 75], [320, 50], [728, 90], [300, 50], ]; var PREBID_TIMEOUT = 100000; var FAILSAFE_TIMEOUT = 3000; var adUnits = [ { code: "xxxxx", mediaTypes: { banner: { sizes: div_1_sizes, }, }, bids: [ { bidder: "minutemedia", labelAny: ["desktop", "phone"], params: { org: "xxxx", placementId: "xxx", floorPrice: 0.05, }, }, ], }, ]; // ======== DO NOT EDIT BELOW THIS LINE =========== // var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; googletag.cmd.push(function () { googletag.pubads().disableInitialLoad(); }); var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function () { pbjs.addAdUnits(adUnits); pbjs.setConfig({ enableSendAllBids: true, sizeConfig: [ { mediaQuery: "(min-width: 1000px)", sizesSupported: [ [728, 90], ], labels: ["desktop"], }, { mediaQuery: "(min-width: 0px) and (max-width: 600px)", sizesSupported: [ [300, 75], [320, 50], [300, 50], ], labels: ["phone"], }, ], }); pbjs.requestBids({ bidsBackHandler: initAdserver, timeout: PREBID_TIMEOUT, }); }); function initAdserver() { if (pbjs.initAdserverSet) return; pbjs.initAdserverSet = true; googletag.cmd.push(function () { pbjs.que.push(function () { pbjs.setTargetingForGPTAsync(); googletag.pubads().refresh(); }); }); } // in case PBJS doesn't load setTimeout(function () { initAdserver(); }, FAILSAFE_TIMEOUT); googletag.cmd.push(function () { var mapping1 = googletag .sizeMapping() .addSize([1200, 0], [[728, 90]]) .addSize( [320, 0], [ [300, 50], [320, 50], [300, 75], ] ) .addSize( [0, 0], [ [300, 50], [320, 50], [300, 75], ] ) .build(); googletag .defineSlot( "xxxx", div_1_sizes, "xxxx" ) .defineSizeMapping(mapping1) .addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); googletag.pubads().collapseEmptyDivs(); googletag.enableServices(); });
核心问题分析
- 重复初始化冲突:原有GPT代码和Prebid代码分别调用
enableSingleRequest()、enableServices(),导致GPT初始化逻辑混乱,无法正确处理广告请求。 disableInitialLoad()的干扰:Prebid中调用该方法会阻止GPT在enableServices()时自动发送初始请求,但原有GPT标签依赖这个初始请求加载广告。- Slot定义不匹配:Prebid的
adUnits.code与GPT的Slot ID不一致,导致竞价结果无法关联到原有广告位;同时重复定义Slot也会引发识别问题。 - 超时设置不合理:Prebid的
PREBID_TIMEOUT设为100秒,远超合理范围,会导致广告加载严重延迟,甚至触发兜底超时后覆盖正常逻辑。
修复方案
1. 合并GPT初始化逻辑
删除独立的原有GPT标签代码,将所有GPT配置、Slot定义统一整合到Prebid的执行流程中,确保逻辑顺序一致。
2. 调整关键配置
- 仅调用一次
disableInitialLoad()、enableSingleRequest()和enableServices(),避免重复执行。 - 缩短
PREBID_TIMEOUT至1000-2000ms,平衡竞价效率和广告加载速度。 - 确保Prebid的
adUnits.code与GPT的Slot容器ID完全一致。
修复后的完整代码示例
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script> <script> var div_1_sizes = [ [300, 75], [320, 50], [728, 90], [300, 50], ]; var PREBID_TIMEOUT = 1500; var FAILSAFE_TIMEOUT = 3000; // 确保adUnits的code与GPT Slot ID完全匹配 var adUnits = [ { code: "div-gpt-ad-xxxxxx", mediaTypes: { banner: { sizes: div_1_sizes, }, }, bids: [ { bidder: "minutemedia", labelAny: ["desktop", "phone"], params: { org: "xxxx", placementId: "xxx", floorPrice: 0.05, }, }, ], }, ]; // GPT基础配置,仅执行一次 var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; googletag.cmd.push(function () { googletag.pubads().disableInitialLoad(); googletag.pubads().enableSingleRequest(); googletag.pubads().collapseEmptyDivs(); }); // Prebid初始化流程 var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function () { pbjs.addAdUnits(adUnits); pbjs.setConfig({ enableSendAllBids: true, sizeConfig: [ { mediaQuery: "(min-width: 1000px)", sizesSupported: [[728, 90]], labels: ["desktop"], }, { mediaQuery: "(min-width: 0px) and (max-width: 600px)", sizesSupported: [[300, 75], [320, 50], [300, 50]], labels: ["phone"], }, ], }); pbjs.requestBids({ bidsBackHandler: initAdserver, timeout: PREBID_TIMEOUT, }); }); // 广告服务器初始化逻辑 function initAdserver() { if (pbjs.initAdserverSet) return; pbjs.initAdserverSet = true; googletag.cmd.push(function () { // 定义所有广告Slot(包括原有GPT的Slot) var mapping1 = googletag .sizeMapping() .addSize([1200, 0], [[728, 90]]) .addSize([320, 0], [[300, 50], [320, 50], [300, 75]]) .addSize([0, 0], [[300, 50], [320, 50], [300, 75]]) .build(); googletag.defineSlot('/xxxx/xxxx', div_1_sizes, 'div-gpt-ad-xxxxxx') .defineSizeMapping(mapping1) .addService(googletag.pubads()); pbjs.setTargetingForGPTAsync(); googletag.enableServices(); googletag.pubads().refresh(); }); } // 兜底超时逻辑 setTimeout(function () { initAdserver(); }, FAILSAFE_TIMEOUT); </script>
验证要点
- 检查页面是否生成
google-query-id,确认GPT请求正常发起。 - 查看Prebid的竞价日志,确认竞价结果已传递给GPT。
- 测试不同设备尺寸,确保广告位尺寸映射生效。
内容的提问来源于stack exchange,提问作者Tapu Das
相关产品推荐
相关产品推荐

