Как вывести один RTB‑блок Яндекса несколько раз на одной странице

Опубликовано 3 года назад

В Гугл Адсенс можно создать один рекламный блок и вставить его несколько раз на одной странице. В Рекламной сети Яндекса (РСЯ) RTB‑блок можно вставить на страницу только один раз, и мы попробуем это исправить.

Ставить один и тот же блок, например, в шапку, сайдбар, футер, контент — идея не очень. Потому что там скорее всего будут разные форматы, общая статистика и сложность в понимании, где реклама работает, а где нет. В таких случаях лучше создавать уникальные рекламные блоки. Клонирование RTB‑блоков может пригодиться при их интеграции на большие страницы, различные лонгриды, ленты с бесконечной прокруткой, подгрузкой и т.д. Для этих целей у Яндекса как раз есть решение, которое можно взять за основу. Продублирую его у себя, потому что найти его в документации не так просто.

Показ рекламы в лентах с бесконечной прокруткой

Для показа рекламы в лентах с бесконечной прокруткой Яндекс допускает использование одного и того же рекламного блока, в котором может меняться параметр pageNumber и название контейнера renderTo. Уникальный идентификатор блока blockId, полученный в конструкторе, остается неизменным.

Пример кода вызова для первого блока

<div id="rtb-5-1"></div>
<script type="text/javascript">
     (function (w, d, n, s, t) {        
         w[n] = w[n] || [];
         w[n].push(function() {
             Ya.Context.AdvManager.render({
                 blockId: "R-A-12345-1",
                 renderTo: "rtb-5-1",
                 pageNumber: 1
             });
         });
         t = d.getElementsByTagName("script")[0];
         s = d.createElement("script");
         s.type = "text/javascript";
         s.src = "//an.yandex.ru/system/context.js";
         s.async = true;
         t.parentNode.insertBefore(s, t);
     })(this, this.document, "yandexContextAsyncCallbacks");
</script>

Пример кода вызова для второго блока

<div id="rtb-5-2"></div>
 <script type="text/javascript">
     (function (w, d, n, s, t) {      
         w[n] = w[n] || [];
         w[n].push(function() {
             Ya.Context.AdvManager.render({
                 blockId: "R-A-12345-1",
                 renderTo: "rtb-5-2",
                 pageNumber: 2
             });
         });
         t = d.getElementsByTagName("script")[0];
         s = d.createElement("script");
         s.type = "text/javascript";
         s.src = "//an.yandex.ru/system/context.js";
         s.async = true;
         t.parentNode.insertBefore(s, t);
     })(this, this.document, "yandexContextAsyncCallbacks");
</script>

Источник: Яндекс Справка

Доработаем немного код

В нашем решении pageNumber будет генерироваться с помощью обычного счетчика на JavaScript, а затем добавляться в ID блока и задаваться в качестве параметра pageNumber при запросе рекламного блока.

<div id="yandex_rtb"></div>
<script type="text/javascript">
 
 if (typeof pageNumber == "undefined") { var pageNumber = 1; }
 else { pageNumber++; }
 document.getElementById("yandex_rtb").id = "yandex_rtb_" + pageNumber;
 
 (function(w, d, n, s, t) {
     w[n] = w[n] || [];
     w[n].push(function() {
       Ya.Context.AdvManager.render({
         blockId: "R-A-000000-1",
         renderTo: "yandex_rtb_" + pageNumber,
         async: true,
         pageNumber: pageNumber
       });
     });
     t = d.getElementsByTagName("script")[0];
     s = d.createElement("script");
     s.type = "text/javascript";
     s.src = "//an.yandex.ru/system/context.js";
     s.async = true;
     t.parentNode.insertBefore(s, t);
 })(this, this.document, "yandexContextAsyncCallbacks");
 
</script>

Решение рабочее, проверил на нескольких сайтах.

Я бы не советовал сильно увлекаться, расставляя блоки через каждый абзац. Лучше оставлять между ними разумное расстояние, хотя бы в 1‑2 экрана. Если не сработает, можно попробовать сделать задержку в пару секунд перед инициализацией второго и последующих блоков.

Основа скрипта взята на Searchengines.

Иван Данилин
Автор Иван Данилин

Фулстек веб‑разработчик, специализируюсь на платформе WordPress

Подробнее
Комментарии
  1. <?php
    $n = countAI::getCount();
    ?>
    <!-- Yandex.RTB R-A-xxx-<?=$n?> -->
    <div id="yandex_rtb_R-A-xxx-<?=$n?>"/div>
    <script>window.yaContextCb.push(()=>{
    Ya.Context.AdvManager.render({
    renderTo: 'yandex_rtb_R-A-xxx-<?=$n?>',
    blockId: 'R-A-xxx-4',
    pageNumber: <?=$n?>
    })
    })</script>

    <?php
    $n = countAI::getCount();
    ?>
    <!-- Yandex.RTB R-A-xxx-<?=$n?> -->
    <div id="yandex_rtb_R-A-xxx-<?=$n?>"/div>
    <script>window.yaContextCb.push(()=>{
    Ya.Context.AdvManager.render({
    renderTo: 'yandex_rtb_R-A-xxx-<?=$n?>',
    blockId: 'R-A-xxx-4',
    pageNumber: <?=$n?>
    })
    })</script>
  2. <!-- Yandex.RTB R-A-xxx- -->
    <div id="yandex_rtb_R-A-xxx-">
    window.yaContextCb.push(()=>{
    Ya.Context.AdvManager.render({
    renderTo: 'yandex_rtb_R-A-xxx-',
    blockId: 'R-A-xxx-4',
    pageNumber:
    })
    })


    <!-- Yandex.RTB R-A-xxx- -->
    <div id="yandex_rtb_R-A-xxx-">
    window.yaContextCb.push(()=>{
    Ya.Context.AdvManager.render({
    renderTo: 'yandex_rtb_R-A-xxx-',
    blockId: 'R-A-xxx-4',
    pageNumber:
    })
    })
    • Вот здесь есть подробное описание
      https://yandex.ru/support/partner/web/products-rtb/partner-code.html#partner-code__neverending-scroll
  3. У Яндекса сменился код рекламы он состоит сейчас из двух частей, нет ли у вас проверенного решения для нового кода?
  4. Чувак ты просто золото !!!! Я уже пол года ищу решение даного вопроса, и наконец то мои поиски закончились ))
  5. Здравствуйте. Попробовал ваш код. в 12 строке blockId: «R-A-000000-1», заменил на номер своего блока. Однако теперь показывается только самый последний ртб-блок. Как починить? Спасибо.
Добавить комментарий