SEO في Sanity
يخزن Sanity المحتوى في صورة JSON ولا ينتج أي HTML؛ لذلك تحدد الواجهة الأمامية مخرجات SEO. يغطي الدليل أوضاع التصيير وPortable Text وكائن SEO وخرائط الموقع وحماية المسودات بـnoindex وJSON-LD والإضافات.
اللغات
Sanity نظام إدارة محتوى منفصل يخزن المحتوى في صورة JSON منظمة داخل Content Lake ولا ينتج HTML، لذا تتحكم الواجهة الأمامية المبنية مثلًا بـNext.js أو Astro أو Remix في كل مخرجات SEO. العامل الأهم هو التصيير: يرسل SSG وSSR HTML مكتملًا، بينما ينطوي CSR على مخاطرة لأن عقود تصيير زواحف نماذج اللغة تختلف باختلاف المزود. Portable Text شجرة بنية مجردة بصيغة JSON لا HTML، وعلى الواجهة تسلسلها. أنشئ كائن SEO قابلًا لإعادة الاستخدام، وولّد خرائط الموقع وJSON-LD برمجيًا، وأبعد المسودات عن الفهرس بترويسة X-Robots-Tag: noindex، واستخدم sanity-plugin-seo بدل لوحة Yoast المهملة. نجاح SEO في Sanity ثمرة بنية مقصودة لا إضافات.
الخلاصة — Sanity مكان لتخزين المحتوى، لا منصة تنشر صفحات ويب. فهو يقدم محتواك في صورة بيانات JSON لا HTML مكتمل، ولذلك يجب على موقع منفصل مبني بأداة مثل Next.js أو Astro تحويل تلك البيانات إلى صفحات. وهذا يعني أن عناصر SEO المعتادة، مثل العناوين وخرائط المواقع ووسوم canonical، لا تحدث تلقائيًا كما في WordPress. والقاعدة الأهم هي أن تبني الصفحات على الخادم أو وقت البناء، لا داخل متصفح الزائر بالكامل، وإلا فقد لا ترى محركات البحث وأدوات الذكاء الاصطناعي محتواك.
ما هو Sanity فعلًا؟
يفترض بعض الناس أن Sanity «نظام إدارة محتوى مثل WordPress»، ومن هنا يبدأ الالتباس. Sanity نظام إدارة محتوى منفصل يؤدي وظيفتين: يخزن المحتوى فيما تسميه Sanity Content Lake، ويوفر للمحررين مكانًا للكتابة هو Sanity Studio. أما ما لا يفعله فهو إنتاج سطر واحد من HTML؛ إذ يخرج المحتوى في صورة بيانات JSON منظمة عبر API.
Evidence for this claim Sanity stores structured content in Content Lake and provides it to applications as data rather than finished site HTML. Scope: Sanity platform architecture; the frontend owns public rendering. Confidence: high · Verified: Sanity: Content Lakeوهذا يعني أن موقعًا منفصلًا، مبنيًا بإطار مثل Next.js أو Astro أو Remix، يجب أن يجلب JSON ويبني الصفحات الفعلية التي يراها الناس ومحركات البحث. يخزن Sanity المحتوى، وتنشره واجهتك الأمامية. عندما تستوعب هذه الجملة، يصبح معظم ما يتعلق بـSEO في Sanity واضحًا.
القرار الأهم: طريقة التصيير
لأن الواجهة الأمامية تبني الصفحات، فإن كيفية بنائها تحدد نتيجة SEO. توجد طريقتان آمنتان وطريقة محفوفة بالمخاطر:
- وقت البناء (SSG) — تُبنى الصفحات مسبقًا كملفات HTML عادية؛ وهي سريعة وملائمة للبحث.
- على الخادم لكل طلب (SSR) — يبني الخادم الصفحة كاملة ويرسلها؛ وهي أيضًا ملائمة للبحث ودائمة الحداثة.
- في متصفح الزائر (CSR) — يرسل الخادم غلافًا شبه فارغ ثم تملؤه JavaScript لاحقًا؛ وهذه هي الطريقة المحفوفة بالمخاطر.
تستطيع Google تشغيل JavaScript وقراءة صفحة CSR في نهاية المطاف، لكن ذلك أبطأ وأقل موثوقية. كما أن الزواحف وراء ChatGPT وClaude وPerplexity لا تصيّر JavaScript عادةً في الوقت الحالي، ولذلك لا ترى سوى الغلاف الفارغ. وليست هذه قاعدة ثابتة؛ فإجابات Gemini لدى Google تعيد استخدام بنية التصيير الخاصة بـGooglebot، ما يثبت أن السلوك يختلف بين المزودين ولا يضمن ثباته. إذا أردت الظهور في Google والاستشهاد بمحتواك في أدوات الذكاء الاصطناعي، فأنشئ HTML على الخادم أو وقت البناء.
Evidence for this claim Google can render JavaScript pages, but browser-only content depends on a separate rendering stage. Scope: Google Search only; this record does not support claims about named AI crawlers. Confidence: high · Verified: Google: JavaScript SEO basicsمشكلة «أين اختفت إعدادات SEO؟»
في WordPress، كانت إضافة مثل Yoast تتولى بهدوء العناوين وأوصاف meta وخريطة الموقع ووسوم canonical. لا يقدم Sanity شيئًا مماثلًا، ولذلك يجب على أحدهم أن ينفذ عمدًا ما يلي:
- إضافة حقول SEO، مثل العنوان والوصف وصورة المشاركة، إلى المحتوى في Sanity.
- ربط هذه الحقول بـHTML لكل صفحة في الواجهة الأمامية.
- بناء خريطة موقع وrobots.txt وبيانات منظمة، وكلها في الشيفرة.
لا شيء من ذلك صعب، لكنه لن يحدث تلقائيًا. فكثير من قصص «موقعي المبني على Sanity لا يملك SEO» تعني في الحقيقة «لم يبنِ أحد ما كان المكون الإضافي يتولاه».
أمران يختلان بصمت
- وصول صفحات المسودات إلى Google. يستطيع Sanity تقديم المسودات غير المنشورة عبر API. وإذا شارك شخص رابط معاينة فعثر عليه زاحف، فقد تُفهرس المسودة؛ لذا يجب حظرها بفاعلية.
- نص أساسي غير مرئي. يخزن Sanity النص المنسق بصيغة خاصة تسمى Portable Text، وهي بيانات لا HTML. يجب أن تحوله الواجهة الأمامية. وفي صفحة CSR يحدث التحويل في المتصفح، ولذلك لا ترى زواحف الذكاء الاصطناعي نص المقال.
هل تريد النسخة الكاملة التي تشرح طرق التصيير الأربع وإعداد حقول SEO القابلة لإعادة الاستخدام وخرائط المواقع وحماية وضع المسودة وJSON-LD والمكونات التي ينبغي استخدامها؟ انتقل إلى تبويب Advanced.
الخلاصة — Sanity محايد تجاه المخرجات: يخزن JSON منظمًا في Content Lake ولا يصدر أي HTML، ولذلك تحدد طريقة التصيير في الواجهة الأمامية كل شيء. يقدم SSG وSSR HTML مكتملًا وهما آمنان، بينما ينطوي CSR على مخاطرة لأن عقود تصيير زواحف نماذج اللغة تختلف بين المزودين. Portable Text شجرة بنية مجردة بصيغة JSON يجب على الواجهة تسلسلها. ابنِ كائن
seoقابلًا لإعادة الاستخدام في نموذج المحتوى، مع قيم تجاوز لا حقول إلزامية باستخدامcoalesce()، وأنشئ خرائط المواقع وJSON-LD برمجيًا من الحقول الموجودة، وأبق المسودات خارج الفهرس بترويسةX-Robots-Tag: noindexفي كل استجابة معاينة. استخدمsanity-plugin-seoولا تستخدم لوحة Yoast المهملة، لكن تذكر أن «نجاح SEO في Sanity يأتي من البنية المقصودة لا المكونات الإضافية».
Sanity مخزن محتوى لا ناشر
مبدأ أول مفيد: يتعامل Sanity مع محتواك، لا مع تصييره. تخزن Content Lake كل شيء في صورة JSON منظم، ويُستعلم عنه باستخدام GROQ، لغة استعلام Sanity، أو REST. أما Sanity Studio، وهي واجهة التحرير، فتطبيق React أحادي الصفحة يوجد عادةً على نطاق فرعي مستقل ينتهي بـ.sanity.studio وليس مما تريد فهرسته. لا ينتج أي جزء من هذه المنظومة HTML.
لذلك يعيش سطح SEO كله في إطار الواجهة الأمامية. وتوضح Webstacks أن Sanity يتولى تخزين المحتوى وتحريره، بينما تتولى الواجهة الأمامية مخرجات SEO. وهذا ليس قيدًا، بل جوهر النموذج المنفصل. ويصف فريق Sanity استخدامه بأنه SEO لنظام منفصل يتطلب تنفيذًا تقنيًا مدروسًا، لكنه يتيح للمحتوى الوصول إلى مستخدمين أكثر عبر القنوات المختلفة. العمل حقيقي، لكنه العمل نفسه في أي بناء منفصل؛ راجع SEO لنظام إدارة محتوى منفصل.
طريقة التصيير هي الأساس
لأن الواجهة الأمامية تبني HTML، فإن قرار التصيير هو أهم اختيار منفرد لـSEO في موقع Sanity. توجد أربع طرق:
SSG، أي التوليد الثابت للموقع. يُجلب المحتوى من Sanity وقت البناء ويُدمج في HTML ثابت تقدمه CDN. وهذه أفضل حالة لـSEO: HTML مصيّر بالكامل من أول طلب وTTFB سريع. وهي مثالية للمقالات وصفحات التسويق والمنتجات والهبوط. المقايضة هي الحداثة، إذ يحتاج المحتوى المتغير إلى إعادة بناء، وتحل ISR ذلك.
SSR، أي التصيير من جانب الخادم. يُجلب المحتوى عند كل طلب ويُصيّر HTML كاملًا على الخادم. وهو ممتاز لـSEO ودائم الحداثة، ويناسب المحتوى كثير التحديث. والمقايضة هي تكلفة البنية الأساسية وTTFB أعلى قليلًا من الملفات الثابتة.
ISR، أي إعادة التوليد الثابت التزايدي في Vercel وNext.js. تتجدد الصفحات الثابتة في الخلفية، ومن الأفضل أن يشغل التجديد webhook من Sanity عند النشر حتى يعاد بناء الصفحة لحظة ضغط المحرر على زر النشر. ويجمع ذلك سرعة SSG وحداثة SSR للمحتوى الذي يتغير كل ساعات أو أيام.
CSR، أي التصيير من جانب العميل. يصل غلاف HTML ثم تجلب JavaScript المحتوى من Sanity وتبني DOM في المتصفح. وهذا أسوأ خيار لـSEO؛ إذ يجب على Googlebot وضع الصفحة في طابور موجة تصيير لاحقة، ويظل التوقيت غير متوقع، بينما لا ترى زواحف الذكاء الاصطناعي وكثير من الروبوتات سوى الغلاف. لا يناسب CSR إلا المحتوى الموجود خلف المصادقة الذي لا تريد فهرسته أصلًا.
ولا تستخدم الاختصار القديم: أهملت Google التصيير الديناميكي، أي تقديم HTML مصيّر مسبقًا للروبوتات وCSR للمستخدمين. تقول رسميًا: “dynamic rendering was a workaround and not a long-term solution,” (الترجمة العربية): «كان التصيير الديناميكي حلًا التفافيًا لا حلًا طويل الأجل»، وتوصي الآن بـ*“server-side rendering, static rendering, or hydration.”* (الترجمة العربية): «التصيير من جانب الخادم أو التصيير الثابت أوhydration». وهذا يعني لموقع Sanity استخدام SSG أو SSR لا حيلة لكشف الروبوتات. وترد المعالجة الكاملة في JavaScript SEO.
Evidence for this claim Google describes dynamic rendering as a workaround rather than a recommended long-term solution and recommends server-side rendering, static rendering, or hydration. Scope: Google Search guidance for JavaScript sites. Confidence: high · Verified: Google: Dynamic renderingPortable Text — نص الصفحة شجرة بنية مجردة بصيغة JSON
هذا أكثر ما يخص Sanity تحديدًا في الصفحة. يخزن Sanity النص المنسق بصيغة Portable Text، وهي شجرة بنية مجردة في JSON وليست HTML. يظهر نص Content Lake كمصفوفة كتل ذات أنواع، لا وسوم <p>. ويجب على واجهتك تسلسله إلى HTML قبل أن يستطيع أي زاحف قراءته:
-
@portabletext/reactلإطاري React وNext.js. -
@portabletext/to-htmlمستقل عن الإطار، ويناسب Astro وRemix وغيرهما. - الحزمة القديمة
@sanity/block-content-to-reactمهملة؛ فلا تستخدمها.
إذا صيّرت على الخادم أو وقت البناء، يحدث التسلسل قبل إرسال الصفحة وتتلقى الزواحف HTML كاملًا. أما إذا صيّرت لدى العميل، فيجري التسلسل في المتصفح. ولأن عقود تصيير زواحف نماذج اللغة تختلف بين المزودين، فإن Portable Text مع CSR يُعرّض التغطية للخطر على نحو يتجنبه HTML الخام. وثمة دالة GROQ مفيدة: تستخرج pt::text(body) النص العادي كله من حقل Portable Text كسلسلة، وهي مثالية لتغذية أوصاف JSON-LD من دون حقل تحرير منفصل.
نمذجة المحتوى لـSEO — كائن SEO القابل لإعادة الاستخدام
أنظف نمط، وهو الذي تدرسه دورة Sanity نفسها، كائن seo واحد قابل لإعادة الاستخدام يضاف إلى كل نوع مستند، لا حقول SEO منسوخة في كل نوع. ومبدأ التصميم الأساسي في Sanity Learn هو ألا تُفرض الحقول المتعلقة بـSEO دائمًا على كتّاب المحتوى، بل تُستخدم عند توفيرها لتجاوز القيم المشتقة من المحتوى القائم.
عمليًا، يعني ذلك أن حقول SEO قيم تجاوز ذات بدائل احتياطية تنفذ باستخدام coalesce() في GROQ:
"title": coalesce(seo.title, title, ""),
"description": coalesce(seo.description, excerpt, "")الحد الأدنى القابل للاستخدام من كائن seo هو: metaTitle بما لا يزيد على 65 حرفًا، وmetaDescription بما لا يزيد على 155 حرفًا، وcanonicalUrl، وopenGraphImage بأبعاد 1200×630، وقيمة منطقية noIndex. أضف قواعد تحقق في Sanity لفرض حدود الأحرف قبل النشر حتى يكتشف المحررون مشكلات كانت المنصة ستسمح بها. استخدم نوع slug مع دالة توليد مخصصة، واستخدم المراجع للروابط الداخلية كي تنتشر تغييرات URL تلقائيًا. وأضف قيمة منطقية hideFromSearch واستبعدها من استعلام GROQ لخريطة الموقع ومن بيانات robots الوصفية للصفحة معًا.
البيانات الوصفية وخرائط المواقع وcanonical — كلها تُبنى في الواجهة الأمامية
البيانات الوصفية. في Next.js App Router استخدم الدالة المصدّرة generateMetadata()، لا وسوم <head> المضمنة، حتى لا تتكرر البيانات عبر التخطيطات المتداخلة. ابنِ دالة مساعدة واحدة على الخادم تستقبل نتيجة GROQ وتعيد كائن البيانات الوصفية الخاص بالإطار؛ نفذها مرة واستخدمها في كل موضع. ويمكن إنشاء صور Open Graph ديناميكيًا باستخدام Edge OG في Next.js مع جلب المحتوى مباشرة من Sanity.
خرائط المواقع. لا توجد خريطة تلقائية؛ بل تبنيها من استعلام GROQ ثم مصفوفة URL ثم XML، باستخدام sitemap.ts في Next.js أو @astrojs/sitemap في Astro. استبعد المسودات والصفحات المخفية دائمًا:
*[_type in ["page", "post"] && defined(slug.current) && hideFromSearch != true]استخدم _updatedAt لا _createdAt أو تاريخًا يدويًا لقيمة lastModified، وأبق كل ملف خريطة تحت 50 000 عنوان URL مع فهرس للمواقع الأكبر، وشغّل إعادة التوليد عبر webhook من Sanity عند النشر أو إلغاء النشر كي لا تصبح الخريطة قديمة.
عناوين canonical. اضبطها من نموذج المحتوى، واجعل القيمة الافتراضية canonical ذاتي الإشارة، وابنِ العناوين المطلقة من قيمة SITE_URL واحدة حتى لا تنحرف. وترد الآليات في تحديد canonical.
البيانات المنظمة — ولّدها ولا تجعلها محتوى يحرره المستخدم
النمط الصحيح هو توليد JSON-LD برمجيًا من حقول المحتوى القائمة وقت التصيير، لا بناء واجهة منفصلة لتحرير JSON-LD في Studio، لأن ذلك لا يفعل سوى إنشاء انحراف بين المحتوى والترميز. قاعدة Roboto Studio صريحة: “Derive JSON-LD from existing fields, at render time, in code.” (الترجمة العربية): «اشتق JSON-LD من الحقول القائمة وقت التصيير داخل الشيفرة». ويوافق Sanity: “JSON-LD is a powerful way to provide structured data to search engines — fortunately structured data is what Sanity does best.” (الترجمة العربية): «JSON-LD وسيلة قوية لتقديم البيانات المنظمة إلى محركات البحث، ولحسن الحظ فالبيانات المنظمة هي ما يتقنه Sanity».
استخدم pt::text(body) لاستخراج النص العادي لأوصاف schema، وحزمة TypeScript المسماة schema-dts لضمان الأنواع، وصيّره باستخدام <script type="application/ld+json">. ولاحظ أن “the JSON-LD markup can be rendered anywhere in the page — it doesn’t need to be stored inside the <head>.” (الترجمة العربية): «يمكن تصيير ترميز JSON-LD في أي موضع من الصفحة، ولا يلزم تخزينه داخل <head>». والأنواع ذات الأولوية لمواقع المحتوى هي Article وBlogPosting وBreadcrumbList وFAQPage وOrganization وWebSite.
إبقاء المسودات خارج Google — مأزق وقع فعلًا
يتحكم نظام perspective في Sanity في ظهور المسودات؛ فالقيمة published تعيد محتوى الإنتاج وحده، بينما تعيد drafts مستندات المسودة للمعاينة. استخدم منظور published دائمًا في استدعاءات API للإنتاج. لكن هذا وحده لا يكفي لأن عناوين المسودات قد تتسرب. وكما روى أحد المطورين، تكمن الخطورة في “a client panicking because an unpublished landing page showed up in Google Search Console. If a content editor shares that URL in Slack, and someone clicks it from a browser that’s then crawled (it happens), the draft content can end up indexed.” (الترجمة العربية): «ذعر عميل لأن صفحة هبوط غير منشورة ظهرت في Google Search Console. فإذا شارك محرر المحتوى عنوانها في Slack ونقره شخص من متصفح يُزحف إليه لاحقًا، وقد حدث ذلك، فقد ينتهي الأمر بفهرسة محتوى المسودة».
الدفاع الموثوق متعدد الطبقات:
- استخدم منظور
publishedفي الإنتاج، ولا تكشف أبدًا نقطة معاينة غير محمية. - أضف ترويسة HTTP **
X-Robots-Tag: noindexإلى كل استجابة في وضع المسودة أو المعاينة**؛ فحتى إذا تسرب URL للمسودة وزُحف إليه، يحترم Googlebot الترويسة ولا يفهرسه. لا تعتمد على robots.txt هنا؛ فالترويسة أوثق من disallow لصفحات المعاينة. - تحقق من سر المعاينة على الخادم، ولا تعكسه في URL لإعادة التوجيه، واقصر نقطة تفعيل المعاينة على أصل Studio الخاص بك.
Robots وإعادة التوجيه وSEO للصور وhreflang
robots.txt ملف ثابت في الواجهة الأمامية، مثل app/robots.ts في Next.js. احظر مسارات Studio فقط إذا كانت على النطاق نفسه، باستخدام Disallow: /studio/، ولا تحاول حظر صفحات المعاينة به.
عمليات إعادة التوجيه مكسب حقيقي لسير العمل: خزّنها كمستندات Sanity تحتوي from وto وstatusCode كي يديرها فريق المحتوى من دون نشر ينفذه مطور، ثم طبقها في middleware.ts لدى Next.js أوفي طبقة CDN أو Worker، لا داخل Sanity نفسه. أضف قواعد تحقق تمنع الحلقات والمسارات غير الصالحة.
SEO للصور: استخدم CDN للصور في Sanity مع ?auto=format للحصول تلقائيًا على WebP أو AVIF، وأدر النص البديل على مستوى الأصل مع إمكان تجاوزه في المستند، واستخدم أسماء ملفات مقروءة بدل العناوين المجزأة، واضبط hotspot وcrop حتى تبقي الاقتصاصات التلقائية العنصر الأساسي، وهو مهم خصوصًا لصور OG.
Hreflang: مثّل تنويعات الإعدادات المحلية كمستندات Sanity مستقلة تشير إلى النسخة المعتمدة، وأنشئ hreflang من استعلام GROQ يعيد slugs للإعدادات المحلية كلها، وامنح كل صفحة محلية canonical ذاتي الإشارة؛ ولا تجعل صفحة غير إنجليزية تشير عبر canonical إلى الإنجليزية.
المكونات الإضافية — مفيدة لكنها ليست بديلًا
sanity-plugin-seo— التوصية الأساسية، وله أكثر من 22k تنزيل. يقدم درجة SEO مباشرة ومعاينة meta وOG وبطاقات اجتماعية وتحكمًا في robots وhreflang وقابلية القراءة. وتضيف الفئة المدعومة بالذكاء الاصطناعي اقتراحات الكلمات وتوليد meta.sanity-plugin-seofields— بديل يوفر 39 نوعًا من schema.org ولوحة SEO Health ودوال مساعدة لـNext.js مثلbuildSeoMeta().sanity-plugin-seo-pane— مهمل. هذا هو تكامل Yoast القديم الذي أزيل بسبب تبعية قديمة، لكنه ما زال يظهر في شروح قديمة؛ فلا تستخدمه.
ويلخص Yanatiev الفكرة بأن نجاح SEO في Sanity يأتي من البنية المقصودة لا المكونات الإضافية. تكشف الإضافات الحقول وتقدم ملاحظات تحريرية، لكنها لا تستبدل نمذجة المحتوى السليمة.
البحث بالذكاء الاصطناعي وAEO
التطور في 2026 هو أن زواحف تدريب نماذج اللغة والاسترجاع، مثل Anthropic وOpenAI وCommon Crawl، لا تنفذ JavaScript عادةً اليوم؛ لذا يظل Portable Text المعروض عبر CSR غير مرئي لها إلى حد بعيد، بصرف النظر عن قدرة Googlebot على تصييره. لكن ذلك خاص بكل مزود وليس عقدًا مضمونًا. وتمثل منظومة Gemini الاستثناء الملحوظ لأنها تعيد استخدام بنية تصيير Googlebot، كما يمكن أن يتغير سلوك المزودين. تعامل مع عدم التصيير على أنه الافتراض الآمن للبناء، لا قانونًا دائمًا. وإلى جانب التصيير توجد طريقتان مناسبتان لـSanity: تقديم Markdown عبر التفاوض على المحتوى عند وجود Accept: text/markdown، إذ تحول حزمة @portabletext/markdown Portable Text من دون تأليف إضافي، ومراقبة Bing تحديدًا لأن فهرسه يغذي إجابات التصفح في ChatGPT. ويشكك Knut Melvær من Sanity في جدوى llms.txt للمواقع الكبيرة لأن النطاق الشامل وحدود حجم الملف يجعلانها غير عملية، بينما يوفر التفاوض على مستوى الصفحة دقة أكبر. كما يلخص Roboto Studio العقلية الصحيحة بأن AEO وSEO يعتمدان على البنية التحتية نفسها، ومن ثم ينبغي التعامل معهما كمهمة واحدة. المزيد في البحث بالذكاء الاصطناعي.
خرافات تستحق الإنهاء
- «ينفذ Sanity SEO تلقائيًا مثل WordPress مع Yoast». لا؛ فهو لا ينتج أي HTML ولا ينفذ شيئًا تلقائيًا.
- «أي طريقة تصيير مناسبة ما دام المحتوى في Sanity». لا؛ يضر CSR بالفهرسة والظهور للذكاء الاصطناعي، والتصيير الديناميكي مهمل.
- «لا يمكن فهرسة المسودات». يمكن فهرستها إذا تسرب URL للمعاينة؛ استخدم ترويسة
noindex. - «Portable Text هو HTML». بل شجرة JSON يجب على الواجهة تسلسلها.
- «تحتاج إلى محرر JSON-LD في Studio». لا؛ ولّده من الحقول القائمة.
ملخص بالذكاء الاصطناعي
خلاصة مركزة من النسخة المتقدمة:
- Sanity محايد تجاه المخرجات. يخزن JSON منظمًا في Content Lake، ويُستعلم عنه عبر GROQ أو REST، ولا ينتج أي HTML. وتنتج الواجهة الأمامية، مثل Next.js أو Astro أو Remix، جميع مخرجات SEO. والقول إن «Sanity ينفذ SEO مثل WordPress» خرافة.
- طريقة التصيير هي الأساس. يقدم SSG وSSR HTML كاملًا وهما آمنان، وتضيف ISR المشغلة بـwebhook عند النشر الحداثة، بينما ينطوي CSR على مخاطرة. وقد أهملت Google التصيير الديناميكي؛ فاستخدم SSR أو التصيير الثابت أوhydration.
- يختلف تصيير زواحف نماذج اللغة حسب المزود؛ ويزيد HTML الخام تغطية Portable Text.
- Portable Text شجرة JSON لا HTML. سلسله باستخدام
@portabletext/reactأو@portabletext/to-html؛ والحزمة@sanity/block-content-to-reactمهملة. واستخدمpt::text(body)لاستخراج النص العادي لـJSON-LD. - نمذجة المحتوى: كائن
seoواحد قابل لإعادة الاستخدام في جميع الأنواع، وحقول تجاوز لا متطلبات عبرcoalesce()، وقواعد تحقق تفرض الحدود، وعلامةhideFromSearchمستبعدة من الخريطة وبيانات robots معًا. - خرائط المواقع والبيانات الوصفية وcanonical وrobots.txt كلها تُبنى في الواجهة. استبعد المسودات من استعلام GROQ للخريطة، واستخدم
_updatedAtلـlastModified، وأعد التوليد باستخدام webhooks من Sanity. - ولّد JSON-LD برمجيًا من الحقول القائمة وقت التصيير، ولا تبنِ محررًا منفصلًا في Studio. استخدم
schema-dts؛ ويمكن تصييره في أي موضع لا في<head>وحده. - أبق المسودات خارج الفهرس: استخدم منظور
publishedفي الإنتاج وأضف ترويسةX-Robots-Tag: noindexإلى كل استجابة معاينة؛ فقد أدت عناوين مسودات متسربة إلى حوادث فهرسة فعلية. - المكونات:
sanity-plugin-seoهو الأساسي، وsanity-plugin-seofieldsبديل. أما تكامل Yoast المسمىsanity-plugin-seo-paneفهو مهمل. ويأتي نجاح SEO في Sanity من البنية المقصودة لا المكونات. - AEO: راقب Bing الذي يغذي تصفح ChatGPT، وقدم Markdown عبر التفاوض على المحتوى؛ وينصح Sanity بعدم استخدام
llms.txtللمواقع الكبيرة.
الوثائق الرسمية
وثائق أولية المصدر من محركات البحث وSanity.
- فهم أساسيات JavaScript SEO — خط الزحف ثم التصيير ثم الفهرسة، وcanonical في JavaScript، ولماذا لا تُصيّر الملفات المحظورة؛ وهو المرجع الأساسي لأي واجهة Sanity.
- التصيير الديناميكي، وهو حل التفافي مهمل — سبب إهماله والبدائل، مثل SSR والتصيير الثابت وhydration.
- التصيير لتطبيقات الويب القائمة على المحتوى — مقايضات SSR وSSG وCSR للمواقع التي يشغلها Sanity.
- وسم robots وdata-nosnippet وX-Robots-Tag — ترويسة HTTP
X-Robots-Tag: noindexلإبقاء استجابات المسودات والمعاينة خارج الفهرس. - مقدمة إلى robots.txt — ما يفعله وما لا يفعله؛ فهو يتحكم في الزحف لا فهرسة المسودات المتسربة.
Bing وMicrosoft
- Bingbot الدائم التحديث المبني على Microsoft Edge — تصيير JavaScript في Bingbot، وهو مهم لأن فهرس Bing يغذي تصفح ChatGPT.
- IndexNow وindexnow.org — بروتوكول الدفع الذي تربطه بـwebhook النشر في Sanity.
Sanity
- SEO باستخدام Sanity — دليل Sanity الرئيسي.
- دورة تحسين SEO — دورة Next.js الكاملة، بما فيها أنواع schema وخرائط المواقع الديناميكية وJSON-LD.
- عرض المحتوى ومعاينته، perspectives — منظور
publishedمقابلdrafts، وهو أساس أمان وضع المسودة.
اقتباسات من المصادر
تصريحات موثقة ذات صلة بـSEO في Sanity، ويرتبط كل منها مباشرة بموضعه في صفحة المصدر.
Sanity — نموذج SEO للأنظمة المنفصلة
- “When using Sanity as a CMS, you’re doing headless SEO. Although this approach requires thoughtful technical implementation, it can liberate your content to help you reach more users across all channels.” (الترجمة العربية): «عندما تستخدم Sanity نظامًا لإدارة المحتوى، فأنت تنفذ SEO لنظام منفصل. ورغم أن هذا النهج يتطلب تنفيذًا تقنيًا مدروسًا، فإنه يحرر محتواك ليساعدك على الوصول إلى مستخدمين أكثر عبر جميع القنوات». — Sanity، SEO with Sanity. الانتقال إلى الاقتباس
- “SEO doesn’t have to be complicated. It’s a matter of taking content you’ve already responsibly structured with Sanity and rendering it in the format and places that search engines expect.” (الترجمة العربية): «لا يلزم أن يكون SEO معقدًا؛ بل يتعلق بأخذ المحتوى الذي نظمته بمسؤولية في Sanity وتصييره بالتنسيق والمواضع التي تتوقعها محركات البحث». — Sanity Learn، SEO Optimization course. الانتقال إلى الاقتباس
- “For the benefit of content authors, fields relevant to SEO should not always be required. Instead, they should be used to override some existing content, when provided.” (الترجمة العربية): «لمصلحة كتّاب المحتوى، ينبغي ألا تكون الحقول المتعلقة بـSEO إلزامية دائمًا؛ بل تستخدم عند توفيرها لتجاوز محتوى قائم». — Sanity Learn، أنواع مخططات SEO والبيانات الوصفية. الانتقال إلى الاقتباس
- “JSON-LD is a powerful way to provide structured data to search engines—fortunately structured data is what Sanity does best.” (الترجمة العربية): «JSON-LD وسيلة قوية لتقديم بيانات منظمة إلى محركات البحث، ولحسن الحظ فالبيانات المنظمة هي ما يتقنه Sanity». — Sanity Learn، Generating JSON-LD dynamically. الانتقال إلى الاقتباس
Google — التصيير الديناميكي مهمل
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (الترجمة العربية): «كان التصيير الديناميكي حلًا التفافيًا لا حلًا طويل الأجل لمشكلات المحتوى المولد بـJavaScript في محركات البحث». — وثائق Google Search Central. الانتقال إلى الاقتباس
- والبديل الموصى به: “server-side rendering, static rendering, or hydration.” (الترجمة العربية): «التصيير من جانب الخادم أو التصيير الثابت أوhydration». الانتقال إلى الاقتباس
القطاع — الواجهة تملك SEO والبنية تتفوق على المكونات
- “Sanity handles content storage and editing, while your frontend framework handles SEO output.” (الترجمة العربية): «يتولى Sanity تخزين المحتوى وتحريره، بينما يتولى إطار واجهتك الأمامية مخرجات SEO». — Webstacks، Sanity SEO. قراءة الدليل
- “AEO and SEO live on the same plumbing, so we treat them as one job.” (الترجمة العربية): «يعمل AEO وSEO على البنية التحتية نفسها، لذا نعاملهما كمهمة واحدة». — Roboto Studio وJono Alford، أفضل ممارسات AEO وSEO في Sanity. قراءة المقال
- “SEO success in Sanity comes from intentional structure, not plugins.” (الترجمة العربية): «يأتي نجاح SEO في Sanity من البنية المقصودة لا المكونات الإضافية». — Yanatiev، أفضل ممارسات SEO لنظام Sanity CMS. قراءة المقال
- “Probably don’t do llms.txt.” (الترجمة العربية): «ربما لا تستخدم llms.txt». — Knut Melvær من Sanity، How to serve content to agents. قراءة الدليل الميداني
قائمة تحقق SEO في Sanity
مراجعة مبنية على طريقة عمل Sanity فعلًا: ابنِ ما تتركه المنصة للواجهة الأمامية، وأحكم حماية ما يختل بصمت.
التصيير والمحتوى، وهما الأساس
- تصيّر الصفحات محتواها في HTML عند أول طلب باستخدام SSG أو SSR، لا بعد تشغيل JavaScript لدى العميل وحدها.
- لا تعتمد أي صفحة حاسمة لـSEO على CSR؛ إذ يزيد HTML الخام تغطية زواحف نماذج اللغة.
- إذا استُخدمت ISR، فيشغل إعادة التوليد webhook من Sanity عند النشر لا مؤقت وحده.
- يُسلسل Portable Text على الخادم باستخدام
@portabletext/reactأو@portabletext/to-html، لا الحزمة المهملةblock-content-to-react.
نموذج المحتوى
- كائن
seoواحد قابل لإعادة الاستخدام في كل نوع مستند، لا نسخ مكررة لكل نوع. - حقول SEO قيم تجاوز عبر
coalesce()، مع قواعد تحقق تفرض طول العنوان والوصف قبل النشر. - توجد قيمة منطقية
hideFromSearchأوnoIndexوتُستبعد من كل من استعلام GROQ لخريطة الموقع وبيانات robots الوصفية للصفحة.
مخرجات الواجهة الأمامية
- ترتبط البيانات الوصفية من GROQ بـ
generateMetadata()أو ما يعادلها في الإطار، عبر دالة مساعدة واحدة قابلة لإعادة الاستخدام. - تُنشأ الخريطة من GROQ مع استبعاد المسودات والمخفي، واستخدام
_updatedAtلـlastModified، وإعادة التوليد عبر webhook. - عناوين canonical مطلقة من
SITE_URLواحدة، ولكل صفحة عنوان ذاتي الإشارة افتراضيًا. - يوجد robots.txt في الواجهة، ولا تُحظر ملفات
.jsو.css. - يُولد JSON-LD برمجيًا من الحقول القائمة، لأنواع Article وBreadcrumb وFAQ وOrganization، ويُتحقق منه باستخدام Rich Results Test.
أمان المسودة والمعاينة
- تستخدم استدعاءات API في الإنتاج منظور
published. - ترسل كل استجابة مسودة أو معاينة ترويسة
X-Robots-Tag: noindex. - يُتحقق من سر المعاينة على الخادم ويُقصر على أصل Studio.
AEO والمراقبة
- إعداد Bing Webmaster Tools، لأن Bing يغذي تصفح ChatGPT، وربط IndexNow بالنشر.
- اختياريًا: تقديم Markdown عبر التفاوض على المحتوى لزواحف الذكاء الاصطناعي.
النماذج الذهنية
1. يخزن Sanity وتنشر الواجهة الأمامية. تحتفظ Content Lake بـJSON، وينتج إطارك كل بايت من HTML وكل إشارة SEO. قبل تشخيص أي مشكلة SEO في Sanity، اسأل: ماذا ترسل الواجهة الأمامية فعلًا إلى الزواحف؟ تكاد كل المشكلات تُحل بالعودة إلى ذلك.
2. طريقة التصيير هي المنتج. اختر وفق تغير المحتوى:
- محتوى ثابت في الغالب، مثل المدونة والوثائق والتسويق ← SSG مع إعادة بناء أو ISR عند النشر.
- محتوى كثير التغير يجب أن يبقى حديثًا ← SSR.
- يتغير كل ساعات أو أيام وتريد سرعة الملفات الثابتة ← ISR مشغلة بـwebhook.
- خلف تسجيل الدخول وغير مقصود للفهرسة ← CSR مقبول.
- محتوى عام تريد ترتيبه أو الاستشهاد به في الذكاء الاصطناعي ← لا تستخدم CSR أبدًا.
3. قيم تجاوز لا حقول إلزامية.
تعود حقول SEO افتراضيًا إلى المحتوى الأساسي ولا تتجاوزه إلا عندما يملؤها محرر، وذلك باستخدام coalesce(). يحافظ هذا على بساطة تجربة التحرير ويضمن وجود شيء لكل صفحة في عنوانها ووصفها.
4. ولّد الترميز ولا تجعله محتوى مؤلفًا. تُشتق خرائط المواقع وJSON-LD وhreflang وعناوين canonical كلها من الحقول القائمة في الشيفرة وقت التصيير. وأي واجهة تحرير منفصلة لها لا تنشئ سوى الانحراف. “Derive from existing fields, at render time, in code.” (الترجمة العربية): «اشتقها من الحقول القائمة وقت التصيير داخل الشيفرة».
5. دفاع متعدد الطبقات للمسودات.
منظور published في الإنتاج هو الطبقة الأولى، وترويسة X-Robots-Tag: noindex في كل استجابة معاينة هي الثانية. لا تعتمد أبدًا على وسيلة تحكم واحدة لإبقاء المحتوى غير المنشور خارج الفهرس.
Sanity SEO — ورقة مرجعية سريعة
طرق التصيير في نظرة واحدة
| الطريقة | موضع بناء HTML | SEO | الأنسب لـ | موضع الحذر |
|---|---|---|---|---|
| SSG | وقت البناء ← ملفات ثابتة | ✅ الأفضل | المدونات والوثائق والتسويق | يصبح قديمًا حتى إعادة البناء |
| SSR | الخادم، لكل طلب | ✅ الأفضل | المحتوى كثير التحديث | كلفة بنية أعلى |
| ISR | ثابت + تجديد عبر webhook | ✅ جيد | محتوى كل ساعة أو يوم | اضبط webhook النشر |
| CSR | في المتصفح | ⚠️ محفوف بالمخاطر | لوحات بعد تسجيل الدخول | غير مرئي لزواحف الذكاء الاصطناعي |
ما يُبنى في الواجهة الأمامية لا في Sanity
| المخرج | الطريقة |
|---|---|
| HTML لنص الصفحة | تسلسل Portable Text باستخدام @portabletext/react أو -to-html |
| وسوم meta | generateMetadata() من نتيجة GROQ |
| خريطة الموقع | استعلام GROQ ← XML؛ استبعاد المسودات؛ _updatedAt لـlastmod |
| canonical | عناوين مطلقة من SITE_URL واحدة، لكل صفحة |
| robots.txt | ملف ثابت في الواجهة، مثل robots.ts في Next.js |
| JSON-LD | مولد من الحقول القائمة، مع schema-dts للأنواع |
| عمليات إعادة التوجيه | مستندات Sanity ← middleware في الواجهة أو Worker |
مقتطفات GROQ تستحق الحفظ
- تجاوز مع قيمة احتياطية:
coalesce(seo.title, title, "") - نص عادي من Portable Text:
pt::text(body) - مرشح خريطة الموقع:
*[... && defined(slug.current) && hideFromSearch != true]
قواعد سريعة
- يختلف تصيير زواحف نماذج اللغة حسب المزود ← تجنب المحتوى العام المعروض بـCSR وحده.
- التصيير الديناميكي مهمل؛ استخدم SSR أو التصيير الثابت أوhydration.
- المسودات: منظور
publishedمع ترويسةX-Robots-Tag: noindex. - الإضافة:
sanity-plugin-seo✅، أماsanity-plugin-seo-pane(Yoast) فمهمل ❌. - “SEO success in Sanity comes from intentional structure, not plugins.” (الترجمة العربية): «يأتي نجاح SEO في Sanity من البنية المقصودة لا المكونات الإضافية».
ظهور مسودة أو محتوى معاينة في Search Console
استخدم هذا الدليل التشغيلي عندما يملك مستند Sanity غير منشور URL معاينة قابلًا للاكتشاف أو يظهر في Google Search Console.
- حدد الاستجابة التي تسربت. اجلب URL المبلغ عنه من دون بيانات Studio وافحص الحالة وترويسة
X-Robots-Tag. إذا أعاد محتوى منشورًا فانتقل إلى الخطوة 2، وإذا كشف مسودة فعطّل نقطة المعاينة أثناء المتابعة. - تحقق من منظور الإنتاج. تتبع طلب GROQ وتأكد من أن الإنتاج يستخدم
published. إذا استخدمdraftsفأصلح الاستعلام أولًا، وإلا فانتقل إلى طبقة الاستجابة. - أضف صمام أمان للفهرسة. أرسل
X-Robots-Tag: noindexفي كل استجابة معاينة ووضع مسودة. وإذا غابت الترويسة عن أي مسار، فأصلح middleware المشترك لا صفحة واحدة. - تحقق من وصول المعاينة. تأكد من فحص السر على الخادم، وعدم عكسه في URL الوجهة، وقبول الطلبات من أصل Studio المقصود وحده. إذا ظل رابط معاينة عام يعمل، فدوّر السر وأغلق المسار.
- أزل النسخة المفهرسة. بعد تأمين الاستجابة، استخدم إزالة Search Console إذا كان التعرض عاجلًا ثم اطلب زحفًا جديدًا. وإذا كان URL يجب ألا يوجد علنًا، فأبق استجابة
noindexمتاحة حتى تراها الزواحف بدل حظرها في robots.txt. - تحقق من الإصلاح. اجلب URL وأنت خارج الحساب وشغّل فحص URL. يجب أن تغيب المسودة عن النص وأن تحمل استجابة المعاينة
noindex.
أخطاء يجب تجنبها في SEO لـSanity
توقع أن يصدر Sanity HTML الخاص بـSEO
لماذا هذا خطأ؟ يخزن Sanity JSON ولا ينشر عناوين أو canonical أو خرائط مواقع أو HTML للصفحة. ما ينبغي فعله بدلًا من ذلك: اجعل الواجهة مسؤولة عن كل مخرج، وتحقق من الاستجابة المولدة لا من حقول Studio.
اختيار CSR للمحتوى العام
لماذا هذا خطأ؟ الاستجابة الأولية غلاف فارغ، وكثير من زواحف الذكاء الاصطناعي لا تنفذ JavaScript. ما ينبغي فعله بدلًا من ذلك: قدم المحتوى العام باستخدام SSG أو SSR أو ISR مشغلة بـwebhook.
افتراض أن غير المنشور غير قابل للفهرسة
لماذا هذا خطأ؟ قد يتسرب URL معاينة مشترك ويُزحف إليه. ما ينبغي فعله بدلًا من ذلك: استخدم منظور published في الإنتاج وأرسل ترويسة X-Robots-Tag: noindex في كل استجابة معاينة.
معاملة Portable Text بوصفه HTML
لماذا هذا خطأ؟ Portable Text شجرة بنية مجردة في JSON، ولذلك لا يصبح المحتوى غير المسلسل نصًا قابلًا للزحف. ما ينبغي فعله بدلًا من ذلك: سلسله على الخادم باستخدام @portabletext/react أو @portabletext/to-html.
صيانة JSON-LD في محرر منفصل
لماذا هذا خطأ؟ تنحرف نسخة ثانية من حقائق المنتج أو المقال أو المؤسسة عن الصفحة المرئية. ما ينبغي فعله بدلًا من ذلك: اشتق JSON-LD من حقول Sanity نفسها وقت التصيير، وتحقق من المخرج المصيّر.
تحقق مما إذا كانت صفحة Sanity تقدم HTML حقيقيًا
شغّل هذا بعد تغيير طريقة التصيير أوتسلسل Portable Text أوتحميل بيانات الصفحة. فهو يفحص الاستجابة الأولية قبل أن تملأ JavaScript لدى العميل أي فجوات.
macOS وLinux — قارن الاستجابتين العادية والخاصة بـGooglebot
URL="https://example.com/article-slug"
curl -sL "$URL" -o /tmp/sanity-page.html
curl -sL -A "Googlebot" "$URL" -o /tmp/sanity-googlebot.html
grep -Ei '<title>|rel="canonical"|<h1|application/ld\+json' /tmp/sanity-page.html
diff -u /tmp/sanity-page.html /tmp/sanity-googlebot.htmlينبغي أن يعثر الأمر الأول على عنوان الصفحة الحقيقي وcanonical وH1 وJSON-LD في HTML الخام. ويستحق أي فرق مهم في المحتوى يظهره diff التحقيق؛ إذ ينبغي ألا تتلقى الزواحف والمستخدمون محتوى canonical مختلفًا.
Windows PowerShell — افحص الاستجابة الأولية
$url = "https://example.com/article-slug"
$html = (Invoke-WebRequest -Uri $url).Content
$html | Select-String -Pattern '<title>|rel="canonical"|<h1|application/ld\+json'وحدة تحكم DevTools — تحقق من تحول Portable Text إلى عناصر دلالية
[...document.querySelectorAll('main article p, main article h2, main article li')]
.map((node) => node.textContent.trim())
.filter(Boolean)
.slice(0, 20)شغّل المقتطف في لوحة Console بالمتصفح. هذا فحص لـDOM المصيّر، لذا قارنه باختبار curl: إذا ظهر المحتوى هنا وحده ولم يظهر في الاستجابة الأولية، فهو ما يزال مصيّرًا لدى العميل.
أدوات SEO في Sanity
- فحص URL في Google Search Console — شاهد كيف زُحف إلى URL واحد وكيف صُيّر. يبين HTML المصيّر ما إذا كان Portable Text قد ظهر فعلًا، وهو ضروري لاكتشاف فجوات CSR في واجهة Sanity.
- Rich Results Test — تحقق من وجود JSON-LD البرمجي في المخرج المصيّر بعد أي تغيير في التصيير أو القالب.
- Screaming Frog SEO Spider — ازحف مع تشغيل تصيير JavaScript وإيقافه لمقارنة HTML الخام بالمصيّر؛ وهكذا تثبت إن كان المحتوى مصيّرًا على الخادم أم العميل.
- Ahrefs Site Audit — يكشف البيانات الوصفية المفقودة وcanonical المعطلة وسلاسل إعادة التوجيه ومشكلات قابلية الفهرسة في الواجهة كلها.
- Bing Webmaster Tools — أرسل خريطة الموقع وراقب فهرسة Bing التي تغذي تصفح ChatGPT، وتابع ظهور إرساليات IndexNow.
sanity-plugin-seo— درجة SEO مباشرة داخل Studio ومعاينة meta وOG وتحكم في robots، كي يحصل المحررون على ملاحظات وقت التأليف.
اختبر معلوماتك: SEO في Sanity
خمسة أسئلة سريعة عن كيفية عمل SEO في موقع يعتمد Sanity. اختر إجابة لكل سؤال ثم تحقق منها.
موارد تستحق وقتك
كتاباتي ذات الصلة
- مشكلات JavaScript SEO وأفضل ممارساته — مرجعي الأساسي لطرق التصيير التي تحدد كل شيء في واجهة Sanity.
- دليل المبتدئين إلى SEO التقني — موضع التصيير والزحف ضمن الصورة الأشمل.
محاضراتي
- JavaScript SEO — Ungagged 2019 (SlideShare) — شرحي لكيف تفصل أنظمة إدارة المحتوى المنفصلة الواجهة عن الخلفية، وللتصيير عديم الحالة في Googlebot. تنبيه دائم: توصية التصيير الديناميكي في ذلك العرض قديمة الآن، فقد أهملته Google.
على هذا الموقع
- SEO لنظام إدارة محتوى منفصل — الدليل الشقيق؛ وSanity تطبيق محدد للقواعد المنفصلة نفسها.
- JavaScript SEO — التعمق في التصيير.
- تحديد canonical — آليات الدمج خلف وسوم canonical في الواجهة.
- البحث بالذكاء الاصطناعي — سلوك زواحف الذكاء الاصطناعي ومحركات الإجابة.
من أنحاء القطاع
- SEO باستخدام Sanity (Sanity) — دليل Sanity الرئيسي؛ ابدأ به لمعرفة السلوك الحالي للمنصة.
- دورة تحسين SEO (Sanity Learn) — دورة Next.js التطبيقية التي تغطي كائن SEO والخرائط الديناميكية وJSON-LD.
- Sanity SEO (Webstacks، Devon Wood) — دليل وكالة يوضح أن الواجهة تتولى مخرجات SEO.
- أفضل ممارسات AEO وSEO في Sanity (Roboto Studio، Jono Alford) — زاوية AEO وقاعدة اشتقاق JSON-LD من الحقول القائمة.
- أفضل ممارسات SEO لنظام Sanity CMS (Yanatiev) — إطار «البنية لا المكونات».
- دليل ميداني لتقديم المحتوى إلى الوكلاء (Knut Melvær، Sanity) — التفاوض على المحتوى والحجة ضد llms.txt للمواقع الكبيرة.
- SEO لنظام إدارة محتوى منفصل (Ahrefs، Despina Gavoyannis) — الدليل الأوسع الذي تقع Sanity ضمنه.
- turbo-start-sanity (Roboto Studio، GitHub) — مشروع بداية مفتوح المصدر لـSEO في Sanity مع تطبيقات فعلية لـ
query.tsوseo-fields.tsوseo.ts.
سجل التغييرات
تم التحديث في 13 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 13 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 19 يوليو 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.