تقول صفحة المساعدة لدى 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 نفسها محرر الموقع (Site Editor) بأنه أداة لتصميم «الموقع بأكمله بما في ذلك الترويسة والتذييل وكل ما بينهما، باستخدام الكتل».4 وتقول الصفحة نفسها إن محرر الموقع لا يتوفر إلا حين تكون سمة كتل نشطة، وتعرّف جزء القالب (template part) بأنه كتلة «لإدارة المناطق العامة المتكررة في الموقع».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، أو وسم meta، أو ملف مرفوع. وتُدرج صفحة Ghost وسوم meta ضمن الأشياء التي يُستخدم لها حقل Site Header، لذلك فإن الحقل الذي يحتوي السكربت يحتوي الوسم أيضًا.2 والناشر الذي يتحكم في DNS يستطيع إضافة السجل بدلًا من ذلك.

رابط الفقاعة موسوم لمحركات البحث، والقارئ لا يُتتبَّع

يحمل كل رابط داخل الفقاعة rel="sponsored noopener". ويقول Google Search Central إن «الروابط التي هي إعلانات أو مواضع مدفوعة» ينبغي وسمها بالقيمة sponsored، ويسمح بعدة قيم لـ rel في قائمة واحدة مفصولة بمسافات.8 ولا يضيف الناشر شيئًا، لأن شيفرة التضمين تعرض الرابط والسمة في مكانها. وتُعرض الفقاعة داخل Shadow DOM، فلا تستطيع أنماط CSS الخاصة بالموقع ولا تلك الخاصة بالفقاعة التأثير في الأخرى.

وما يغادر الصفحة ثلاث إشارات: مشاهدة واحدة لكل تحميل صفحة، وفتح واحد عندما تبقى الفقاعة ظاهرة لمدة ثانية واحدة، ونقرة واحدة عند اتباع رابط. لا تضع AdBubbles أي ملف تعريف ارتباط، ولا تخزّن أي معرّف، ولا تجمع أي بيانات شخصية من القرّاء. والمطابقة تجري بين الكلمات على الصفحة ومعلن اشتراها. ونحن لا نختار أيّ القرّاء يرى الفقاعة، ولا نتبع القارئ بين الصفحات أو المواقع، ولا نعد بأي نتيجة.

والخلاصة العملية للموقع الذي يضم عدة قوالب هي الفرق بين حقل على مستوى الموقع كله وحقل على مستوى الصفحة. فكلٌّ من Squarespace وGhost وWebflow يسمّي حقلًا واحدًا يصل إلى كل صفحة، ويقدّم Webflow أيضًا حقلًا تكون شيفرته «سارية على تلك الصفحة فقط».3 ويربح الناشر حين يتبع القارئ رابط الفقاعة، ولا يمكن للفقاعة أن تُفتح إلا حيث عملت شيفرة التضمين. فالسكربت الملصوق في حقل على مستوى الصفحة يمكن أن يُنتج فقاعات في تلك الصفحة وحدها، والحقل الخاص بالموقع كله هو الذي يضع شيفرة التضمين في كل صفحة.