You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

现有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();
            });

核心问题分析

  1. 重复初始化冲突:原有GPT代码和Prebid代码分别调用enableSingleRequest()、enableServices(),导致GPT初始化逻辑混乱,无法正确处理广告请求。
  2. disableInitialLoad()的干扰:Prebid中调用该方法会阻止GPT在enableServices()时自动发送初始请求,但原有GPT标签依赖这个初始请求加载广告。
  3. Slot定义不匹配:Prebid的adUnits.code与GPT的Slot ID不一致,导致竞价结果无法关联到原有广告位;同时重复定义Slot也会引发识别问题。
  4. 超时设置不合理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:15:46