05-03-1394، 08:08 ب.ظ
<?php /** * Automated XML Site Map Generator * @author Mohammad Mostafa Shahreki * @copyright All rights reserved for barnamenevis * @link http://www.ncis.ir */ class SiteMap { /** * @var array Ignore the file/folder if these words appear anywhere in the name */ private static $alwaysIgnore; /** * @var array Allowed extensions to consider in sitemap */ private static $extensions; /** * @var array The script will not enter these folders */ private static $ignoreDirs; /** * @var array These files will not be linked in the sitemap */ private static $ignoreFiles; /** * @var string Where is the root of the site path */ private static $root; /** * @var string The Url of the site - the last '/' is needed */ private static $url; /** * This function extracts pages * @param string $currentDir The current direcotry * @return array The array of extracted pages */ private static function getPages($currentDir) { $pages = array(); chdir($currentDir); $ext = '{*.' . implode(',*.', self::$extensions) . '}'; $files = glob($ext, GLOB_BRACE); foreach($files as $file) { $flag = true; if(in_array($file, self::$ignoreFiles)) { $flag = false; } else { foreach(self::$alwaysIgnore as $ignore) { if(strpos($file, $ignore) !== false) { $flag = false; } } } if($flag) { $pages[] = self::$url . ($currentDir != self::$root ? $currentDir . '/' : '') . $file; } } $dirs = glob('{*,*.*}', GLOB_BRACE | GLOB_ONLYDIR); foreach($dirs as $dir) { $flag = true; if(in_array($dir, self::$ignoreDirs)) { $flag = false; } else { foreach(self::$alwaysIgnore as $ignore) { if(strpos($dir, $ignore) !== false) { $flag = false; } } } if($flag) { $cwd = getcwd(); $pages = array_merge($pages, self::getPages(str_replace('\', '/', $dir))); chdir($cwd); } } return $pages; } /** * Generate site map and store it in sitemap.xml in the site root folder * @param string $url The main URL of the site * @param string $root (Optional) The root path of the site (if not specified, the current directory of this file is used) * @param string $extensions (Optional) The comma separated string of extensions to index in the site map * @param string $alwaysIgnore (Optional) The current processing file/folder is ignored if contains any of words of this comma separated string * @param string $ignoreDirs (Optional) The directories mentioned in this comma separated string will not be scanned * @param string $ignoreFiles (Optional) The files mentioned in this comma separated string will be ommited from the site map */ public static function Generate($url, $root = NULL, $extensions = NULL, $alwaysIgnore = NULL, $ignoreDirs = NULL, $ignoreFiles = NULL) { self::$url = trim($url, '/') . '/'; self::$root = ($root === NULL ? str_replace('\', '/', dirname(__FILE__)) : $root); self::$extensions = ($extensions === NULL ? array('htm', 'html', 'php') : explode(',', $extensions)); self::$alwaysIgnore = ($alwaysIgnore === NULL ? array('.inc', 'admin', 'image') : explode(',', $alwaysIgnore)); self::$ignoreDirs = ($ignoreDirs === NULL ? array('admin', 'css', 'images', 'inc', 'js', 'lib', 'styles', 'uploads') : explode(',', $ignoreDirs)); self::$ignoreFiles = ($ignoreFiles === NULL ? array('404.html', 'config.php', 'include.inc') : explode(',', $ignoreFiles)); $cwd = getcwd(); $all_pages = self::getPages(self::$root); chdir($cwd); $output = ''; $output .= '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL; $output .= '<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">' . PHP_EOL; //Process the files foreach ($all_pages as $link) { //Find the modified time. if(preg_match('#index.w{3,4}$#', $link)) { $link = preg_replace('#index.w{3,4}$#', '', $link); } $output .= ' <url>' . PHP_EOL; $output .= ' <loc>' . htmlentities($link, ENT_QUOTES, 'utf-8') . '</loc>' . PHP_EOL; $output .= ' </url>' . PHP_EOL; } $output .= '</urlset>' . PHP_EOL; file_put_contents(self::$root . '/sitemap.xml', $output); @chmod(self::$root . '/sitemap.xml', 0644); } } ?>
مثالی از نحوه استفاده:
<?php require_once 'class.sitemap.php'; SiteMap::Generate('http://localhost/sitemap', NULL, 'php', 'admin', 'languages,plugins,upgrade,uploads,wp-includes', 'wp-cron.php'); ?>
یا میتونید توی همون فایل کلاس، این کد رو به انتهاش اضافه کنید:
SiteMap::Generate('http://localhost/sitemap', NULL, 'php', 'admin', 'languages,plugins,upgrade,uploads,wp-includes', 'wp-cron.php');
و توسط Cron Jobs (در فواصل زمانی مشخص) یا توی اسکریپتتون (هرموقع مطالب تغییر کرد) فایل رو ضمیمه کنید.
نکته:
این اسکریپت ازروی فایلهای سایتتون SiteMap رو میسازه. اگه سایتتون Dynamic هست و مطالب با روشهایی مثل Get و... ازطریق یک صفحه خاص استخراج میشن، بهترین و ساده ترین کار، استخراج لینکهای اطلاعات از دیتابیس و تولید فایل SiteMap.xml هست.