الامتداد عند الحفظ هو ".php".
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<title>برنامج PHP لإنشاء خريطة الموقع XML</title>
<meta name="robots" content="NOINDEX,NOFOLLOW">
<!-- تحميل خطوط الأيقونات المجانية - يمكن حذفها في حالة عدم استخدامها -->
<link href="https://use.fontawesome.com/releases/v6.2.0/css/all.css" rel="stylesheet">
</head>
<body>
<h2> <i class="fa-regular fa-pen-to-square fa-2x" style="color: crimson"></i> إنشاء خريطة موقع XML</h2>
<hr>
<div style="margin:15px 5px 10px 20px;padding: 0 15px 0 0; font-size: 14px;background-color: lavenderblush; border: gray 1px solid; border-radius: 4px;">
<div style="margin:15px 0 0 20px">
<form method="post">
<input type="submit" name="downloadLocal" value="قم بتنزيل ملف XML محليًا" style="background-color: white;border-radius: 5px;cursor: pointer;">
</form>
</div>
<ul>
<li>يحتوي ملف XML الذي تقوم بتنزيله من هنا على جزء من جزء HTML من الصفحة.</li>
<li>يرجى مشاهدته كمرجع وتنزيله من خادم بعيد إذا كنت بحاجة إلى ملف XML النقي. وبدلاً من ذلك، يرجى حذف جزء HTML من الملف الذي تم تنزيله.</li>
</ul>
</div>
<hr>
<?php
//************************************************
// برنامج PHP لتتبع عداد التنزيل وعارض تاريخ التنزيل
// [معرفة الجميع كتاب صغير مفيد للجميع]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// تاريخ النشر: 4 فبراير 2024
//************************************************
// فحص الخطأ/العيب
// غير مطلوب لوظيفة إنشاء خريطة الموقع. إذا لم يتم استخدامه، قم بتغيير "1" إلى "0". أو حذف الكل
// المستند الأصلي للبرمجة.الاكتساب التلقائي
$sitemapDirectory = $_SERVER['DOCUMENT_ROOT'];
// اسم ملف .xml (اسم الملف النهائي)
// يمكنك تغيير اسم ملف .xml. ومع ذلك، تستخدم العديد من محركات البحث "sitemap.xml" كاصطلاح تسمية قياسي، ومن المستحسن استخدام "sitemap.xml".
$finalSitemapFilename = 'sitemap.xml';
// مكان حفظ ملف خريطة الموقع (الدليل النهائي - الجذر)
$finalSitemapPath = $sitemapDirectory . '/' . $finalSitemapFilename;
// الدليل المستهدف لإنشاء خريطة الموقع
$rootDirectory = $_SERVER['DOCUMENT_ROOT'];
// اسم ملف .xml (اسم ملف مؤقت)
$tempSitemapFilename = 'temporarysitemap.xml';
// موقع تخزين ملف خريطة الموقع (دليل مؤقت)
$tempSitemapPath = $sitemapDirectory . '/' . $tempSitemapFilename;
// أنشئ دليلاً مؤقتًا إذا لم يكن موجودًا
$tempDirectory = dirname($tempSitemapPath);
if (!file_exists($tempDirectory)) {
mkdir($tempDirectory, 0777, true);
}
// احذف خريطة الموقع القديمة وأعد تسميتها إلى خريطة الموقع الجديدة (باستخدام أوامر shell)
$oldSitemapFilename = 'old-' . $finalSitemapFilename;
$oldSitemapPath = $sitemapDirectory . '/' . $oldSitemapFilename;
// احذف خريطة الموقع القديمة إذا كانت موجودة
if (file_exists($oldSitemapPath)) {
unlink($oldSitemapPath);
}
// إعادة التسمية إلى خريطة الموقع الجديدة
if (file_exists($tempSitemapPath)) {
rename($tempSitemapPath, $oldSitemapPath);
}
// تحقق مما إذا تم النقر على زر التنزيل
if (isset($_POST['downloadLocal'])) {
// انسخ خريطة الموقع إلى الدليل المؤقت
copy($finalSitemapPath, $tempSitemapPath);
// تعيين الرأس للتنزيل
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $finalSitemapFilename . '"');
header('Content-Length: ' . filesize($tempSitemapPath));
// ملف إلاخراج
readfile($tempSitemapPath);
// احذف خريطة الموقع المحفوظة في الدليل المؤقت بعد التنزيل
unlink($tempSitemapPath);
exit;
}
///// إعدادات الاستبعاد /////
// الدلائل لاستبعادها. حدد فقط اسم الدليل المراد استبعاده. ['dir-1'، 'dir2'] وما إلى ذلك.
// اتركه فارغًا إذا لم تكن هناك حاجة إليه. [];
$excludeDirectories = [];
// الملفات المراد استبعادها. حدد اسم الملف فقط. ['aaa.html'، 'bbb.php'] وما إلى ذلك.
// اتركه فارغًا إذا لم تكن هناك حاجة إليه. [];
$excludeFiles = [];
// المجلدات/الملفات المطلوب استبعادها ['dir-1/dir1/file1.html', 'dir2/file2.php'] وما إلى ذلك.
// لا تقم بتضمين "/" في بداية المسار المستبعد
// اتركه فارغًا إذا لم تكن هناك حاجة إليه. [];
$excludePaths = [];
// استبعاد الملفات ذات العلامات الوصفية مثل ['NOINDEX'، 'NOFOLLOW'، 'REFRESH']
// اتركه فارغًا إذا لم تكن هناك حاجة إليه. [];
// نوصي بتحديد ['NOINDEX']
$excludeMetaTags = ['NOINDEX'];
///// شروط إنشاء خريطة الموقع /////
// احصل على عنوان الصفحة (1: احصل عليه، 2: لا تحصل عليه)
// * غير مستحسن في Google Search Console
// *[مهم] عند التسجيل في Google Search Console، اضبطه على "2: لا تكتسب"
// *إذا قمت بتعيين ``1: الحصول على''، فستعرض Google Search Console الرسالة ``لم يتم التعرف على علامة العنوان.'' سيظهر تنبيه يطلب منك إصلاحه.
$getTitle = 2;
// حدد السلسلة المراد إزالتها من عنوان الصفحة
// * يمكن حذف الأحرف المحددة من العنوان. ['لا'، 'ديسو'] وما إلى ذلك.
// اتركه فارغًا إذا لم تكن هناك حاجة إليه. [];
$removeTitleStrings = [];
// احصل على تاريخ آخر تحديث للملف (1: احصل عليه، 2: لا تحصل عليه)
// * موصى به بواسطة Google Search Console
$getLastMod = 1;
// تردد تحديث الصفحة
// * تم التجاهل/الإهمال بواسطة Google. يقول "لا تضيف قيم"
// استخدم تردد تحديث الصفحة (1: استخدم، 2: لا تستخدم)
$useChangeFreq = 2;
// حدد عنصر تردد التحديث
// إذا تم التعيين على "1"، فحدد عنصر تكرار تحديث الصفحة.['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never']
// العنصر دائمًا: يتم تحديثه في كل مرة يتم الوصول إليه،hourly: يتم تحديثه كل ساعة،daily: يتم التحديث يوميا،weekly: يتم تحديثه كل أسبوع،monthly: تحديث شهري،yearly: يتم تحديثه كل عام،never:لا تحدث
$changefreqValues = ['حدد وأدخل القيمة التي تنطبق على تكرار تحديث الموقع'];
// أولوية الصفحة
// * تم التجاهل/الإهمال بواسطة Google. يقول "لا تضيف قيم"
// الحصول على الأولوية (1: الحصول على، 2: عدم الحصول على)
$getPriority = 2;
// نص إنشاء خريطة الموقع
$successMessage = "<p>- تم إنشاء ملف Sitemap XML.<br>・ Sitemap XML file has been generated.</p><p>- تم الحفظ في جذر الخادم البعيد باسم "{$finalSitemapFilename}".<br>- لأسباب أمنية، يرجى حذف ملف البرنامج من الخادم البعيد.</p><p>・<a href='/{$finalSitemapFilename}' target='_blank'>افتح "ملف XML" في المتصفح[علامة تبويب منفصلة]</a></p>";
// رأس XML لخريطة الموقع (للملف النهائي)
$xmlFinal = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
XML;
// معالجة الملفات في الدليل بشكل متكرر (للملف النهائي)
function generateSitemap($directory, $excludeDirs, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, &$xmlFinal) {
$dir = new DirectoryIterator($directory);
foreach ($dir as $fileInfo) {
if ($fileInfo->isDot()) continue;
$filename = $fileInfo->getFilename();
$filepath = $fileInfo->getPathname();
$fileExtension = pathinfo($filename, PATHINFO_EXTENSION);
// تحقق مما إذا كان سيتم استبعاد الدليل/الملف
$excludePath = str_replace($_SERVER['DOCUMENT_ROOT'], '', $filepath);
if (in_array(ltrim($excludePath, '/'), $excludePaths)) {
continue;
}
if ($fileInfo->isDir()) {
if (in_array($filename, $excludeDirs)) {
continue;
} else {
generateSitemap($filepath, $excludeDirs, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, $xmlFinal);
}
} else {
if (in_array($filename, $excludeFiles) || in_array($filename, $excludeDirs)) {
continue;
}
if (in_array($fileExtension, ['html', 'php'])) {
processFile($filepath, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $xmlFinal);
}
}
}
}
// معالجة الملف (للملف النهائي)
function processFile($filepath, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, &$xmlFinal) {
$content = file_get_contents($filepath);
if (shouldExcludeContent($content, $excludeMetaTags)) {
return;
}
$url = getRelativeUrl($filepath);
// الإعداد بالتوقيت العالمي المنسق (UTC) - يوصى عمومًا باستخدام UTC (التوقيت العالمي المنسق) لعنصر في خريطة الموقع XML
$lastMod = ($getLastMod == 1) ? getLastModifiedDateUTC($filepath) : '';
$xmlFinal .= "\n <url>";
$xmlFinal .= "\n <loc>{$url}</loc>";
if ($getTitle == 1) {
$title = getTitleFromContent($content);
if (!empty($title)) {
$title = str_replace($removeTitleStrings, '', $title);
$xmlFinal .= "\n <title>{$title}</title>";
}
}
// عرض تاريخ ووقت آخر تحديث
if (!empty($lastMod)) {
$xmlFinal .= "\n <lastmod>{$lastMod}</lastmod>";
}
// changefreqيشير
if ($useChangeFreq == 1) {
$changefreq = $changefreqValues[array_rand($changefreqValues)];
$xmlFinal .= "\n <changefreq>{$changefreq}</changefreq>";
}
// priorityيشير
if ($getPriority == 1) {
$priority = getPriorityFromDepth($filepath);
$xmlFinal .= "\n <priority>{$priority}</priority>";
}
$xmlFinal .= "\n </url>";
}
// حساب الأولوية من عمق التسلسل الهرمي (للملف النهائي)
function getPriorityFromDepth($filepath) {
$depth = substr_count($filepath, DIRECTORY_SEPARATOR);
return 1 - ($depth * 0.1);
}
// تحقق مما إذا كان يجب استبعاد العلامات الوصفية (للملف النهائي)
function shouldExcludeContent($content, $excludeMetaTags) {
foreach ($excludeMetaTags as $tag) {
if (stripos($content, '<meta name="robots" content="' . $tag) !== false) {
return true;
}
}
return false;
}
///// احصل على تاريخ ووقت التعديل الأخير للملف - يوصى عادةً باستخدام UTC (التوقيت العالمي المنسق) لعنصر <lastmod> في ملف Sitemap XML.
// قم بتعيين تاريخ آخر تعديل بتنسيق UTC (التوقيت العالمي المنسق). يشير "+00:00" إلى UTC (التوقيت العالمي المنسق)
function getLastModifiedDateUTC($filepath) {
$lastModTimestamp = filemtime($filepath);
$lastModDateTime = new DateTimeImmutable('@' . $lastModTimestamp);
return $lastModDateTime->format('c');
}
// احصل على العنوان من ملف HTML (للملف النهائي)
function getTitleFromContent($content) {
$dom = new DOMDocument;
libxml_use_internal_errors(true); // قمع الأخطاء أثناء تحليل HTML
$dom->loadHTML($content);
$titleElements = $dom->getElementsByTagName('title');
if ($titleElements->length > 0) {
$title = $titleElements->item(0)->textContent;
return $title;
}
return '';
}
// الحصول على عنوان URL للملف (للملف النهائي)
function getRelativeUrl($filepath) {
$relativeUrl = str_replace($_SERVER['DOCUMENT_ROOT'], '', $filepath);
return $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . str_replace('\\', '/', $relativeUrl);
}
// ابدأ في إنشاء خريطة الموقع (للملف النهائي)
generateSitemap($rootDirectory, $excludeDirectories, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, $xmlFinal);
// تذييل خريطة الموقع (للملف النهائي)
$xmlFinal .= "\n</urlset>";
// حفظ خريطة الموقع في الملف (الملف النهائي)
file_put_contents($finalSitemapPath, $xmlFinal);
// عرض رسالة النجاح (يظهر أنه تم إنشاء الملف النهائي)
echo $successMessage;
?>
<hr>
<p style="margin-top: 20px">
<!-- قم بتعيين اسم الملف لبرنامج PHP هذا في العلامة <a>. الامتداد هو ".php" -->
<a href="اسم الملف لهذا البرنامج.php" style="margin-left: 20px; text-decoration: none;"><i class="fa-solid fa-check" style="color: #005eff;"></i> إعادة إنشاء "ملف XML" <i class="fa-solid fa-rotate fa-spin fa-2x" style="color:crimson"></i>[إعادة تحميل الصفحة]</a>
</p>
<p>
<!-- افتح "ملف XML" الذي تم إنشاؤه في المتصفح -->
<a href='<?php echo '/' . $finalSitemapFilename; ?>' target='_blank' style='margin-left: 20px; text-decoration: none;'><i class="fa-solid fa-check" style="color: #005eff;"></i> افتح "ملف XML" في المتصفح <i class="fa-solid fa-chalkboard-user fa-beat-fade fa-2x" style="color:green"></i>[علامة تبويب منفصلة]</a>
<div style="margin-left: 30px;font-size: 12px;color: gray">*إذا كان حجم الملف كبيرًا، فقد لا تتمكن من فتحه باستخدام متصفحك. إذا لم تتمكن من فتحه في متصفحك، يرجى تنزيل الملف ".xml" من خادم الويب والتحقق منه.</div>
</p>
<hr>
<!-- تأكيد إضافة/تحديث خريطة موقع "Google". -->
<p>
<!-- قم بتعيين عنوان URL الخاص بك في العلامة <a> -->
<a href="https://search.google.com/search-console/sitemaps?resource_id=عنوان URL الخاص بك" target="_blank" style="margin-left: 20px; text-decoration: none;"> <i class="fa-solid fa-check" style="color: #005eff;"></i>「<strong>Google</strong>」تأكيد إضافة/تحديث خريطة الموقع <i class="fa-solid fa-arrow-up-from-bracket fa-bounce fa-2x" style="color: #db0016;"></i></a>
</p>
<!-- 「Google Search Console」 -->
<p>
<!-- <a>قم بتعيين عنوان URL لصفحة "خريطة الموقع" الخاصة بـ Google Search Console التي قمت بتسجيلها في العلامة. -->
<a href="https://search.google.com/search-console?resource_id=عنوان URL الخاص بك" target="_blank" style="margin-left: 20px; text-decoration: none;"><i class="fa-solid fa-check" style="color: #005eff;"></i>「<strong>Google Search Console</strong>」 <i class="fa-solid fa-up-right-from-square fa-beat fa-2x" style="color: blue"></i></a>
<div style="font-size: 13px; margin: 0 40px">*من المفترض أنك قمت بالتسجيل في "Google Search Console".</div>
</p>
<hr>
<!-- 「Bing」تأكيد إعادة إرسال/تحديث خريطة الموقع -->
<p>
<!-- قم بتعيين عنوان URL لصفحة Bing "أدوات مشرفي المواقع" التي قمت بتسجيلها واسم ملف XML الذي قمت بتعيينه في العلامة <a>. يتطابق اسم الملف مع اسم الملف المعين في "$sitemapFilename" -->
<a href="https://www.bing.com/webmasters/sitemaps?siteUrl=عنوان URL الخاص بك/&sitemap=عنوان URL الخاص بك/sitemap.xml" target="_blank" style="margin-left: 20px; text-decoration: none;"> <i class="fa-solid fa-check" style="color: #005eff;"></i>「<strong>Bing</strong>」تأكيد إعادة إرسال/تحديث خريطة الموقع <i class="fa-solid fa-arrow-up-from-bracket fa-bounce fa-2x" style="color: #db0016;"></i></a>
</p>
<!-- 「Bing webmaster Tools」 -->
<p>
<!-- قم بتعيين عنوان URL لصفحة Bing "أدوات مشرفي المواقع" التي قمت بتسجيلها في العلامة <a>. -->
<a href="https://www.bing.com/webmasters/home?siteUrl=عنوان URL الخاص بك" target="_blank" style="margin-left: 20px; text-decoration: none;">
<i class="fa-solid fa-check" style="color: #005eff;"></i>「<strong>Bing webmaster Tools</strong>」 <i class="fa-solid fa-up-right-from-square fa-beat fa-2x" style="color: blue"></i></a>
<div style="font-size: 13px; margin: 0 40px">*من المفترض أنك قمت بالتسجيل في "أدوات مشرفي المواقع Bing" أو تم ربطك بـ "Google Search Console".</div>
</p>
<hr>
<!-- اسم موقعك الخ. إذا كنت لا تريد تضمينه، يرجى حذفه. -->
<h3 align="center"><i class="fa-solid fa-house" style="color: crimson"></i> اسم موقعك الخ <i class="fa-solid fa-house" style="color: crimson"></i></h3>
<!-- لا تتردد في حذف -->
<h4 align="center"><a href="https://www.benricho.org/" target="_blank" style="text-decoration: none;"><i class="fa-solid fa-house" style="color: blue"></i> みんなの知識 ちょっと便利帳 <i class="fa-solid fa-house" style="color: blue"></i></h4>
</body>
</html>