// next-sitemap.config.js /** @type {import('next-sitemap').IConfig} */ module.exports = { siteUrl: 'https://modstagram.com', // دامنه اصلی سایت شما generateRobotsTxt: true, // تولید فایل robots.txt sitemapSize: 7000, // حداکثر تعداد URL در هر فایل سایت‌مپ changefreq: 'daily', // فرکانس پیش‌فرض تغییر صفحات priority: 0.7, // اولویت پیش‌فرض صفحات // تابع transform برای فیلتر کردن و تنظیمات خاص هر مسیر transform: async (config, path) => { // مسیرهایی که نباید در سایت‌مپ باشند و نیازی به ایندکس شدن ندارند const excludedPaths = [ '/settings', '/auth', '/new-post', '/offer', '/private/', // مسیرهای خصوصی // صفحات مربوط به پرداخت و ثبت‌نام/ورود '/projects/payment/success', '/projects/payment/failed', '/billboards/payment/success', '/billboards/payment/failed', '/forget-password', '/change-passowrd', '/login-with-username', '/login', '/register-otp', '/verify-otp', '/register', '/forget-password-otp', '/register/password', '/register/fullname', '/register/usertype', '/register/username', '/verify/avatar', '/verify/auth', '/verify/colors', '/verify/confirm', '/verify/expertise', '/verify/gender', '/verify/national-cart', '/verify/location', '/verify/public-relations', '/verify/cooperation-type', '/verify/services', '/verify/sizes', '/new-project', // اگر این یک صفحه فرم داخلی است که نیازی به ایندکس شدن ندارد '/billboards/new', // اگر این یک صفحه فرم داخلی است که نیازی به ایندکس شدن ندارد '/search', // اگر صفحه جستجو محتوای قابل ایندکس ندارد ]; // اگر مسیر در لیست excludedPaths باشد، آن را از سایت‌مپ حذف کن if (excludedPaths.some(p => path.startsWith(p))) { return null; } let pageChangefreq = config.changefreq; let pagePriority = config.priority; // تنظیمات خاص برای مسیرهای مختلف if (path.startsWith('/users/')) { // مسیر برای پروفایل‌های کاربران pageChangefreq = 'weekly'; pagePriority = 0.6; } if (path.startsWith('/projects/') || path.startsWith('/billboards/')) { pageChangefreq = 'daily'; pagePriority = 0.8; } if (path === '/') { // صفحه اصلی pageChangefreq = 'daily'; pagePriority = 1.0; } if (path === '/about-us') { // صفحه درباره ما pageChangefreq = 'monthly'; pagePriority = 0.8; } return { loc: path, // آدرس کامل صفحه changefreq: pageChangefreq, // فرکانس تغییر صفحه priority: pagePriority, // اولویت صفحه lastmod: config.autoLastmod ? new Date().toISOString() : undefined, // تاریخ آخرین تغییر alternateRefs: config.alternateRefs ?? [], }; }, // تابع additionalPaths برای اضافه کردن مسیرهای داینامیک از API additionalPaths: async (config) => { const paths = []; const BASE_URL_API = "https://app.modstagram.ir/api/v1"; // آدرس پایه API شما paths.push({ loc: '/', changefreq: 'daily', priority: 1.0 }); paths.push({ loc: '/projects', changefreq: 'daily', priority: 0.9 }); paths.push({ loc: '/billboards', changefreq: 'daily', // یا weekly بسته به میزان تغییر محتوا priority: 0.9 }); try { // واکشی داده‌های پروژه‌ها const projectsRes = await fetch(`${BASE_URL_API}/projects?limit=500`); const projectsData = await projectsRes.json(); if (projectsData && Array.isArray(projectsData.projects)) { projectsData.projects.forEach((project) => { if (project.id && project.title) { paths.push({ // مسیر پروژه‌ها (با استفاده از تمپلیت لیتِرال صحیح) loc: `/projects/${project.id}/${encodeURIComponent(project.title)}`, changefreq: 'daily', priority: 0.8 }); } }); } // واکشی داده‌های بیلبوردها const billboardsRes = await fetch(`${BASE_URL_API}/advertising/web?limit=500`); const billboardsData = await billboardsRes.json(); if (billboardsData && Array.isArray(billboardsData.advertisings)) { billboardsData.advertisings.forEach((billboard) => { if (billboard._id && billboard.title) { paths.push({ // مسیر بیلبوردها (با استفاده از تمپلیت لیتِرال صحیح) loc: `/billboards/${billboard._id}/${encodeURIComponent(billboard.title)}`, changefreq: 'daily', priority: 0.8 }); } }); } // واکشی داده‌های کاربران (مدل‌ها) const usersRes = await fetch(`${BASE_URL_API}/users/web?limit=500`); const usersData = await usersRes.json(); if (usersData && Array.isArray(usersData.users)) { usersData.users.forEach((user) => { if (user.user_name) { paths.push({ // مسیر پروفایل کاربران (مسیر در Next.js شما /users/[username] است) loc: `/users/${encodeURIComponent(user.user_name)}`, changefreq: 'weekly', priority: 0.6 }); } }); } } catch (error) { // لاگ کردن خطا در صورت مشکل در واکشی داده‌ها از API console.error('Error fetching additional paths for sitemap:', error); } return paths; // بازگرداندن آرایه‌ای از مسیرهای داینامیک }, // تنظیمات مربوط به فایل robots.txt robotsTxtOptions: { policies: [ { userAgent: '*', // اعمال سیاست‌ها برای همه ربات‌ها allow: '/', // اجازه دسترسی به کل سایت disallow: [ '/api/', // مسیرهای API '/_next/', // فایل‌های داخلی Next.js '/settings', // صفحات تنظیمات '/auth', // صفحات احراز هویت (ورود، ثبت‌نام) '/private/', // مسیرهای خصوصی موجود '/new-post', // صفحات ایجاد پست جدید '/offer', // صفحات پیشنهاد // اضافه کردن مسیرهای پرداخت و ثبت‌نام/ورود به disallow '/projects/payment/success', '/projects/payment/failed', '/billboards/payment/success', '/billboards/payment/failed', '/forget-password', '/change-passowrd', '/login-with-username', '/login', '/register-otp', '/verify-otp', '/register', '/forget-password-otp', '/register/password', '/register/fullname', '/register/usertype', '/register/username', '/verify/avatar', '/verify/auth', '/verify/colors', '/verify/confirm', '/verify/expertise', '/verify/gender', '/verify/national-cart', '/verify/location', '/verify/public-relations', '/verify/cooperation-type', '/verify/services', '/verify/sizes', '/new-project', '/billboards/new', '/search', // اگر این صفحه برای ایندکس شدن نامناسب است ], }, ], // اضافه کردن آدرس سایت‌مپ به robots.txt additionalSitemaps: [ 'https://modstagram.com/sitemap.xml', ], }, };