أعِد إنشاء خريطة موقعك انطلاقًا من مجموعة الصفحات العامة المكتملة كلما نشرت الموقع، ثم ارفع كليهما معًا. يستخدم سير العمل هذا على جهاز Mac نصًا برمجيًا صغيرًا بلغة Python لإضافة الصفحات الجديدة واستبعاد الصفحات المحذوفة تلقائيًا، مع التحقق من النتيجة العامة.

تتمثل المهمة هنا في صيانة خريطة موقع لموقع ثابت صغير مُصدَّر من جهاز Mac. يستخدم المثال صفحات افتراضية عن الألوان. ويفترض أن عملية النشر الحالية لديك تستطيع رفع مجلد التصدير وإزالة الملفات القديمة من الموقع العام.

اختر موضع إعادة إنشاء خريطة الموقع في سير العمل

تحقق أولًا مما إذا كان نظام النشر لديك ينشئ خريطة موقع بالفعل. تشير Google إلى أن كثيرًا من أنظمة إدارة المحتوى توفر خريطة موقع تلقائيًا. إذا كان نظامك يفعل ذلك، فاختبر خريطة الموقع بعد إضافة صفحة تجريبية وحذفها قبل إدخال أداة إنشاء أخرى. تعرّف على خرائط المواقع.

للتصدير الثابت، اتبع هذا التسلسل: أكمل تصدير الصفحات، وأنشئ خريطة الموقع انطلاقًا من ذلك التصدير، ثم انشر المجلد الناتج. هذا نمط تنفيذ مقترح يجعل خريطة الموقع تصف مجموعة الصفحات نفسها التي يتلقاها نظام النشر.

يتيح الإنشاء أثناء النشر أيضًا تطبيق قاعدة موحدة على الإضافات والحذوفات. تُدرج الصفحة الموجودة في التصدير المكتمل، وتُستبعد الصفحة غير الموجودة فيه. فلا توجد قائمة منفصلة تحتاج إلى تذكّر تحديثها.

اختر التكامل الذي يناسب إعدادك الحالي:

إعداد النشر الحالي موضع إعادة الإنشاء
يتولى نظام إدارة المحتوى صيانة خريطة الموقع بالفعل احتفظ بأداة الإنشاء تلك واختبر استجابتها لتغييرات الصفحات
يدعم المُصدِّر الثابت أمرًا يُنفذ بعد التصدير شغّل أداة الإنشاء هناك، قبل الرفع
ينشر أمر موجود مجلدًا مكتملًا شغّله عبر وسيطة النشر الاختيارية لأداة الإنشاء
ترفع الملفات عبر واجهة سطح مكتب أنشئ خريطة الموقع أولًا، ثم ارفع المجلد كاملًا؛ يتطلب التحديث العام دون تدخل يدوي تكاملًا مدعومًا للنشر

لا يستطيع نص برمجي محلي تغيير موقع بعيد بمفرده. يعمل سير العمل أدناه على أتمتة إنشاء خريطة الموقع ويمكنه تشغيل أمر نشر موجود. أما الرفع الفعلي فيبقى من مسؤولية أداة النشر المعتمدة لديك.

حدّد بدقة الصفحات التي ينبغي إدراجها في خريطة الموقع

بالنسبة إلى عناوين URL العادية للصفحات، تقبل Google خريطة موقع نصية تتضمن عنوان URL كاملًا واحدًا في كل سطر. صيغة XML اختيارية لهذه المهمة. أدرج عنوان URL العام المفضّل لكل صفحة بدلًا من إدراج إصدارات متعددة للمحتوى نفسه. أنشئ خريطة موقع وقدّمها.

تتطلب الصيغة النصية ترميز UTF-8، ولا تحتوي إلا على عناوين URL من دون عناوين أو تعليقات. يمكن أن يحتوي الملف الواحد على 50,000 عنوان URL كحد أقصى، وبحجم يصل إلى 52,428,800 بايت. ضع خريطة الموقع في هذا المثال في جذر الموقع لتشمل الصفحات المُصدَّرة الموجودة تحته. بروتوكول خرائط المواقع: الملفات النصية وموقعها.

تستخدم أداة الإنشاء اصطلاحًا بسيطًا عمدًا لملفات التصدير:

الملف المُصدَّر عنوان URL عام توضيحي
public/index.html https://example.com/
public/colors/blue.html https://example.com/colors/blue.html
public/tiles/index.html https://example.com/tiles/

