پرش به محتوای اصلی
وب، سئو و فرانت‌اند
۵ دقیقه مطالعه

سئوی فنی فروشگاه اینترنتی با Next.js: وقتی مشکل کد نیست، بودجه خزش است

چک‌لیست عملی سئوی فنی برای فروشگاه اینترنتی Next.js: HTML کامل از سرور، داده ساختاریافته محصول با واحد پول درست، سایت‌مپ تمیز، کنترل URLهای فیلتر و بودجه خزش، سرعت و گزارش‌های Search Console.

برنامه‌نویس فول‌استک

در فروشگاه‌های اینترنتی، بیشتر مشکلات ایندکس نشدن صفحات از کد خراب نیست؛ از این است که گوگل وقت و منابع محدودی برای خزیدن سایت شما دارد و آن را صرف URLهای بی‌ارزش می‌کند، یا صفحه‌ای که می‌بیند با چیزی که کاربر می‌بیند فرق دارد. این یادداشت چک‌لیستی است که در عمل، روی فروشگاه عینک‌سازی که با Next.js ساخته‌ام، جواب داده است. به ترتیب اهمیت نوشته شده: اگر وقت کم دارید، از بالا شروع کنید.

۱. متن اصلی باید در HTML اولیه باشد

ربات گوگل جاوااسکریپت را اجرا می‌کند، اما با تأخیر و در صف جداگانه. اگر عنوان، قیمت، موجودی و توضیح محصول فقط بعد از اجرای جاوااسکریپت ساخته شوند، ایندکس شدن صفحه عقب می‌افتد و گاهی نسخه ناقص صفحه ایندکس می‌شود. بقیه موتورهای جستجو و ربات‌های هوش مصنوعی هم در اجرای جاوااسکریپت ضعیف‌ترند.

در Next.js یعنی صفحات محصول و دسته‌بندی باید Server Component یا تولید ایستا باشند و هر داده‌ای که برای سئو مهم است، در سرور گرفته شود. یک تست ساده و قطعی: صفحه را با curl بگیرید و دنبال نام و قیمت محصول بگردید. اگر نبود، گوگل هم در اولین برخورد آن را نمی‌بیند.

bash
# نام محصول در HTML خام هست؟
curl -s https://example.com/product/sample-frame | grep -c "نام محصول"

# با User-Agent گوگل هم همان پاسخ را می‌گیرید؟
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
  -o /dev/null -w "%{http_code} %{size_download}\n" https://example.com/product/sample-frame

نکات کلیدی

  • عنوان، قیمت، موجودی و توضیح در HTML اولیه.
  • لینک‌های داخلی با تگ a و href واقعی، نه فقط onClick.
  • داده‌ای که هم در HTML و هم در JSON کلاینت تکرار می‌شود را کم کنید؛ حجم صفحه روی سرعت خزش اثر دارد.

۲. یک URL برای هر محتوا: canonical و ریدایرکت‌ها

گوگل هر آدرس متفاوت را صفحه جدا می‌بیند. نسخه با www و بدون www، با اسلش آخر و بدون آن، با پارامتر مرتب‌سازی و بدون آن، همه می‌توانند یک محتوا را چند بار به گوگل نشان دهند. نتیجه، تقسیم شدن اعتبار صفحه و هدر رفتن بودجه خزش است.

راه‌حل دو بخش دارد: ریدایرکت ۳۰۱ برای نسخه‌هایی که نباید وجود داشته باشند (www به بدون www، بدون اسلش به با اسلش، http به https) و تگ canonical روی همه صفحات برای مواردی که آدرس باید بماند (مثل پارامترهای مرتب‌سازی). canonical باید به نسخه نهایی و قابل ایندکس اشاره کند، نه به صفحه‌ای که خودش ریدایرکت یا noindex است.

۳. داده ساختاریافته محصول، دقیق و هم‌خوان با صفحه

Schema.org از نوع Product به همراه Offer به گوگل می‌گوید قیمت، واحد پول، موجودی و برند چیست. این داده باید دقیقاً با چیزی که کاربر روی صفحه می‌بیند یکی باشد؛ اختلاف قیمت بین JSON-LD و صفحه از دلایل رایج هشدار در Search Console است.

یک نکته مخصوص فروشگاه‌های ایرانی: واحد پول در Schema باید کد ISO باشد و کد ISO پول ایران IRR یعنی ریال است. اگر قیمت روی سایت به تومان نوشته شده، در JSON-LD یا باید ضرب در ده شود و با IRR ثبت شود، یا قیمت با واحد اشتباه به گوگل می‌رسد. این خطا را در فروشگاه‌های زیادی دیده‌ام.

typescript
// قیمت سایت به تومان است؛ Schema ریال (IRR) می‌خواهد.
export function productJsonLd(p: Product, url: string) {
  return {
    '@context': 'https://schema.org',
    '@type': 'Product',
    name: p.name,
    image: p.images.map((i) => i.url),
    sku: p.sku,
    brand: { '@type': 'Brand', name: p.brand },
    offers: {
      '@type': 'Offer',
      url,
      priceCurrency: 'IRR',
      price: String(BigInt(p.priceToman) * 10n),
      availability: p.stock > 0 ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock',
      itemCondition: 'https://schema.org/NewCondition',
    },
  };
}

۴. بودجه خزش: URLهای بی‌ارزش را ببندید

