سلام! نگین هستم. بیا یه لحظه روراست باشیم. دنیای سئو پر از اصطلاحات ترسناکه، نه؟ یکیش همینه: «اسکیما» یا همون «دادههای ساختاریافته». خیلی از ما تا اسمش رو میشنویم، سریع میریم سراغ یه پلاگین که کار رو برامون انجام بده. منم دقیقاً همین کار رو میکردم!
اما یه روز فهمیدم که پلاگینها دارن داستان سایت من رو ناقص برای گوگل تعریف میکنن. اینجاست که جادوی پیادهسازی دادههای ساختاریافته (Structured Data) به صورت دستی شروع میشه. میدونم، شاید کلمه «دستی» و «کد» یکم آدم رو بترسونه، ولی قول میدم تو این راهنمای جامع، با یه لحن خودمونی، بهت نشون بدم که این کار چقدر میتونه ساده و قدرتمند باشه.
قراره با هم یاد بگیریم چطور کنترل کامل ماشین رو دستمون بگیریم و به گوگل دقیقاً بگیم هر تیکه از پازل سایتمون چیه. آمادهای؟
جدول کاربردی: اسکیما دستی (JSON-LD) در مقابل پلاگینها
قبل از اینکه آستینها رو بالا بزنیم و بریم سراغ کد، بذار تو یه جدول ساده بهت بگم که چرا اصلاً داریم این راه «سختتر» اما «حرفهایتر» رو انتخاب میکنیم:
| ویژگی | ✅ پیادهسازی دستی (JSON-LD) | ⚙️ استفاده از پلاگین (مثل Yoast/RankMath) |
| کنترل و سفارشیسازی | کامل (۱۰۰٪). تو کارگردانی! هر نوع اسکیمایی رو میتونی ترکیب کنی. | محدود. فقط گزینههایی که پلاگین بهت میده. برای کارای خاص کلاً مناسب نیست. |
| سرعت و سبکی | عالی! فقط چند خط متن تمیز. هیچ فشاری به سایت نمیاره (Bloat-free). | متوسط تا ضعیف. کلی فایل JS/CSS اضافه با خودش میاره که سایت رو سنگین میکنه. |
| پیچیدگی پیادهسازی | متوسط. باید یکم JSON بلد باشی (که تو این مقاله یاد میگیریم). | آسان. فقط چندتا کلیک و پر کردن فیلد. |
| ریسک تداخل و خطا | کم. کدش تمیز و مستقله. خودت میدونی چی نوشتی. | متوسط. ممکنه با قالب یا پلاگینهای دیگه تداخل کنه یا اسکیمای تکراری ایجاد کنه. |
| بهترین کاربرد | سایتهای تخصصی، فروشگاههای بزرگ، صفحات خاص و هرجایی که دقت مهمه. | سایتهای ساده، وبلاگهای شخصی و زمانی که فقط یه اسکیمای Article ساده میخوای. |
چرا باید اسکیما را دستی پیادهسازی کنیم؟ (کنترل کامل در مقابل پلاگینها)
ببین، پلاگینها (مثل یواست یا رنکمث) کارشون عالیه، اما برای کارهای عمومی. یه اسکیمای Article ساده یا یه Product ساده رو هندل میکنن. اما دنیای سئو معنایی (Semantic SEO) خیلی بزرگتر از این حرفهاست.
مشکل از جایی شروع میشه که تو یه نیاز خاص داری. مثلاً:
- میخوای اسکیمای FAQ رو توی اسکیمای Product لونهسازی (Nest) کنی.
- میخوای یه اسکیمای Event خیلی سفارشی برای یه وبینار خاص بزنی.
- میخوای اسکیمای
HowToرو با اسکیمایVideoObjectترکیب کنی. - پلاگینت داره یه اسکیمای پیشفرض (مثلاً
WebPage) اضافه میکنه که تو اصلاً نمیخوای تو اون صفحه باشه!
اینجاست که پلاگینها یا کم میارن، یا انقدر تنظیمات پیچیده دارن که آخرشم همونی نمیشه که میخوای.
وقتی خودت اسکیما رو مینویسی، تو کارگردان اون صفحهای. تو به گوگل خط به خط میگی: “ببین گوگل، این اسم محصولمه، این نقدهاشه، و اینم نویسنده نقدها که این پروفایلشه”. تو دیگه اسیر گزینههای چکباکسی یه پلاگین نیستی.
مزایای JSON-LD دستی: سرعت، عدم ایجاد کد اضافه (Bloat-free) و سفارشیسازی
حالا چرا بین روشهای مختلف دستی، من عاشق JSON-LD هستم؟ (قبلاً روشهای دیگهای مثل Microdata هم بود که مستقیم تو دل کدهای HTML میرفت و همهچیو شلوغ میکرد).
دلیلش ایناست:
- 🚀 سرعت و سبکی (Bloat-free): این مورد علاقه خودمه. پلاگینها برای اینکه کار کنن، کلی فایل JS و CSS اضافه با خودشون میارن که شاید تو اصلاً بهشون نیاز نداشته باشی. این یعنی سنگین شدن سایت و کد اضافه (Bloat). اما کد JSON-LD دستی، فقط چند خط تکسته که تو یه تگ
<script>قرار میگیره. مثل پر، سبکه و هیچ فشاری به سرعت لود صفحت نمیاره. - 🎨 سفارشیسازی بینهایت: این همون قدرت کنترله. میخوای دو نوع اسکیما رو با هم ترکیب کنی؟ راحت. میخوای یه ویژگی (Property) خیلی خاص که تو پلاگین نیست رو اضافه کنی؟ مشکلی نیست. آسمون، مرز توئه.
- 🐛 عیبیابی (Debug) راحتتر: وقتی خودت کد رو نوشتی، دقیقاً میدونی اگه مشکلی پیش بیاد (مثلاً تو ابزار Rich Results Test گوگل) باید کجای کد رو بگردی. ولی دیباگ کردن کدی که یه پلاگین تولید کرده… خب، مثل پیدا کردن سوزن تو انبار کاهه!
پیشنیازها: دسترسی به سورس کد (HTML/Template) و درک پایه JSON
خب، برای این جراحی دقیق، به دوتا چیز احتیاج داریم:
۱. دسترسی به سورس کد: تو باید بتونی یه تیکه کد رو به سایتت اضافه کنی. حالا چه مستقیم تو فایلهای قالب (Template) باشه (اگه وردپرسی هستی مثلاً تو header.php)، چه از طریق ابزارهایی مثل گوگل تگ منیجر (GTM)، یا اگه سیستمت اختصاصیه، دسترسی به <head> اون صفحه.
۲. درک پایه JSON: اصلاً نترس! JSON (مخفف JavaScript Object Notation) فقط یه راه برای دستهبندی اطلاعاته. مثل یه لیست خرید با دستهبندی. مثلاً:
{
"میوه": "سیب",
"لبنیات": "شیر",
"تعداد": 2
}
ساختارش همینه: "کلید": "مقدار". همین که بدونی چطور آکولاد {} باز و بسته کنی و بین کلید و مقدار دو نقطه : بذاری، نصف راه رو رفتی. بقیهاش رو از خود داکیومنتهای Schema.org کپی میکنی و جای خالیها رو پر میکنی.
محل قرارگیری اسکریپتها: بهترین روش برای تزریق در <head>
اینم سوال طلایی! بهترین، تمیزترین و استانداردترین جا برای گذاشتن اسکریپت JSON-LD، داخل تگ <head> صفحهاته.
چرا <head>؟
چون رباتهای گوگل (و بقیه موتورهای جستجو) اول اونجا رو میخونن. قبل از اینکه اصلاً به بدنه اصلی سایتت (Body) برسن، تو همون اول کار، خیلی شیک و مجلسی، کل اطلاعات ساختاریافته رو بهشون میدی.
این کار باعث میشه رباتها بلافاصله بفهمن موضوع صفحه چیه و مجبور نباشن کل صفحه رو بگردن تا کدهای اسکیمای تو رو پیدا کنن.
(البته میشه تو <body> هم گذاشت، ولی <head> روش استاندارد و ترجیح داده شده است و خیالت رو راحت میکنه.)
بخش اول: پیادهسازی گام به گام اسکیمای BreadcrumbList (مسیر راهنما)
این اسکیما یکی از سادهترین و در عین حال تأثیرگذارترین اسکیماهاییه که میتونی پیاده کنی. واقعاً حیفه که ازش استفاده نکنی.
اسکیمای BreadcrumbList چیست و چه تأثیری بر سئو و UX دارد؟
خیلی ساده: BreadcrumbList یه تیکه کده (از نوع JSON-LD) که تو به گوگل میدی تا ساختار سلسلهمراتبی سایتت رو بهش نشون بدی. به گوگل میگی که این صفحه، زیرمجموعه کدوم بخشهاست.
- از نظر تجربه کاربری (UX): به کاربر کمک میکنه بفهمه کجاست. کاربر با یه نگاه میفهمه که مثلاً:
خانه > وبلاگ > سئو > این مقاله. این حس کنترل و آگاهی به کاربر میده و احتمال اینکه گیج بشه و سایت رو ببنده (Bounce Rate) خیلی کم میکنه. - از نظر سئو (SEO): گوگل عاشق اینه! اولاً، به درک بهتر رباتهای گوگل از ساختار سایتت کمک میکنه. دوماً (و مهمتر از همه)، گوگل اغلب این مسیر رو به جای اون URL طولانی و زشت، مستقیم تو نتایج جستجو (SERP) نشون میده.
کدومش جذابتره؟
https://yoursite.com/blog/cat/seo-stuff/post-123
یا
YourSite > وبلاگ > سئو > عنوان مقاله
معلومه که دومی! این کار هم حرفهایتره و هم نرخ کلیک (CTR) تو رو به شدت بالا میبره.
تشریح ساختار اصلی: BreadcrumbList و موجودیت تودرتوی ListItem
ساختارش مثل یه «لیست» ساده است. فکر کن یه برگه کاغذ داری:
- BreadcrumbList: این خود برگه کاغذه. کانتینر یا ظرف اصلی که به گوگل میگه: «چیزی که میخونی یه لیست مسیر راهنماس.»
- ListItem: اینا ردیفهای توی لیستت هستن. هر پلهای که تو مسیر وجود داره (مثل: خانه، وبلاگ، سئو…) میشه یه
ListItem.
این ListItemها به صورت «تودرتو» (Nested) داخل BreadcrumbList قرار میگیرن. یعنی گوگل میفهمه که این آیتمها، همگی جزئی از اون لیست اصلی هستن.
(کد نمونه) ساختار کامل JSON-LD برای BreadcrumbList
بیا فرض کنیم کاربر تو صفحهی «آموزش سئو» داخل دستهبندی «وبلاگ» ماست. کد اسکیمای ما این شکلی میشه:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "خانه",
"item": "https://vazirseo.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "وبلاگ",
"item": "https://vazirseo.com/blog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "آموزش سئو",
"item": "https://vazirseo.com/blog/seo-tutorial/"
}
]
}
</script>
این کد تمیز رو کجای صفحه میذاریم؟ همونطور که قبلاً گفتیم، بهترین جا داخل تگ <head> صفحه است.
تحلیل تخصصی اجزا: position، name و item (URL)
بیا کد بالا رو با هم کالبدشکافی کنیم:
@context: این خط رو همیشه بذار. به گوگل میگه که ما داریم از دیکشنری schema.org استفاده میکنیم.@type: "BreadcrumbList": اینجا به گوگل میگیم که این یه لیست «مسیر راهنما» است.itemListElement: این یه آرایه (لیست) هست که تمام «پلهها»ی ما رو نگه میداره.- حالا داخل هر
ListItem(هر پله):@type: "ListItem": نوع این پله رو مشخص میکنه.position: این خیلی مهمه. این «شماره پله» است. به گوگل ترتیب رو نشون میده (پله ۱، پله ۲، …).name: این همون متنیه که کاربر میبینه (مثلاً: “خانه” یا “وبلاگ”).item: این همون لینکه (URL). آدرسی که اگه کاربر روی “وبلاگ” کلیک کرد، باید به اونجا بره.
(تجربه عملی) اشتباه رایج: شروع position از ۰ به جای ۱
بذار یه تجربه شخصی رو بهت بگم. اوایل که داشتم اسکیما رو دستی میزدم، چون تو خیلی از زبانهای برنامهنویسی شمارش از «صفر» شروع میشه، منم position رو از 0 شروع کردم. یعنی: position: 0 برای “خانه”، position: 1 برای “وبلاگ” و…
بعدش هرچی کد رو تو ابزار Rich Results Test گوگل تست میکردم، ارور میگرفتم!
یادت باشه: تو اسکیمای BreadcrumbList، شمارش position همیشه و مطلقاً از ۱ شروع میشه. گوگل 0 رو به عنوان یه آیتم معتبر نمیشناسه. این یه اشتباه خیلی رایجه که میتونه کل اسکیمای تو رو بیاعتبار کنه، ولی خوشبختانه حل کردنش فقط عوض کردن یه عدده!
نکته حیاتی: عدم لینکدهی آخرین آیتم (صفحه فعلی) در اسکیما
اینم یه نکته طلاییه که خیلیها رعایت نمیکنن.
ببین، آخرین آیتم تو لیست بردکرامب، همون صفحهایه که کاربر الان توشه (مثلاً صفحه “آموزش سئو” تو مثال ما).
از نظر منطق کاربری (UX)، هیچوقت نباید صفحهای رو به خودش لینک بدی. کاربر روی “آموزش سئو” کلیک کنه که چی بشه؟ همون صفحه رفرش بشه؟ این گیجکننده است.
برای همین، تو اسکیما، برای آخرین ListItem (یعنی صفحه فعلی)، باید ویژگی item (همون URL) رو حذف کنی.
کد ما برای آخرین آیتم این شکلی میشه:
{
"@type": "ListItem",
"position": 3,
"name": "آموزش سئو"
// دقت کن! اینجا دیگه "item" یا همون URL رو نذاشتیم
}
اینجوری تو به گوگل میگی: «این پله آخره، کاربر همینجاست، نیازی به لینک نداره.» این کار هم حرفهایه و هم جلوی ارورهای احتمالی تو سرچ کنسول رو میگیره.
بخش دوم: پیادهسازی گام به گام اسکیمای FAQPage (صفحه پرسش و پاسخ)
این اسکیما شاید بزرگترین تأثیر مستقیم رو روی نرخ کلیک (CTR) شما داشته باشه. اگه یه صفحه داری که توش به چندتا سؤال پرتکرار جواب دادی (مثلاً صفحه محصول، صفحه سرویس، یا یه مقاله آموزشی)، باید از این اسکیما استفاده کنی.
اسکیمای FAQPage چیست و چگونه باعث افزایش CTR میشود؟
اسکیمای FAQPage یه کد JSON-LD هست که به گوگل لیست سؤال و جوابهای موجود تو اون صفحه رو «اعلام» میکنه.
حالا جادوش کجاست؟ اگه گوگل تشخیص بده که این سؤال و جوابها واقعاً مفید و مرتبطن، اونها رو مستقیم زیر لینک تو، تو صفحه نتایج جستجو (SERP)، به شکل یه آکاردئون بازشو نشون میده.
این یعنی چی؟
۱. فضای بیشتری اشغال میکنی: نتیجه تو تو گوگل ناگهان دو سه برابر بزرگتر و پرجلوهتر میشه. چشم کاربر رو میدزدی!
۲. جواب فوری میدی: کاربر شاید اصلاً دنبال خوندن کل مقاله تو نباشه. فقط یه سؤال داره. تو همونجا بهش جواب میدی و اعتمادش رو جلب میکنی.
۳. CTR (نرخ کلیک) منفجر میشه: وقتی نتیجه تو هم بزرگتره و هم مستقیماً داره به کاربر کمک میکنه، شانس اینکه روی لینک تو کلیک کنه تا اطلاعات بیشتری به دست بیاره، به شدت بالا میره.
قانون طلایی گوگل (اصل اعتماد): متن سؤال و جواب باید دقیقاً در صفحه قابل مشاهده باشد
اینجا جاییه که خیلیا اشتباه میکنن و منم اوایل خیلی روش حساس بودم. این یه «قرارداد اعتمادی» بین تو و گوگله.
قانون ساده است: هرچیزی که تو کد اسکیما مینویسی (هم متن سؤال و هم متن کامل جواب)، باید دقیقاً و کلمه به کلمه تو خود صفحه برای کاربر قابل مشاهده باشه.
گوگل نمیخواد به کاربراش دروغ بگه. نمیتونی تو اسکیما یه جواب بنویسی و تو صفحه یه جواب دیگه، یا اصلاً جواب رو مخفی کنی.
- تجربه من: دیدم سایتهایی رو که سعی کردن زرنگی کنن. مثلاً سؤال و جوابها رو تو یه آکاردئون گذاشتن که به طور پیشفرض بسته است (این اوکیه)، اما محتوای جوابها رو با جاوااسکریپت لود میکردن و تو سورس HTML اولیه نبوده. نتیجه؟ گوگل نمیتونست متن رو ببینه، اسکیما رو نادیده میگرفت و در موارد بدتر، سایت رو به خاطر «محتوای فریبنده» جریمه دستی (Manual Action) میکرد.
پس لطفاً صادق باش. هرچی تو کده، باید تو صفحه هم باشه.
(کد نمونه) ساختار کامل JSON-LD برای FAQPage
بیا فرض کنیم یه صفحه درباره «خرید قهوه» داریم و به دوتا سؤال جواب دادیم. کد ما این شکلی میشه و مثل همیشه، جاش توی تگ <head> صفحه است:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "بهترین نوع قهوه برای شروع روز کدام است؟",
"acceptedAnswer": {
"@type": "Answer",
"text": "برای شروع روز، معمولاً قهوههایی با کافئین بالا و طعم قوی مثل روبوستا یا ترکیبی از عربیکا و روبوستا پیشنهاد میشه. این به سطح انرژی مورد نیاز شما بستگی داره."
}
},
{
"@type": "Question",
"name": "آیا قهوه برای سلامتی ضرر دارد؟",
"acceptedAnswer": {
"@type": "Answer",
"text": "مصرف متعادل قهوه (حدود ۳ تا ۴ فنجان در روز) برای اکثر افراد نه تنها ضرر نداره، بلکه میتونه فوایدی مثل افزایش هوشیاری و آنتیاکسیدان هم داشته باشه. اما مصرف زیادش توصیه نمیشه."
}
}
]
}
</script>
تشریح ساختار اصلی: mainEntity و آرایهای از موجودیتهای Question و Answer
بیا این کد رو بشکافیم:
@type: "FAQPage": این به گوگل میگه کل این بسته، یه صفحه پرسش و پاسخه.mainEntity: این کلمه کلیدیه. به معنی «موجودیتهای اصلی» این صفحه. این یه «آرایه» (Array) است (با علامت[]نشون داده میشه)، یعنی یه لیست که قراره سؤال و جوابهای ما رو نگه داره.- داخل
mainEntity، ما یه سری «موجودیت» یا آبجکت (با{}) داریم. هرکدوم از اینها یه جفت سؤال و جواب هستن.
تحلیل تخصصی اجزا: @type: “Question” و @type: “Answer”
اینجا ساختار تودرتو رو میبینیم:
۱. @type: “Question”: تو به گوگل میگی: «این موجودیت، یه ‘سؤال’ هست.»
* name: این فیلد، متن کامل سؤال رو نگه میداره (مثلاً: “آیا قهوه ضرر دارد؟”).
۲. acceptedAnswer: هر سؤالی، یه «جواب پذیرفتهشده» داره. اینم یه موجودیت جدیده که داخل موجودیت Question قرار میگیره.
* @type: “Answer”: به گوگل میگی: «این موجودیت، یه ‘جواب’ هست.»
* text: و در نهایت، این فیلد، متن کامل جواب رو نگه میداره.
پس ساختار منطقیش اینه:
FAQPage شامل mainEntity (یه لیست) است.
این لیست شامل Questionها است.
هر Question شامل یه acceptedAnswer است.
هر Answer شامل text (متن جواب) است.
(تجربه عملی) اشتباه رایج: استفاده از HTML در فیلد text جواب (چگونه آن را پیادهسازی کنیم؟)
این دقیقاً جاییه که منم اولین بار گیر افتادم!
داشتم یه جواب مینوشتم و میخواستم وسط جواب، یه لینک به یه مقاله دیگه بدم و یه کلمه رو هم بولد کنم. خیلی عادی اومدم و کد HTML رو مستقیم تو فیلد text گذاشتم. مثلاً:
"text": "برای اطلاعات بیشتر، مقاله <a href="/seo-guide">راهنمای سئو</a> را بخوانید."
و… بوم! 💥 کل اسکیمای من شکست. ابزار گوگل ارور JSON نامعتبر داد.
مشکل کجاست؟
مشکل خود HTML نیست! گوگل اتفاقاً از HTML پایه (مثل <a>, <strong>, <ul>, <p>) تو فیلد text پشتیبانی میکنه. مشکل از کاراکتر ” (نقل قول یا Double Quote) بود.
وقتی تو مینویسی "text": "..."، اون دوتا " اول و آخر به JSON میگن که «رشته متنی شروع شد و اینجا تموم شد». حالا وقتی من وسط متنم دوباره از " برای href="..." استفاده کردم، JSON گیج شد! فکر کرد متن من همونجا تموم شده و بقیهاش کد اضافیه.
راه حل چیه؟ (چطور پیادهسازیش کنیم؟)
تو باید کاراکترهای خاص رو «اِسکِیپ» (Escape) کنی. یعنی به JSON بگی که «هی، این " بخشی از متن منه، مال خودت نیست!». این کار رو با گذاشتن یه بکاسلش (\) قبلش انجام میدی:
شکل درست:
"text": "برای اطلاعات بیشتر، مقاله <a href=\"/seo-guide\">راهنمای سئو</a> را بخوانید. این کلمه <strong>مهم</strong> است."
دقت کردی؟ href="/seo-guide" تبدیل شد به href=\"/seo-guide\".
- نکته دوستانه من: راستش رو بخوای، سر و کله زدن با این بکاسلشها، مخصوصاً اگه متن جوابت طولانی و پر از HTML باشه، خیلی رو اعصابه و راحت اشتباه میکنی.
- راه حل حرفهای (کاری که خودم میکنم): متن جوابم رو با HTML کامل و تمیز تو یه ویرایشگر متن مینویسم. بعدش میرم تو یه ابزار آنلاین رایگان (سرچ کن “JSON String Escape Tool”) و متنم رو اونجا پیست میکنم. اون ابزار در یک ثانیه، یه نسخه «آماده برای JSON» با تمام بکاسلشهای لازم بهم میده. همونو کپی میکنم تو کد اسکیمام. خلاص! تمیز، سریع و بدون خطا.
خب، تبریک میگم! تو الان کدهای اسکیمای Breadcrumb و FAQ رو آماده کردی. حس خوبیه، نه؟ مثل اینه که یه پازل سخت رو تموم کردی. اما… (و این یه «اما»ی بزرگه) از کجا بفهمیم این پازل رو درست چیدیم؟ از کجا بدونیم گوگل اصلاً میتونه این کد رو بخونه و خوشش میاد؟
اینجا مرحله مورد علاقه منه: «لحظه حقیقت» یا همون اعتبارسنجی (Validation). اگه کدنویسی رو به آشپزی تشبیه کنیم، این مرحله اونجاییه که غذامون رو میچشیم تا مطمئن شیم نمکش کم یا زیاد نباشه. بیا با هم ابزارهای تست گوگل رو چک کنیم و ببینیم چطور باید باهاشون کار کرد.
بخش نهایی: اعتبارسنجی و عیبیابی اسکیمای دستی
نوشتن کد یه بخشه، مطمئن شدن از درست کار کردنش یه بخش دیگه. خوشبختانه، گوگل ابزارهای عالی و رایگانی برای این کار به ما داده.
ابزار شماره یک: استفاده از Google’s Rich Results Test برای اعتبارسنجی
این ابزار، بهترین دوست توئه. رفیق فابریکته. چرا؟ چون این ابزار دقیقاً به تو میگه که گوگل (نه هیچکس دیگه) کد تو رو چطور میبینه و آیا اصلاً قراره ازش استفاده کنه یا نه.
چطور استفاده کنیم؟
خیلی ساده است. تو دو تا گزینه داری:
۱. Fetch URL: آدرس صفحهای که کد رو توش گذاشتی بهش میدی.
۲. Code: همون تیکه کد JSON-LD خودت رو (با تگ <script>) مستقیم توش کپی میکنی. (من معمولاً قبل از اینکه کد رو اصلاً تو سایت بذارم، اول با این گزینه تستش میکنم).
دنبال چی باید بگردیم؟
این ابزار به تو دو تا چیز حیاتی رو میگه:
- Valid (معتبر): آیا کد تو از نظر فنی درسته؟
- Eligible (واجد شرایط): آیا این کد معتبر، واجد شرایط نمایش در نتایج غنی (مثل همون ستارهها، سؤالات FAQ، یا مسیر بردکرامb) هست یا نه؟
اگه تیک سبز ✅ و جمله “Page is eligible for rich results” رو دیدی، یعنی کارت رو بینقص انجام دادی. برو یه قهوه برای خودت بریز! ابزار دقیقاً بهت نشون میده که مثلاً ۱ اسکیمای BreadcrumbList و ۱ اسکیمای FAQPage معتبر پیدا کرده.
ابزار شماره دو: استفاده از Schema Markup Validator (برای خطاهای نحوی)
این ابزار قبلاً مال خود گوگل بود (به اسم Structured Data Testing Tool) ولی الان خود کنسرسیوم Schema.org مدیریتش میکنه.
تفاوتش با ابزار قبلی چیه؟
راستش رو بخوای، برای کار ما (که هدفمون گرفتن Rich Results هست)، همون ابزار اولی (Rich Results Test) کاملتر و مهمتره.
- ابزار Rich Results Test تمرکزش روی اینه که «آیا گوگل اینو تو نتایج نشون میده؟»
- ابزار Schema Markup Validator تمرکزش روی اینه که «آیا کد تو، طبق کل دیکشنری عظیم Schema.org، از نظر نحوی (Syntax) درسته یا نه؟»
این ابزار دوم، بیشتر به درد وقتی میخوره که داری اسکیمای خیلی پیچیده یا اسکیمایی مینویسی که اصلاً ریچ ریزالت نداره (مثل اسکیمای Organization یا Person).
توصیه دوستانه من: اول همیشه با Rich Results Test چک کن. اگه اونجا تیک سبز گرفتی، ۹۹٪ مواقع کارت تمومه.
نحوه خواندن و رفع خطاهای رایج (مثال: Missing comma یا Missing })
خب، رسیدی به بخشی که همه ما (حتی من!) بارها توش گیر میکنیم. ابزار تست رو میزنی و یه صفحه قرمز پر از ارور میبینی. نترس! ۹۹ درصد این ارورها، غلط املاییهای کدنویسیان، نه مشکل منطقی.
JSON-LD به شدت به علائم نگارشی حساسه. مثل یه معلم دیکته سختگیر!
- خطای رایج #۱: کامای جا افتاده یا اضافه (
Missing comma or trailing comma):- قانون: تو JSON، هر وقت دو تا «آیتم» رو در یک سطح پشت سر هم میاری (چه دو تا فیلد مثل
"position": 1و"name": "خانه"، چه دو تاListItemتو بردکرامب)، باید با کاما (,) از هم جدا بشن. - اشتباه رایج: گذاشتن کاما (
,) بعد از آخرین آیتم در یک لیست. - مثال اشتباه:
JSON
{ "@type": "ListItem", "position": 1, "name": "خانه", // <-- این کامای اضافه باعث ارور میشه } - مثال درست:
JSON
[ { "@type": "ListItem", "position": 1, "name": "خانه" // <-- این آخریه، نباید کاما داشته باشه }, // <-- این کاما لازمه، چون یه آیتم دیگه بعدش میاد { "@type": "ListItem", "position": 2, "name": "وبلاگ" // <-- اینم آخریه، کاما نمیخواد } ]
- قانون: تو JSON، هر وقت دو تا «آیتم» رو در یک سطح پشت سر هم میاری (چه دو تا فیلد مثل
- خطای رایج #۲: آکولاد یا کروشه جا افتاده (
Missing } or ]):- یادته گفتم JSON مثل جعبههای تودرتوئه؟ هر جعبهای (آکولاد
{یا کروشه[) که باز میکنی، باید دقیقاً همونجا که باید، ببندیش. - تجربه من: معمولاً آدم آکولاد (
}) یا کروشه (]) آخر رو یادش میره. ابزارهای تست دقیقاً بهت میگن ‘Unexpected character’ یا ‘Missing }’. فقط کافیه با دقت جعبهها رو چک کنی و مطمئن شی هر درِ بازی، یه درِ بسته هم داره.
- یادته گفتم JSON مثل جعبههای تودرتوئه؟ هر جعبهای (آکولاد
چگونه هر دو اسکیما (Breadcrumb و FAQ) را در یک صفحه قرار دهیم؟ (آیا در یک تگ <script> باشند؟)
اینم یه سوال فوقالعاده مهم و فنی. خب، من هم اسکیمای بردکرامب رو دارم و هم FAQ. چطور هردوش رو به گوگل بدم؟
تو دو تا راه داری که هردوش کاملاً درسته، ولی یکیش یه کم تمیزتره.
راه اول: دو تگ اسکریپت جدا (روش رایج و ساده)
میتونی خیلی راحت، دو تا تگ <script> جدا تو <head> بذاری. یکی کامل برای BreadcrumbList و یکی کامل برای FAQPage.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
// ... بقیه کد بردکرامب ...
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
// ... بقیه کد FAQ ...
}
</script>
این روش عالی کار میکنه. گوگل هردوش رو میخونه، میفهمه و ادغام میکنه.
راه دوم: ادغام در یک تگ (روش حرفهایتر و تمیزتر)
اگه مثل من یکم وسواس تمیزی کد داشته باشی، میتونی هردوش رو تو یک تگ <script> بذاری. چطوری؟ با استفاده از یه «آرایه» (Array یا همون لیست) در سطح بالا.
تو میتونی به جای اینکه کد رو با { شروع کنی، با [ (علامت کروشه) شروع کنی و هردو اسکیمات رو به عنوان دو تا آیتم تو این لیست بذاری.
کد نمونه (روش ادغامی):
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
// ... آیتمهای بردکرامب ...
]
},
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
// ... آیتمهای سوال و جواب ...
]
}
]
</script>
دقت کن که چطور بین دو آکولاد بسته (}) و باز ({) یه کاما (,) گذاشتم، چون اینا دو تا آیتم داخل یه آرایه ([]) هستن.
کدومش بهتره؟
راستش رو بخوای، از نظر گوگل هیچ فرقی ندارن. هر دو رو یکسان میخونه. اما روش دوم (ادغامی) یه کم بهینهتره، چون فقط یه تگ اسکریپت به صفحه اضافه میکنه و مدیریت کردنش در آینده شاید راحتتر باشه. من خودم اگه بتونم، سعی میکنم از روش دوم استفاده کنم چون حس میکنم سازمانیافتهتره.
جمعبندی نهایی
خب، اینم از این! ما با هم تو این چند بخش یاد گرفتیم که چرا کنترل دستی اسکیما مهمه، چطور بردکرامب و FAQ رو (که دوتا از پرکاربردترینها هستن) مو به مو پیاده کنیم، و در نهایت چطور کدمون رو تست کنیم که ازش مطمئن باشیم.
رفتن سراغ کد دستی شاید اولش یه قدم سخت به نظر بیاد، ولی این همون قدمیه که تو رو از یه «محتوانویس» به یه «استراتژیست محتوای فنی» تبدیل میکنه. تو الان فقط نمینویسی؛ تو داری برای رباتهای گوگل هم داستان تعریف میکنی و راهنماییشون میکنی.
حالا تو بهم بگو، بعد از این گپوگفت، بزرگترین ترسی که از کدنویسی دستی اسکیما داشتی و الان برات راحتتر شده، چیه؟ یا چه اسکیمای دیگهای هست که دوست داری با هم بریم سراغش (مثل اسکیما Product یا Article)؟ برام بنویس.