استخدم هذا الاصطلاح فقط إذا كان مضيفك يقدّم عناوين URL هذه كما هي. إذا كان نظام النشر يحوّل blue.html إلى /colors/blue/، أو يقدّم الموقع ضمن مسار مثل /collection/، فاستخدم قائمة المسارات الخاصة به أو عدّل الربط قبل النشر. لا يمكن لمسح أسماء الملفات استنتاج قواعد التوجيه المخصصة.

أدرج فقط الصفحات المخصّصة للظهور في مجلد التصدير. يتجاوز هذا المثال المسارات التي تبدأ بنقطة والملفات المسماة 404.html؛ ولا يفحص بيانات الصفحة الوصفية أو تصريحات الرابط الأساسي أو قواعد إعادة التوجيه. ينبغي للمواقع التي لديها هذه الشروط الإضافية أن تنشئ خريطة الموقع انطلاقًا من قائمة الصفحات المؤهلة لدى نظام النشر.

واصل صيانة روابط التنقل المعتادة أيضًا. يعرّف WHATWG الروابط التشعبية التي تنشئها عناصر a ذات السمة href، وتوضح Google أن الصفحات المرتبطة على نحو صحيح يمكن عادةً اكتشافها عبر التنقل. ينبغي أن يصاحب تحديث خريطة الموقع تحديث الروابط المؤدية إلى الصفحات المضافة أو المحذوفة. معيار HTML من WHATWG: الروابط، تعرّف على خرائط المواقع.

أنشئ أداة إنشاء خريطة الموقع على جهاز Mac

تحتاج إلى Python 3.8 أو إصدار أحدث ومحرر نصوص عادي. شغّل python3 --version في Terminal للتحقق من المفسّر المتاح لديك. إذا كنت بحاجة إلى Python، فاتبع تعليمات التثبيت على macOS الصادرة عن مؤسسة Python Software Foundation. كما تشرح وثائقها تشغيل النصوص البرمجية باستخدام python3 من Terminal. استخدام Python على macOS.

أنشئ مجلدًا باسم sitemap-demo على سطح المكتب. واحفظ البرنامج الكامل التالي بداخله باسم regenerate_sitemap.py. يستخدم البرنامج المكتبة القياسية في Python ولا يتطلب حزمًا إضافية.

import argparse
from pathlib import Path, PurePosixPath
import subprocess
import tempfile
from urllib.parse import quote, urlsplit


def make_sitemap(paths, origin):
    parsed = urlsplit(origin)
    if (parsed.scheme not in ("http", "https") or not parsed.hostname
            or parsed.netloc != parsed.hostname
            or parsed.path not in ("", "/")
            or parsed.query or parsed.fragment):
        raise ValueError("Use a site origin, such as https://example.com")
    base = origin.rstrip("/")
    urls = set()
    for relative in paths:
        path = PurePosixPath(relative)
        if path.name == "index.html":
            parent = path.parent.as_posix()
            route = "" if parent == "." else parent + "/"
        else:
            route = path.as_posix()
        urls.add(base + "/" + quote(route, safe="/"))
    if not urls:
        raise ValueError("No eligible pages; sitemap was not replaced")
    if len(urls) > 50000:
        raise ValueError("Split the sitemap: more than 50,000 URLs")
    data = ("\n".join(sorted(urls)) + "\n").encode("utf-8")
    if len(data) > 50 * 1024 * 1024:
        raise ValueError("Split the sitemap: larger than 50 MB")
    return data


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("folder")
    parser.add_argument("origin")
    parser.add_argument("publish", nargs=argparse.REMAINDER)
    args = parser.parse_args()
    root = Path(args.folder).resolve()
    if not root.is_dir():
        parser.error("The export folder must already exist")
    paths = []
    for file in root.rglob("*.html"):
        relative = file.relative_to(root)
        if (file.is_file() and file.name != "404.html"
                and not any(p.startswith(".") for p in relative.parts)):
            paths.append(relative.as_posix())
    data = make_sitemap(paths, args.origin)
    target = root / "sitemap.txt"
    temporary = None
    try:
        with tempfile.NamedTemporaryFile(dir=root, delete=False) as handle:
            temporary = Path(handle.name)
            handle.write(data)
        temporary.replace(target)
    finally:
        if temporary is not None:
            temporary.unlink(missing_ok=True)
    print(f"Wrote {len(data.splitlines())} URLs to {target}", flush=True)
    if args.publish:
        subprocess.run(args.publish, check=True)


if __name__ == "__main__":
    main()