هر ترکیب فیلتر (رنگ × برند × سایز × مرتب‌سازی) یک URL جدید می‌سازد. فروشگاهی با چند صد محصول می‌تواند ده‌ها هزار URL فیلتر داشته باشد و گوگل ممکن است وقتش را صرف آن‌ها کند و هیچ‌وقت به صفحه محصول تازه نرسد. راه‌حل کم کردن URLهای قابل خزش است، نه اضافه کردن صفحه جدید.

نکات کلیدی

  • صفحات فیلتر چندگانه را noindex کنید یا canonical را به دسته اصلی بدهید.
  • لینک‌های فیلتر را برای ربات‌ها قابل دنبال کردن نگذارید مگر فیلترهایی که واقعاً صفحه مستقل می‌خواهند.
  • برای برندها و دسته‌های مهم صفحه واقعی با محتوای اختصاصی بسازید، نه پارامتر ?brand=.
  • سایت‌مپ فقط شامل URLهای canonical، قابل ایندکس و با پاسخ ۲۰۰ باشد.

۵. لینک‌سازی داخلی و صفحات یتیم

گوگل صفحات را بیشتر از طریق لینک پیدا می‌کند تا سایت‌مپ. محصولی که فقط از صفحه سوم یک دسته و از سایت‌مپ لینک دارد، برای گوگل کم‌اهمیت به نظر می‌رسد. صفحات مهم (دسته‌های اصلی، برندها، محصولات پرفروش) باید از صفحه اصلی و منو در کمترین تعداد کلیک قابل دسترسی باشند.

در مجله یا بلاگ فروشگاه هم از داخل متن به محصول و دسته مرتبط لینک بدهید. لینک داخل متن با عبارت توصیفی، برای گوگل سیگنال قوی‌تری از یک بلوک «محصولات مرتبط» در پایین صفحه است.

۶. سرعت: تصاویر، فونت و جاوااسکریپت

برای فروشگاه، سنگین‌ترین بخش صفحه معمولاً تصاویر هستند. فرمت‌های WebP و AVIF، اندازه درست برای هر عرض صفحه و مشخص بودن width و height برای جلوگیری از جابه‌جایی صفحه، بیشترین اثر را دارند؛ جزئیاتش در پردازش دسته‌ای تصاویر آمده است.

فونت فارسی را خودتان میزبانی کنید و فقط یک فایل متغیر (variable) بارگذاری کنید. و جاوااسکریپت سمت کاربر را محدود به بخش‌های واقعاً تعاملی کنید؛ هر کتابخانه‌ای که فقط برای یک انیمیشن اضافه شده، روی زمان تعامل صفحه در گوشی‌های معمولی اثر می‌گذارد.

۷. Search Console را هفتگی ببینید

سه گزارش در Search Console بیشترین اطلاعات را می‌دهند: گزارش صفحات (Pages) که می‌گوید کدام صفحات ایندکس نشده‌اند و چرا، گزارش آمار خزش (Crawl Stats) که نشان می‌دهد گوگل وقتش را کجا می‌گذارد، و گزارش عملکرد که نشان می‌دهد با چه عبارت‌هایی دیده می‌شوید. اگر بخش بزرگی از درخواست‌های خزش به URLهای فیلتر یا پارامتردار می‌رود، بودجه خزش دارد هدر می‌رود.

برای صفحاتی که در وضعیت «Discovered - currently not indexed» مانده‌اند، در مقاله چرا صفحات سایت در گوگل ایندکس نمی‌شوند توضیح داده‌ام چه کارهایی واقعاً اثر دارد.

یک نکته برای فروشگاه‌های ایرانی: فید مقایسه قیمت

بخشی از خریداران ایرانی جستجو را از سایت‌های مقایسه قیمت شروع می‌کنند. اگر این سایت‌ها فید محصول (XML یا API) می‌پذیرند، اتصال فروشگاه به آن‌ها یک کانال ورودی جدا از گوگل است. همان داده‌ای که برای Schema آماده کرده‌اید (نام، قیمت، موجودی، تصویر) معمولاً برای فید هم کافی است؛ فقط باید مطمئن شوید قیمت و موجودی فید همیشه با سایت یکی است.

جمع‌بندی

سئوی فنی فروشگاه بیشتر از جنس حذف است: حذف URLهای تکراری، حذف حجم اضافه صفحه، حذف وابستگی محتوا به جاوااسکریپت و حذف اختلاف بین داده ساختاریافته و صفحه. وقتی این‌ها درست شد، محصولات و محتوای خوب فرصت دیده شدن پیدا می‌کنند. اگر فروشگاه شما با وجود محتوای کافی در گوگل دیده نمی‌شود، در بررسی سئوی فنی و سرعت سایت کمکتان می‌کنم؛ نمونه پیاده‌سازی این موارد را هم در فروشگاه عینک‌سازی می‌بینید.

وب، سئو و فرانت‌اند
۵ دقیقه مطالعه

چرا صفحات سایت در گوگل ایندکس نمی‌شوند؟ Discovered و Crawled currently not indexed

معنی دو وضعیت رایج Search Console یعنی Discovered - currently not indexed و Crawled - currently not indexed، چه کارهایی واقعاً به ایندکس شدن کمک می‌کند و چه کارهایی وقت تلف کردن است؛ از تجربه راه‌اندازی همین سایت.

مطالعه مقاله#سئو
وب، سئو و فرانت‌اند
۶ دقیقه مطالعه

اولین منبع ترافیک فروشگاه: نه گوگل، بلکه ChatGPT

بعد از راه‌اندازی آنالیتیکس اختصاصی دیدیم بیشترین ورودی فروشگاه از ChatGPT است؛ و ربات‌های هوش مصنوعی پشت فایروال CDN بسته بودند.

مطالعه مقاله#سئو