Trang trợ giúp của Squarespace nói rằng mã nhập vào trường chèn mã header được đặt trong phần tử head “trên mọi trang của trang web của bạn.”1 Trang trợ giúp của Ghost nói rằng các script được thêm vào Site Header “sẽ xuất hiện trên từng trang của trang web của bạn.”2 Trang của Webflow nói rằng mã trong phần Head code “áp dụng cho toàn bộ trang web của bạn.”3 Mỗi nhà cung cấp trả lời trong một câu câu hỏi mà nhà xuất bản hỏi đầu tiên: đặt script ở đâu để nó chạy ở mọi nơi. WordPress trả lời cùng câu hỏi đó ở hai chỗ, vì một giao diện (theme) WordPress có thể được xây dựng từ các khối hoặc từ mã.

Mỗi nền tảng lưu trữ sẵn giới hạn trường toàn trang web theo gói dịch vụ, không theo kỹ năng

Trên Squarespace, trường này là ô header của bảng Code Injection.1 Cùng trang đó nói rằng chèn mã “có trong các gói thanh toán Core, Plus, Advanced và một số gói cũ.”1 Ghost đặt phiên bản của mình trong Settings, rồi Advanced, rồi Code Injection, với một ô Site Header cho phần head và một ô Site Footer cho phần cuối body.2 Webflow đặt phiên bản của mình trên thẻ Custom code của Site settings, với các phần Head code và Footer code, mỗi phần tối đa 50.000 ký tự.3 Trang của Webflow nói thêm rằng mã tùy chỉnh yêu cầu một Workspace Core, Growth, Agency hoặc Freelancer, hoặc một trang web có gói Site đang hoạt động.3

Trở ngại trên một nền tảng lưu trữ sẵn, nếu có, là gói thanh toán chứ không phải mã. Nhà xuất bản dùng gói có trường này có thể dán một phần tử script mà không cần mở mẫu nào. Nhà xuất bản dùng gói không có trường này thì không thể.

WordPress ghi trong tài liệu hai vị trí, và vai trò của tài khoản quyết định vị trí thứ nhất có hoạt động hay không

Tài liệu của chính WordPress mô tả Site Editor (Trình chỉnh sửa trang web) là công cụ để thiết kế “toàn bộ trang web bao gồm header, footer và mọi thứ ở giữa, bằng các khối.”4 Cùng trang đó nói rằng Site Editor chỉ có khi một giao diện khối (block theme) đang hoạt động, và định nghĩa phần mẫu (template part) là một khối “để quản lý các vùng toàn cục lặp lại của trang web.”4 Một khối Custom HTML đặt trong phần mẫu footer sẽ xuất hiện ở bất cứ nơi nào phần đó được dùng. Bản thân khối này được thêm từ trình chèn khối, hoặc bằng cách gõ /html trong một khối đoạn văn mới.5

Trang Custom HTML có một chi tiết quyết định script được dán có được giữ lại hay không. Bắt đầu từ WordPress 7.0, khối này có các bảng riêng cho HTML, CSS và JavaScript, và các bảng CSS và JavaScript “chỉ dành cho người dùng có quyền unfiltered_html.”5 Với người dùng không có quyền này (ví dụ của trang là một Contributor), WordPress làm sạch khối bằng wp_kses và loại bỏ các thẻ không được phép, trong đó có thẻ script.5 Vì vậy, vai trò của tài khoản thực hiện việc dán là một phần của việc thiết lập.

Mã của chính giao diện là vị trí còn lại. Theme Handbook nói rằng giao diện và plugin nên tải script “bằng phương pháp chuẩn của WordPress”: một hàm enqueue được gọi trên action wp_enqueue_scripts.6 Cùng trang đó cho thấy một khóa 'strategy' => 'defer' trong các đối số của hàm, giúp tải script theo kiểu trì hoãn, cùng với một tùy chọn 'async' bên cạnh.6 Một plugin AdBubbles cho WordPress đang được lên kế hoạch; cho đến khi có plugin, hai vị trí này là những vị trí mà WordPress ghi trong tài liệu.

Cách script tải quan trọng hơn trường nào chứa nó

Tiêu chuẩn HTML mô tả ba hành vi cho một phần tử script cổ điển. Một script không có thuộc tính defer lẫn async, theo lời của tiêu chuẩn, được “tải về và thực thi ngay lập tức, chặn việc phân tích cú pháp cho đến khi cả hai hoàn tất.”7 Với defer, script “sẽ được tải về song song và thực thi khi trang đã phân tích cú pháp xong.”7 Một script async được tải về song song và “thực thi ngay khi có sẵn (có thể trước khi phân tích cú pháp hoàn tất).”7 Trường quyết định nơi trình duyệt gặp phần tử; thuộc tính quyết định trình duyệt làm gì ở đó.

