Справочная страница Squarespace гласит, что код, введённый в поле внедрения в заголовок, помещается в элемент head «на каждой странице вашего сайта».1 Справочная страница Ghost гласит, что скрипты, добавленные в Site Header, «будут появляться на каждой без исключения странице вашего сайта».2 Страница Webflow гласит, что код в разделе Head code «применяется ко всему вашему сайту».3 Каждый поставщик одним предложением отвечает на вопрос, который издатель задаёт первым: куда поставить скрипт, чтобы он работал везде. WordPress отвечает на тот же вопрос в двух местах, потому что тема WordPress может быть построена из блоков или из кода.
Каждая хостинговая платформа ограничивает поле для всего сайта тарифом, а не навыками
В Squarespace это поле — блок заголовка на панели Code Injection.1 На той же странице сказано, что внедрение кода «доступно в тарифах Core, Plus, Advanced и некоторых устаревших тарифах».1 Ghost держит свой вариант в разделе Settings, затем Advanced, затем Code Injection, с блоком Site Header для head и блоком Site Footer для конца body.2 Webflow держит свой вариант на вкладке Custom code в Site settings, с разделами Head code и Footer code объёмом до 50 000 символов каждый.3 Страница Webflow добавляет, что для пользовательского кода нужна рабочая область Core, Growth, Agency или Freelancer либо сайт с активным тарифом Site.3
Препятствие на хостинговой платформе, если оно есть, — это тариф, а не код. Издатель на тарифе, включающем это поле, может вставить элемент script, не открывая шаблон. Издатель на тарифе без него — не может.
WordPress описывает два места, и роль аккаунта решает, сработает ли первое
Собственная документация WordPress описывает редактор сайта как инструмент для оформления «всего сайта, включая шапку, подвал и всё, что между ними, с помощью блоков».4 На той же странице сказано, что редактор сайта доступен только при активной блочной теме, а шаблонная часть определяется как блок «для управления повторяющимися глобальными областями сайта».4 Блок Custom HTML, помещённый в шаблонную часть подвала, появляется везде, где используется эта часть. Сам блок добавляется через средство вставки блоков или вводом /html в новом блоке абзаца.5
На странице о Custom HTML есть деталь, от которой зависит, сохранится ли вставленный скрипт. Начиная с WordPress 7.0 у блока есть отдельные панели для HTML, CSS и JavaScript, а панели CSS и JavaScript «доступны только пользователям с правом unfiltered_html».5 Для пользователя без этого права (в примере на странице — Contributor) WordPress очищает блок с помощью wp_kses и удаляет запрещённые теги, в том числе тег script.5 Поэтому роль аккаунта, которым выполняется вставка, — часть настройки.
Оставшееся место — собственный код темы. Справочник по темам (Theme Handbook) указывает, что темы и плагины должны загружать скрипты «стандартным для WordPress способом»: функцией постановки в очередь, вызываемой на действии wp_enqueue_scripts.6 На той же странице показан ключ 'strategy' => 'defer' в аргументах функции, который загружает скрипт отложенно, а рядом — вариант 'async'.6 Плагин AdBubbles для WordPress запланирован; пока его нет, документация WordPress описывает именно эти два места.
Важнее то, как загружается скрипт, чем то, в каком поле он находится
Стандарт HTML описывает три варианта поведения классического элемента script. Скрипт без атрибутов defer и async, по словам стандарта, «загружается и выполняется немедленно, блокируя разбор, пока и то и другое не завершится».7 С defer скрипт «будет загружаться параллельно и выполнится, когда страница закончит разбор».7 Скрипт с async загружается параллельно и «выполняется, как только становится доступен (возможно, до завершения разбора)».7 Поле определяет, где браузер встретит элемент; атрибут определяет, что браузер там сделает.
Скрипт встраивания, adbubbles.js, — один статический файл на чистом JavaScript без зависимостей, отдаваемый через кэш Cloudflare, и он загружается после того, как DOM страницы готов. Открытие аккаунта издателя ничего не стоит, как и скрипт встраивания. Издатель, добавивший сайт, может ещё до вставки чего-либо запросить обход, который покажет, какие слова сайта сейчас можно продать. Страница установки приводит точный элемент script для вставки.
Область — решение, которое требует размышления
Когда скрипт есть на каждой странице, остаётся одно решение, которое не может принять ни одна справочная страница поставщика. Область — это часть страницы, которую скрипту встраивания разрешено сканировать, например элемент article или контейнер entry-content. Даже внутри области скрипт не трогает заголовки, ссылки, код, предварительно отформатированный текст, элементы форм, навигацию, шапку и подвал, а также всё, что издатель пометил data-noads. Он подчёркивает первое вхождение каждого купленного слова. Ограничение — один пузырь на слово, и два пузыря никогда не оказываются в одном абзаце.
Предположим, тема WordPress оборачивает каждую запись в контейнер с классом entry-content и показывает короткую биографию автора в боковой колонке. Область entry-content означает, что биография никогда не сканируется, хотя она есть на странице и может содержать купленные слова. Область, охватывающая весь элемент main, означает, что сканируется и биография, и пузырь может открыться там, а не в статье. Ни один из вариантов не ошибочен, но они продают разные слова.
Помимо области, в аккаунте хранятся максимальное число пузырей на странице, исключаемые категории рекламодателей и подтверждение сайта. Подтверждение бывает трёх видов: запись DNS TXT, метатег или загруженный файл. Страница Ghost называет метатеги среди того, для чего предназначено поле Site Header, так что поле, в котором находится скрипт, вмещает и тег.2 Издатель, управляющий DNS, может вместо этого добавить запись.
Ссылка в пузыре помечена для поисковых систем, а за читателем не следят
Каждая ссылка внутри пузыря содержит rel="sponsored noopener". Google Search Central рекомендует помечать значением sponsored «ссылки, являющиеся рекламой или платными размещениями», и допускает несколько значений rel в одном списке через пробел.8 Издателю ничего добавлять не нужно, потому что скрипт встраивания отрисовывает ссылку уже с этим атрибутом. Пузырь отрисовывается внутри Shadow DOM, поэтому CSS сайта и CSS пузыря не могут влиять друг на друга.
Со страницы уходят три маячка: один просмотр на загрузку страницы, одно открытие, когда пузырь оставался видимым одну секунду, и один клик, когда читатель переходит по ссылке. AdBubbles не устанавливает cookie, не хранит идентификаторов и не собирает персональные данные читателей. Сопоставление происходит между словами на странице и рекламодателем, который их купил. Мы не выбираем, какие читатели видят пузырь, не следим за читателем при переходах между страницами или сайтами и не обещаем результата.
Практический момент для сайта с несколькими шаблонами — разница между полем для всего сайта и полем уровня страницы. Squarespace, Ghost и Webflow называют по одному полю, которое охватывает каждую страницу, а Webflow предлагает ещё и поле, код из которого «будет применяться только к этой странице».3 Издатель зарабатывает, когда читатель переходит по ссылке пузыря, а пузырь может открыться только там, где сработал скрипт встраивания. Скрипт, вставленный в поле уровня страницы, может давать пузыри на одной этой странице, а поле для всего сайта — то, что ставит скрипт встраивания на каждую страницу.