أي ترميز schema.org يلزم كي تصل السعر والتوفّر إلى إجابة المساعد؟
ضع في صفحة المنتج عقدة Product و Offer تحمل price و priceCurrency و availability. يجب أن يكون JSON-LD هذا في HTML القادم من الخادم، وأن تطابق القيم الثلاث الـ feed. السعر الذي يظهر بعد JavaScript فقط ليس في HTML الذي حفظه الزاحف.
العقد في صفحة المنتج
schema.org Product هو الصنف. schema.org Offer هو الشروط التجارية: السعر والعملة وهل يمكن الشراء. schema.org AggregateRating ملخّص المراجعات وهو اختياري.
التعريفات: https://schema.org/Product و https://schema.org/Offer و https://schema.org/AggregateRating. ضع JSON-LD في HTML عنوان المنتج، لا في صفحة التصنيف وحدها.
لدى Google فحص منفصل لـ merchant listings: https://developers.google.com/search/docs/appearance/structured-data/merchant-listing وصفحة product snippet: https://developers.google.com/search/docs/appearance/structured-data/product. هذه القائمة التي يتحقق منها Google الآن. ليست وعدًا بأن ChatGPT أو Perplexity أو Gemini تقرأ الحقول نفسها.
صفحة merchant listing تشترط Product.name و image و Offer متداخلًا، لا AggregateOffer. يحتاج Offer إلى سعر أكبر من صفر، في price أو في priceSpecification.price، ومعه priceCurrency. availability موصى به.
Offer: السعر والعملة والتوفّر
price هو المبلغ الذي يدفعه المشتري بالوحدات الكبرى مع نقطة عشرية. 18.00 ثمانية عشر لا ألف وثمانمئة. لا تضع رمز العملة داخل price.
priceCurrency رمز ISO 4217 مثل PLN أو EUR أو USD. حقل مستقل. الزوج هو price بقيمة 18.00 و priceCurrency بقيمة PLN. السلسلة 18.00 PLN تصلح لملف الـ feed لا لهذين الحقلين.
availability عنوان URL من نوع ItemAvailability. متوفّر: https://schema.org/InStock. غير متوفّر: https://schema.org/OutOfStock. طلب مسبق: https://schema.org/PreOrder. انتظار توريد: https://schema.org/BackOrder. استخدم هذا العنوان الكامل. صفحة merchant listing لدى Google تقبل أيضًا الاسم القصير InStock. حالة المتجر instock ليست أيًا منهما.
url في Offer هو صفحة المنتج، مع اختيار المتغيّر إن كان السعر لمتغيّر واحد. itemCondition يمكن أن يكون https://schema.org/NewCondition إن كان الصنف جديدًا. priceValidUntil اختياري ولا يغني عن تحديث الـ feed.
AggregateOffer مع lowPrice و highPrice يصف مدىً. لا يقول أي متغيّر متوفّر. استخدمه فقط حين تقصد مدىً. لمتغيّر واحد يُباع: Offer واحد.
Product و AggregateRating
Product.name الاسم في الصفحة. image عنوان صورة مباشر ويمكن تكراره. description نص عادي. sku معرّفك. brand عقدة Brand مع name أو نص. offers يشير إلى Offer أو إلى مصفوفة Offer حين تكون عدة متغيّرات عروضًا حقيقية.
AggregateRating.ratingValue المتوسط. reviewCount عدد المراجعات التي بُني منها. ratingCount مقبول في schema.org كعدّاد آخر. bestRating يساوي 5 إن حذفته. لا تُخرج تقييمًا بلا مراجعات. لا تخلط مراجعات المتجر في عدّاد المنتج.
الحقائق نفسها قد تكون في ملف OpenAI كـ star_rating و review_count. هناك الحقلان اختياريان. إن ذكرت الصفحة والملف تقييمًا، فليكن لمجموعة المراجعات نفسها.
الـ feed والصفحة نسختان
لـ Google Merchant Center feed خاص. مواصفة بيانات المنتج تستخدم id و title و description و link و image_link و availability و price و brand. السعر هناك مثل 18.00 PLN. تستخدم availability القيم in_stock و out_of_stock و preorder و backorder. المرجع: https://support.google.com/merchants/answer/7052112.
ملف الاكتشاف لدى OpenAI يستخدم item_id و url و image_url و price بالشكل 18.00 PLN، ويكتب الطلب المسبق pre_order. seller_name إلزامي هناك وليس له مقابل في الصف الأساسي لدى Google.
Offer في الصفحة و feed لدى Google و feed لدى OpenAI ثلاث نسخ لحقيقة واحدة. إن اختلفت لا تختار أنت أي نسخة يكرّرها المساعد.
صفحة التجار لدى OpenAI تقول إن الـ feed اختياري حين يزحف ChatGPT إلى الموقع أصلًا، وإن الـ feed يعطي تحكمًا أكبر في ظهور المنتجات. لا تقول إن الـ feed يغلب حين يختلف السعران. Perplexity و Gemini و Google AI Overviews ليست هذا الـ feed. في صفحة AI features لدى Google يجب أن تطابق البيانات المهيكلة النص الظاهر.
مثال كامل
منتج واحد وعرض واحد، والترميز في HTML من الخادم. استبدل عناوين example.com. في price لا رمز عملة. availability عنوان schema.org كامل.
إن كان للكوب متغيّر أزرق وآخر أبيض بسعرين مختلفين، لا تخفِ السعرين من HTML ولا تبدّلهما بسكريبت. إما لكل متغيّر عنوانه و Offer الخاص، أو في مصفوفة offers Offer لكل متغيّر مع price و availability و url خاصة.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Ceramic mug, 350 ml",
"image": "https://example.com/images/mug.jpg",
"description": "Glazed ceramic mug with a handle. Dishwasher safe.",
"sku": "MUG-350",
"brand": { "@type": "Brand", "name": "Northline" },
"offers": {
"@type": "Offer",
"url": "https://example.com/products/mug",
"priceCurrency": "PLN",
"price": "72.00",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "28"
}
}كيف تتحقق
افتح عنوان المنتج في Rich Results Test: https://search.google.com/test/rich-results. يجلب الخدمة العنوان أو تلصق HTML. اقرأ عنصر Product. يجب أن تكون price و priceCurrency و availability قيم اليوم في الصفحة لا قيمة قديمة من القالب.
مدقّق schema.org على https://validator.schema.org/ يفحص المفردات. قد يصح الرسم ويحمل سعرًا خاطئًا. قارن السعر المستخرج بالسعر الذي يراه المشتري.
اطلب HTML الخام أيضًا. استخدم curl لعنوان المنتج أو view-source وابحث عن سلسلة السعر وعن schema.org/InStock. إن ظهرا بعد hydration فقط فليسا في الاستجابة الأولى.
ما الذي يكسر السعر
سعر يكتبه JavaScript في المتصفح فقط غائب من HTML الأول. توثّق Google أن Googlebot ينفّذ JavaScript: https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics. الوثيقة عن Googlebot. لا تقول الأمر نفسه عن كل زاحف AI.
لا توثّق OpenAI و Perplexity و Anthropic محرّك JavaScript لـ GPTBot أو OAI-SearchBot أو ChatGPT-User أو PerplexityBot أو ClaudeBot. ضع السعر في HTML الذي يرسله الخادم.
ثم يكسر الاختلاف مع الـ feed. الصفحة تقول 72.00 PLN والملف 79.99 USD، أو الصفحة متوفّرة والملف يقول out_of_stock. أصلح المصدر الذي تقرأ منه النسختان. لا ترقّع الترميز وحده.
المتغيّرات تكسر السعر حين يقدّم عنوان واحد أسعارًا كثيرة ويسمّي Offer الأول فقط. لون يختاره المتصفح ولا يغيّر HTML الخادم يترك للمساعد المتغيّر الافتراضي. أعطِ المتغيّر عنوانًا ثابتًا وضعه في Offer.url.
إخفاقات صامتة أخرى: availability بكلمة المتجر بدل عنوان schema.org، وسعر بفاصلة عشرية، و Offer في التصنيف وغائب عن عنوان المنتج، و AggregateRating مع ratingValue و reviewCount يساوي صفرًا.
توثّق OpenAI نحو 24 ساعة حتى يؤثر تغيير robots.txt في البحث. لا تنشر مدة لسعر مصحَّح. ارفع لقطة كاملة مرة في اليوم على الأقل، ثم افحص SKU نفسه من جديد.
- HTML عنوان المنتج يحوي Product و Offer قبل تشغيل أي سكريبت.
- price عدد عشري بالوحدات الكبرى، و priceCurrency رمز ISO.
- availability هي https://schema.org/InStock أو عنوان عدم التوفّر أو الطلب المسبق أو انتظار التوريد.
- لكل متغيّر بسعره Offer خاص أو عنوان خاص.
- لا AggregateRating حين لا توجد مراجعات.
- سعر Offer يطابق سعر Google Merchant و feed لدى OpenAI.
- يُظهر Rich Results Test السعر الذي يراه المشتري.
هل يلزم JSON-LD أم تكفي Microdata؟
يسمح schema.org بأكثر من صياغة. JSON-LD في HTML الخادم أسهل للمقارنة مع الـ feed. المهم أن يكون السعر والتوفّر في HTML المجلوب تحت أسماء يمكن قراءتها.
هل تحمل صفحة التصنيف Offer لكل منتج؟
العرض يعيش على العنوان الذي يُباع فيه المنتج. شبكة التصنيف قد تكرّر الأسماء. لا ينبغي أن تكون المكان الوحيد للسعر. المساعدون يقتبسون عنوان المنتج.
أي عنوان توفّر إن نفد الصنف؟
https://schema.org/OutOfStock. أبقِ Offer في الصفحة مع السعر الحالي. حذف Offer لا يقول إن الصنف غير متوفّر. يقول لا شيء.
هل يغيّر AggregateRating السعر الذي يذكره المساعد؟
لا. السعر من Offer.price و priceCurrency. AggregateRating ملخّص المراجعات. احذفه إن كان reviewCount سيصبح صفرًا.