Почему параметр setTargeting DFP/GAM не работает с предварительным предложением?

Когда мы используем параметр DFP для таргетинга объявлений с помощью пары "ключ-значение", мы заметили, что он не работает, когда также работает Prebid. Похоже, что Prebid переопределяет параметр setTargeting. Казалось бы, это распространенная проблема, но я не могу найти никакой информации об этом.

Если я отключу предварительную ставку, setTargeting работает нормально.

Я также пытался разместить setTargeting внутри функции pbjs.que.push сразу после pbjs.setTargetingForGPTAsync(); но это не помогло.

Я объединил код, чтобы включить только базовую настройку, чтобы показать, как у нас все настроено.

<script src='https://www.googletagservices.com/tag/js/gpt.js'></script>
<script type="text/javascript" src="https://ads.bninews.com/corporate/prebid/latest/prebid.js"></script>
<script type="text/javascript" src="https://ads.bninews.com/corporate/prebid/latest/prebid_config.js?20180913"></script>

<script>
  var googletag = googletag || {};
  googletag.cmd = googletag.cmd || [];
</script>

<script>
googletag.cmd.push(function() {
  googletag.defineSlot('/XXX/slot-300x250-1', [[300, 250]], 'div-gpt-ad-bigblock-1').addService(googletag.pubads());
  googletag.pubads().setTargeting("pageurl", "/home/");
  googletag.pubads().enableSingleRequest();
  googletag.pubads().disableInitialLoad();
  googletag.enableServices();
});
</script>

<!-- Prebid Boilerplate Section START -->
<script>
  pbjs.que.push(function() {
    pbjs.addAdUnits(adUnits);
    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);
</script>
<!-- Prebid Boilerplate Section END -->

person Steven Crawford    schedule 06.02.2019    source источник
comment
Есть ли доступная страница, где я могу наблюдать за этим поведением?   -  person James Ives    schedule 10.02.2019
comment
Конечно вещь. У меня есть тестовое объявление, настроенное для таргетинга на 4-е рекламное место на правой боковой панели этой страницы. vicksburgpost.com/2016/02/20/ Должен отображаться только серый прямоугольник. Однако в настоящее время показывается другое объявление. Я могу удалить пару ключ: значение, и она будет отображаться нормально, а также я могу отключить предварительную ставку, и она будет отображаться нормально.   -  person Steven Crawford    schedule 11.02.2019


Ответы (1)


Это определенно неправильная последовательность событий. Я даже не думаю, что pbjs.setTargetingForGPTAsync() вообще нужен, но вам нужно дождаться возврата prebid со ставками, прежде чем googletag.pubads().setTargeting("pageurl", "/home/");

Вы можете решить эту проблему с помощью обещания, которое будет обернуто вокруг предварительной заявки, и дождитесь, пока обещание разрешится внутри, например:

var prebidPromiseResponse = new Promise( function(resolve){ 

pbjs.que.push(function() {
    pbjs.addAdUnits(adUnits);
    pbjs.requestBids({
      bidsBackHandler: function(bids){
       if (pbjs.initAdserverSet) return;
       pbjs.initAdserverSet = true;
       googletag.cmd.push(function() {
        pbjs.que.push(function() {
           resolve(bids);
        });
      });
      },
      timeout: PREBID_TIMEOUT
    });
  });
})

А потом гугл тег

googletag.cmd.push(function() {
  googletag.defineSlot('/XXX/slot-300x250-1', [[300, 250]], 'div-gpt-ad-bigblock-1').addService(googletag.pubads());
  prebidPromiseResponse.then(function(bids){
  googletag.pubads().setTargeting("pageurl", "/home/");
  googletag.pubads().enableSingleRequest();
  googletag.pubads().disableInitialLoad();
  googletag.enableServices();
});
});
person Wpicode    schedule 12.02.2019
comment
Я не уверен, правильно ли я справился с этим, но я перенастроил свою тестовую страницу, чтобы сделать что-то похожее на то, что вы описываете. Хотя мне пришлось добавить googletag.pubads().refresh(); внутри функции promise.then. Я вижу таргетированную рекламу (последняя реклама большого блока на боковой панели, она просто серая). Однако когда я запускаю pbjs.getAllPrebidWinningBids() в консоли, она не возвращает ни одной выигрышной ставки. Вот снова тестовая страница: vicksburgpost.com/2016. /20/02/ - person Steven Crawford; 15.02.2019