تعيد كل عملية تشغيل إنشاء قائمة عناوين URL كاملة. وترتب النتائج وتزيل التكرارات منها، وترمّز المحارف مثل المسافات في المسارات، ثم تكتب ملفًا مؤقتًا قبل استبدال sitemap.txt. تؤدي أخطاء الإنشاء إلى إيقاف البرنامج قبل تشغيل أمر النشر الاختياري.

يؤدي التصدير الفارغ عمدًا إلى إطلاق خطأ، مع إبقاء خريطة الموقع السابقة دون تغيير. يكشف ذلك اختيار مجلد غير مقصود أو غير مكتمل. ويتطلب حذف جميع الصفحات عمدًا قرارًا منفصلًا بشأن النشر، بدلًا من تمرير تصدير فارغ عبر سير العمل هذا.

اختبر إضافة صفحة وحذف أخرى قبل ربط النشر

انتقل في Terminal إلى مجلد العرض التوضيحي:

cd "$HOME/Desktop/sitemap-demo"

أنشئ صفحتين افتراضيتين باستخدام أمر الإعداد الكامل هذا. استخدمه في مجلد العرض التوضيحي الجديد؛ فهو يكتب ملفي العينة المحددين.

python3 - <<'PY'
from pathlib import Path

root = Path("public")
(root / "colors").mkdir(parents=True, exist_ok=True)
pages = {
    "index.html": "<!doctype html><title>Color collection</title><p>Color collection.</p>",
    "colors/blue.html": "<!doctype html><title>Blue tile</title><p>A blue tile.</p>",
}
for name, content in pages.items():
    (root / name).write_text(content, encoding="utf-8")
PY

أنشئ خريطة الموقع المحلية وافحصها. أصل المثال توضيحي؛ فهذه الأوامر لا تنشر أي شيء عليه.

python3 regenerate_sitemap.py public https://example.com
cat public/sitemap.txt

يُفترض أن يحتوي الملف على هذين السطرين فقط:

https://example.com/
https://example.com/colors/blue.html

استبدل الآن صفحة اللون الأزرق الافتراضية بصفحة للون الأخضر:

python3 - <<'PY'
from pathlib import Path

root = Path("public")
(root / "colors/blue.html").unlink()
(root / "colors/green.html").write_text(
    "<!doctype html><title>Green tile</title><p>A green tile.</p>",
    encoding="utf-8",
)
PY
python3 regenerate_sitemap.py public https://example.com
cat public/sitemap.txt

النتيجة المتوقعة هي عنوان URL للصفحة الرئيسية، يليه https://example.com/colors/green.html. يختفي عنوان URL للصفحة الزرقاء لأن ملفها المُصدَّر لم يعد موجودًا. وهكذا يتم التحقق من اتجاهَي التحديث دون الاعتماد على محرك بحث لاكتشاف التغيير.

اجعل إعادة الإنشاء جزءًا من كل عملية نشر

لموقعك الفعلي، استبدل مجلد العرض التوضيحي والأصل بعناوين مجلد التصدير المكتمل وأصل الموقع العام الفعليين. شغّل أداة الإنشاء بعد اكتمال التصدير فقط، وأبقِ ذلك المجلد دون تغيير حتى انتهاء النشر. نفّذ عمليات النشر بالتتابع.

إذا كان لديك بالفعل نص برمجي عامل للنشر باسم deploy-site.sh في مجلد المشروع، فإن أمر التكامل التالي ينشئ خريطة الموقع ثم يشغّل ذلك النص البرمجي. يتطلب هذا المثال وجود النص البرمجي؛ فأداة الإنشاء لا تنشئه ولا توفر إعدادات الاستضافة.

python3 regenerate_sitemap.py public https://example.com sh ./deploy-site.sh

يجب أن يرفع نص النشر البرمجي المجلد public نفسه، بما في ذلك sitemap.txt، وأن يزيل الملفات العامة التي اختفت من التصدير. ويجب ألا يعيد إنشاء الصفحات بعد إنشاء خريطة الموقع. إذا كان نظام النشر يبني الموقع أيضًا، فأدرج الإنشاء بين مرحلتي البناء والرفع.

إذا فشل الإنشاء، فلن يُشغّل أمر النشر. وإذا فشل النشر، فسيبلغ Python عن الفشل، لكن ربما يكون الموقع البعيد قد تغيّر جزئيًا بالفعل. تحقق من النتيجة العامة قبل إعادة المحاولة. وإذا كان مضيفك يدعم نشر إصدار كامل دفعة واحدة، فاستخدم الآلية الموثقة لذلك.

