<!DOCTYPE html>
<html lang="zh-cmn-Hant">
<head>
<meta charset="UTF-8">
<title>XML網站地圖產生PHP程式</title>
<meta name="robots" content="NOINDEX,NOFOLLOW">
<!-- 載入 Free Icon Fonts - 如果不使用,可以刪除 -->
<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部分。 XML檔從 "<?xml version="1.0" encoding="UTF-8"?>" 到 "</urlset>"。 </li>
</ul>
</div>
<hr>
<?php
//************************************************
// XML網站地圖產生PHP程式
// XML Sitemap Generation PHP Program
// 程式提供:大家的知識 便利小冊子
// Everyone's Knowledge A Little Useful Book
// Minna no Chishiki Chotto Benricho
// みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/sitemapgenerator/
/// 發佈日期:2024年1月3日
//************************************************
// Web伺服器的文檔根目錄。 自動獲取
$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']
// 元素 always:每次造訪都更新,hourly:每小時更新,daily:每天更新,weekly:每週更新,monthly:每月更新,yearly:每年更新,never:不更新
$changefreqValues = ['適用於您自己的網站的元素'];
// 頁面優先權
// ※ 在Google中忽略・不推薦。 被認為是“請勿加值”
// 取得 priority(1:獲取,2:不獲取)
$getPriority = 2;
// 網站地圖產生訊息
$successMessage = "<p>・ 網站地圖XML檔案已產生。<br>・ Sitemap XML file has been generated.</p><p>・以\"{$finalSitemapFilename}\"的形式保存在遠端伺服器的 根目錄下。<br>・出於安全考慮,請刪除遠端伺服器上的程式檔案。</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(協調世界時)設定 - 在網站地圖XML的<lastmod>元素中,通常建議使用UTC(協調世界時)
$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>";
}
// 依照深度取得 priority(最終檔案用)
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;
}
///// 取得檔案的最後修改日期 - 在網站地圖XML的<lastmod>元素中,通常建議使用UTC(協調世界時)
// 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); // 隱藏錯誤
$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>
<!-- “Google”網站地圖的新增與更新確認 -->
<hr>
<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>
<!-- 將自己在Google Search Console中註冊的「網站地圖」頁面的網址設定為<a>標籤 -->
<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>
<!-- “Bing”網站地圖的重新提交和更新確認 -->
<p>
<!-- 將自己在Bing的「Webmaster Tools」頁面的URL和設定的XML檔名設定為<a>標籤。 檔案名稱應與「$sitemapFilename」中設定的檔案名稱相符 -->
<a href="https://www.bing.com/webmasters/sitemaps?siteUrl=您的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>
<!-- 將自己在Bing的「Webmaster Tools」頁面的URL設定為<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 Webmaster Tools」的註冊或與「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>