diff --git a/ext/sitemap/main.php b/ext/sitemap/main.php index e481510f..37f494c0 100644 --- a/ext/sitemap/main.php +++ b/ext/sitemap/main.php @@ -1,54 +1,135 @@ - - * License: GPLv2 - * Description: Adds sitemap.xml on request. - * Documentation: - */ - -class XMLSitemap extends Extension { - public function onPageRequest(PageRequestEvent $event) { - if($event->page_matches("sitemap.xml")) { - $images = Image::find_images(0, 50, array()); - $this->do_xml($images); - } - } - - private function do_xml(/*array(Image)*/ $images) { - global $page; - $page->set_mode("data"); - $page->set_type("application/xml"); - - $data = ""; - foreach($images as $image) { - $link = make_http(make_link("post/view/{$image->id}")); - $posted = date("Y-m-d", $image->posted_timestamp); - - $data .= " - - $link - $posted - monthly - 0.8 - - "; - } - - $base_href = make_http(make_link("post/list")); - - $xml = "<"."?xml version=\"1.0\" encoding=\"utf-8\"?"."> - - - $base_href - 2009-01-01 - monthly - 1 - - $data - - "; - $page->set_data($xml); - } -} -?> +, Drudex Software set_default_string("last_sitemap", // set initial date to a year ago + date($this->time_structure, strtotime('-1 year',time()))); + } + + public function onPageRequest(PageRequestEvent $event) { + global $database, $config; + if($event->page_matches("sitemap.xml")) + { + // creates default value + $config->set_default_string("last_sitemap", // set initial date to a year ago + date($this->time_structure, strtotime('-1 year',time()))); + + // remakes sitemap if needed + $lastsitemaptime = date($this->time_structure, $config->get_string("last_sitemap")); + $sitemap_creation_allowed_time = date($this->time_structure, strtotime("+$this->sitemap_creation_interval hours", $lastsitemaptime)); + if ($sitemap_creation_allowed_time < time() || // sitemap is allowed to reset + !file_exists($_SERVER["DOCUMENT_ROOT"]."/sitemap.xml")) // or sitemap can be remade + { + // add index + $index[0] = $base_href = make_http(make_link("post/list")); + $this->add_sitemap_queue($index, "weekly", "1"); + + /* --- Add 20 most used tags --- */ + $popular_tags = $database->get_all("SELECT tag, count FROM tags ORDER BY `count` DESC LIMIT 0,20"); + foreach($popular_tags as $arrayid => $tag) { + $tag = $tag['tag']; + // create url from tags (tagme ignored) + if ($tag != "tagme") + $popular_tags[$arrayid] = "post/list/$tag/"; + } + $this->add_sitemap_queue($popular_tags, "monthly", "0.9" /* not sure how to deal with date here */); + + /* --- Add latest images to sitemap with higher priority --- */ + $latestimages = Image::find_images(0, 50, array()); + $latestimages_urllist = array(); + foreach($latestimages as $arrayid => $image) + // create url from image id's + $latestimages_urllist[$arrayid] = "post/view/$image->id"; + $this->add_sitemap_queue($latestimages_urllist, "monthly", "0.8", date("Y-m-d", $image->posted_timestamp)); + + /* --- Add other tags --- */ + $other_tags = $database->get_all("SELECT tag, count FROM tags ORDER BY `count` DESC LIMIT 21,10000000"); + foreach($other_tags as $arrayid => $tag) { + $tag = $tag['tag']; + // create url from tags (tagme ignored) + if ($tag != "tagme") + $other_tags[$arrayid] = "post/list/$tag/"; + } + $this->add_sitemap_queue($other_tags, "monthly", "0.7" /* not sure how to deal with date here */); + + /* --- Add all other images to sitemap with lower priority --- */ + $otherimages = Image::find_images(51, 10000000, array()); + foreach($otherimages as $arrayid => $image) + // create url from image id's + $otherimages[$arrayid] = "post/view/$image->id"; + $this->add_sitemap_queue($otherimages, "monthly", "0.6", date("Y-m-d", $image->posted_timestamp)); + + // Creates the sitemap file + $this->create_sitemap(); + } + + /* --- Display page --- */ + // when sitemap is ok, display it from the file + $this->display_sitemap(); + } + } + + // Adds an array of urls to the sitemap with the given information + private function add_sitemap_queue(/*array(urls)*/ $urls, $changefreq="monthly", $priority="0.5", $date="2013-02-01") { + foreach($urls as $url) { + $link = make_http(make_link("$url")); + $this->sitemap_queue .= " + + $link + $date + $changefreq + $priority + "; + } + } + + // sets sitemap with entries in the queue + private function display_sitemap() + { + global $page; + $page->set_mode("data"); + $page->set_type("application/xml"); + + // read file + $filename = $_SERVER['DOCUMENT_ROOT']."/sitemap.xml"; + $xmlreader = fopen($filename, 'r') or die("can't open file"); + $xml = fread($xmlreader, filesize($filename)); + fclose($xmlreader); + + // sets + $page->set_data($xml); + } + + // creates the xml sitemap file from the queue + private function create_sitemap() + { + global $config; + + $xml = "<"."?xml version=\"1.0\" encoding=\"utf-8\"?"."> + + $this->sitemap_queue + "; + + $fh = fopen($_SERVER["DOCUMENT_ROOT"]."/sitemap.xml", 'w') or die("can't open file"); + fwrite($fh, $this->sitemap_queue); + fclose($fh); + + file_put_contents($_SERVER['DOCUMENT_ROOT']."/sitemap.xml", $xml); + $config->set_string("last_sitemap", date($this->time_structure, time())); + } +} +?>