Mã nhúng, adbubbles.js, là một tệp tĩnh duy nhất, viết bằng JavaScript thuần không có phụ thuộc, được phân phối qua bộ nhớ đệm của Cloudflare, và tải sau khi DOM của trang đã sẵn sàng. Mở tài khoản nhà xuất bản không tốn chi phí, và mã nhúng cũng vậy. Nhà xuất bản đã thêm trang web có thể yêu cầu một lượt quét cho thấy những từ nào của trang hiện có thể bán trước khi dán bất cứ thứ gì. Trang cài đặt cung cấp chính xác phần tử script cần dán.

Phạm vi là quyết định cần suy nghĩ

Khi script đã có trên mọi trang, còn lại một quyết định mà không trang trợ giúp nào của nhà cung cấp có thể đưa ra. Phạm vi là phần của trang mà mã nhúng được phép quét, ví dụ phần tử article hoặc khối chứa entry-content. Ngay cả trong phạm vi, mã nhúng không động đến tiêu đề, liên kết, mã, văn bản định dạng sẵn, điều khiển biểu mẫu, thanh điều hướng, header và footer, cùng bất cứ thứ gì nhà xuất bản đánh dấu data-noads. Nó gạch chân lần xuất hiện đầu tiên của mỗi từ đã được mua. Giới hạn là một bong bóng cho mỗi từ, và hai bong bóng không bao giờ chung một đoạn văn.

Giả sử một giao diện WordPress bọc mỗi bài đăng trong một khối chứa có lớp entry-content và hiển thị một đoạn tiểu sử tác giả ngắn ở thanh bên. Phạm vi là entry-content có nghĩa là đoạn tiểu sử không bao giờ được quét, dù nó nằm trên trang và có thể chứa từ đã được mua. Phạm vi là toàn bộ phần tử main có nghĩa là đoạn tiểu sử cũng được quét, và một bong bóng có thể mở ra ở đó thay vì trong bài viết. Không lựa chọn nào sai, nhưng chúng bán những từ khác nhau.

Bên cạnh phạm vi, tài khoản lưu số bong bóng tối đa mỗi trang, các danh mục nhà quảng cáo cần loại trừ, và việc xác minh trang web. Việc xác minh có một trong ba hình thức: bản ghi DNS TXT, thẻ meta, hoặc tệp tải lên. Trang của Ghost liệt kê thẻ meta trong số những thứ mà trường Site Header dùng để chứa, nên trường chứa script cũng chứa luôn thẻ đó.2 Nhà xuất bản kiểm soát DNS có thể thêm bản ghi thay thế.

Liên kết của bong bóng được gắn nhãn cho công cụ tìm kiếm, và người đọc không bị theo dõi

Mọi liên kết bên trong bong bóng đều mang rel="sponsored noopener". Google Search Central nói rằng cần đánh dấu “các liên kết là quảng cáo hoặc vị trí trả phí” bằng giá trị sponsored, và cho phép nhiều giá trị rel trong một danh sách phân tách bằng dấu cách.8 Nhà xuất bản không cần thêm gì, vì mã nhúng hiển thị liên kết với thuộc tính đã có sẵn. Bong bóng được hiển thị bên trong một Shadow DOM, nên CSS của trang web và CSS của bong bóng không thể ảnh hưởng lẫn nhau.

Những gì rời khỏi trang là ba beacon: một lượt xem cho mỗi lần tải trang, một lượt mở khi bong bóng đã hiển thị được một giây, và một lượt nhấp khi một liên kết được mở. AdBubbles không đặt cookie, không lưu mã nhận dạng và không thu thập dữ liệu cá nhân của người đọc. Việc ghép diễn ra giữa các từ trên trang và một nhà quảng cáo đã mua chúng. Chúng tôi không chọn người đọc nào được xem bong bóng, không theo dõi người đọc giữa các trang hay các trang web, và không hứa hẹn kết quả.

Điểm thực tế đối với một trang web có nhiều mẫu là sự khác biệt giữa trường toàn trang web và trường cấp trang. Squarespace, Ghost và Webflow mỗi nền tảng nêu tên một trường áp dụng cho mọi trang, và Webflow còn cung cấp một trường mà mã trong đó “sẽ chỉ áp dụng cho trang đó.”3 Nhà xuất bản kiếm tiền khi người đọc mở liên kết của bong bóng, và bong bóng chỉ có thể mở ra ở nơi mã nhúng đã chạy. Một script dán vào trường cấp trang có thể tạo ra bong bóng trên đúng một trang đó, còn trường toàn trang web là trường đặt mã nhúng lên mọi trang.