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()));
+ }
+}
+?>