إذا كنت تستخدم أداة رفع لسطح المكتب، فأنشئ خريطة الموقع قبل اختيار مجلد التصدير لرفعه. تأكد من أن الأداة تستبدل خريطة الموقع الموجودة وتتعامل مع الصفحات المحذوفة. يظل إجراء الرفع مطلوبًا؛ فالتوليد المحلي التلقائي وحده لا يتيح النشر العام دون تدخل يدوي.

تحقّق من خريطة الموقع العامة والصفحة المحذوفة كلًّا على حدة

بعد نجاح النشر، افتح عنوان URL العام الفعلي sitemap.txt في المتصفح. تحقق من ظهور الصفحة المضافة وعدم ظهور الصفحة المحذوفة. ثم زُر كل صفحة متأثرة مباشرةً. يساعد ذلك على التمييز بين التصدير المحلي الصحيح والإصدار المنشور الصحيح.

لا يحدد حذف إدخال من خريطة الموقع استجابة HTTP عند العنوان القديم للصفحة. إذا حُذفت صفحة ولم يكن لها بديل، فتحقق من أن المضيف يرسل استجابة مناسبة لصفحة غير موجودة. يعرّف RFC 9110 الرمز 404 لمورد لا يتوفر له تمثيل حالي، والرمز 410 عندما يُعرف أن عدم توفره يُرجّح أن يكون دائمًا. RFC 9110: دلالات HTTP.

قد تُعامل الصفحة التي تعرض رسالة عن عدم وجودها بينما ترسل 200 على أنها 404 زائفة. وتوضح Google أيضًا أن عناوين URL المفهرسة سابقًا، التي ترسل استجابات 4xx المناسبة، تُزال من فهرسها بمرور الوقت. لذلك، لا يشكل حذف عنوان URL من خريطة الموقع سوى جزء واحد من إزالة الصفحة. تأثير رموز حالة HTTP في برامج زحف Google.

اتبع خطوات التشخيص هذه إذا بدا أن هناك خللًا:

الملاحظة ما ينبغي التحقق منه بعد ذلك
ما زالت خريطة الموقع المحلية تسرد صفحة محذوفة ابحث عن ملف مُصدَّر متبقٍ أو عن مجلد التصدير الخطأ
خريطة الموقع المحلية صحيحة، لكن النسخة العامة مختلفة تحقق من المجلد المرفوع والوجهة والتخزين المؤقت
خريطة الموقع العامة صحيحة، لكن الصفحة المحذوفة ما زالت تُفتح تحقق مما إذا كان النشر قد أزال الملف القديم من الخادم البعيد
يفتح عنوان URL مُنشأ صفحة خاطئة راجع ربط المسارات لدى المضيف مقارنةً باصطلاح أسماء الملفات
عنوان URL جديد متاح للعامة لكنه غير موجود في نتائج البحث تعامل مع اكتشاف محركات البحث وفهرستها بوصفهما عملية منفصلة

قد يفسر التخزين المؤقت استمرار ظهور خريطة الموقع العامة دون تغيير. يحدد RFC 9111 كيفية بقاء الاستجابات المخزنة مؤقتًا حديثة وإعادة التحقق منها. إذا كان مضيفك يدعم ضبط ترويسات الاستجابة، فإن Cache-Control: no-cache يتطلب التحقق بنجاح قبل إعادة استخدام استجابة مخزنة؛ فتغيير ملف محلي وحده لا يضبط تلك الترويسة. RFC 9111: التخزين المؤقت لـ HTTP.

احتفظ بعنوان ثابت واحد لخريطة الموقع

اجعل خريطة الموقع العامة قابلة للاكتشاف عبر إرسال عنوانها الثابت من خلال تقرير Sitemaps في Search Console، أو الإشارة إليها في ملف robots.txt الحالي للموقع. تشرح Google الطريقتين وتشير إلى أن إرسال خريطة الموقع يُعدّ إشارة. أنشئ خريطة موقع وقدّمها.

في الموقع التوضيحي، سيكون سطر الاكتشاف كما يلي:

Sitemap: https://example.com/sitemap.txt

حافظ على ثبات عنوان خريطة الموقع مع استبدال محتواها أثناء النشر. يتحقق اكتمال العمل عمليًا عندما تطابق خريطة الموقع العامة التصدير المكتمل، وتُفتح الصفحة المضافة على عنوانها المدرج، وتُظهر الصفحة المحذوفة الاستجابة المطلوبة. تتعامل محركات البحث مع هذه التغييرات وفق جداولها الخاصة؛ فإدراج الصفحة في خريطة الموقع لا يضمن الزحف إليها أو فهرستها. تعرّف على خرائط المواقع.

المصادر