انتقل إلى المحتوى

SEO والبحث

يوفّر Fumadocs البحث. ويضيف Onedocs مساعدات لخريطة الموقع وملفي robots.txt وllms.txt، مُهيّأة جميعها كمسارات في App Router لـNext.js. للاطلاع على بيانات الصفحة الوصفية وصور Open Graph، راجع onedocs/metadata وonedocs/og في مرجع API.

يستخدم Onedocs بحث Orama المضمّن من Fumadocs. أنشئ مسار API:

TypeScript
import { source } from "@/lib/source";
import { createFromSource } from "fumadocs-core/search/server";

export const { GET } = createFromSource(source);

يستعلم مربع البحث الذي يضيفه RootProvider عن /api/search افتراضيًا، لذا لا يلزم إعداد آخر.

خريطة الموقع

أنشئ خريطة موقع على /sitemap.xml:

TypeScript
import { generateSitemap } from "onedocs/seo";
import meta from "../../content/docs/meta.json";

const baseUrl = "https://yourdomain.com";

export default function sitemap() {
  return generateSitemap({
    baseUrl,
    pages: meta.pages ?? [],
  });
}

يسرد generateSitemap جذر الموقع، ثم عنصر URL لكل إدخال في pages ضمن /docs. تُتخطى الإدخالات التي تبدأ بـ--- (فواصل الشريط الجانبي)، ويُحوّل index إلى /docs نفسه. تُقرأ الإدخالات كما هي، لذا تحتاج الصفحات داخل المجلدات الفرعية إلى إدخالات خاصة بها، مثل "guides/setup".

Robots.txt

أنشئ ملف robots.txt على /robots.txt:

TypeScript
import { generateRobots } from "onedocs/seo";

const baseUrl = "https://yourdomain.com";

export default function robots() {
  return generateRobots({ baseUrl });
}

ينشئ هذا ما يلي:

الكود
User-Agent: *
Allow: /

Host: https://yourdomain.com
Sitemap: https://yourdomain.com/sitemap.xml

LLMs.txt

يساعد LLMs.txt مساعدات الذكاء الاصطناعي على فهم توثيقك. يستطيع Onedocs إنشاء نسختين: ملخصة وكاملة المحتوى.

النسخة الملخصة

أنشئ /llms.txt بعناوين الصفحات وأوصافها:

TypeScript
import { createLLMsSource, generateLLMsText } from "onedocs/llms";
import { source } from "@/lib/source";
import config from "../../../onedocs.config";

export async function GET() {
  const llmsSource = createLLMsSource(source);
  const text = await generateLLMsText(llmsSource, {
    title: config.title,
    description: config.description,
  });

  return new Response(text, {
    headers: { "Content-Type": "text/plain; charset=utf-8" },
  });
}

يبدأ الملف بالعنوان والوصف، ويسرد كل صفحة بصيغة - Title: URL مع وصفها، وينتهي بإشارة إلى /llms-full.txt. تقبل الدالتان المصدر المغلّف من createLLMsSource، وليس مصدر Fumadocs نفسه، وتعيدان وعدًا.

نسخة المحتوى الكامل

أنشئ /llms-full.txt بالتوثيق الكامل:

TypeScript
import { createLLMsSource, generateLLMsFullText } from "onedocs/llms";
import { source } from "@/lib/source";

export async function GET() {
  const llmsSource = createLLMsSource(source);
  const text = await generateLLMsFullText(llmsSource);

  return new Response(text, {
    headers: { "Content-Type": "text/plain; charset=utf-8" },
  });
}

تُكتب كل صفحة بعنوانها وURL ووصفها وMarkdown المعالَج، مع --- بين الصفحات.

يأتي نص الصفحة من Markdown المعالَج في MDX الخاص بـFumadocs، وهو معطّل افتراضيًا. من دونه، لا يحتوي llms-full.txt إلا على العناوين وعناوين URL والأوصاف (#3). فعّله في source.config.ts:

TypeScript
import { defineDocs } from "fumadocs-mdx/config";

export const docs = defineDocs({
  dir: "content/docs",
  docs: {
    postprocess: {
      includeProcessedMarkdown: true,
    },
  },
});

خيارات الإعداد

خيارات خريطة الموقع

TypeScript
generateSitemap({
  baseUrl: "https://yourdomain.com",
  pages: ["index", "getting-started", "configuration"],
  docsPath: "/docs", // Default: "/docs"
});

خيارات Robots

TypeScript
generateRobots({
  baseUrl: "https://yourdomain.com",
  sitemapPath: "/sitemap.xml", // Default: "/sitemap.xml"
});

ما الذي ستحصل عليه

بعد إعداد هذه المسارات:

URL الوظيفة
/api/search?query=... نقطة نهاية البحث API
/sitemap.xml خريطة موقع XML لمحركات البحث
/robots.txt ملف Robots يتضمن مرجعًا إلى خريطة الموقع
/llms.txt ملخص لمساعدات الذكاء الاصطناعي
/llms-full.txt توثيق كامل لمساعدات الذكاء الاصطناعي