diff --git a/e107_plugins/gsitemap/e_url.php b/e107_plugins/gsitemap/e_url.php
index bcd23ec67..482ce8020 100644
--- a/e107_plugins/gsitemap/e_url.php
+++ b/e107_plugins/gsitemap/e_url.php
@@ -42,6 +42,23 @@ class gsitemap_url // plugin-folder + '_url'
);
+ $addons = e107::getAddonConfig('e_gsitemap', 'gsitemap');
+
+ foreach($addons as $plug => $item)
+ {
+ foreach($item as $data )
+ {
+ $key = $plug.'-'.$data['function']; // eg. news-latest
+ $config[$key] = array(
+ 'alias' => $key,
+ 'regex' => '^'.$key.'-sitemap\.xml$', // matched against url, and if true, redirected to 'redirect' below.
+ 'sef' => $key.'-sitemap.xml', // used by e107::url(); to create a url from the db table.
+ 'redirect' => '{e_BASE}gsitemap.php?plug='.$plug.'&func='.$data['function'], // file-path of what to load when the regex returns true.
+
+ );
+ }
+
+ }
return $config;
diff --git a/e107_plugins/news/e_gsitemap.php b/e107_plugins/news/e_gsitemap.php
index 56170e363..821cf71a7 100644
--- a/e107_plugins/news/e_gsitemap.php
+++ b/e107_plugins/news/e_gsitemap.php
@@ -20,6 +20,40 @@ e107::coreLan('news');
class news_gsitemap
{
+
+ // Dynamically Generated Sitemap;
+ function config()
+ {
+ $config = array();
+
+ // Viewable from my-website.com/news-latest-sitemap.xml ie. plugin-folder + function + 'sitemap.xml'
+ $config[] = array(
+ 'name' => "Latest News Posts",
+ 'function' => "latest",
+ );
+
+ return $config;
+
+ }
+
+ private function getNewsPosts()
+ {
+ /* public, guests */
+ $userclass_list = "0,252";
+ $_t = time(); /* public, quests */
+
+ $query = "SELECT n.*, nc.category_name, nc.category_sef FROM #news AS n
+ LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id
+ WHERE n.news_class IN (". $userclass_list.") AND n.news_start < ".$_t." AND (n.news_end=0 || n.news_end>".time().") ORDER BY n.news_datestamp ASC ";
+
+ // $data = $sql->retrieve("news", "*", "news_class IN (" . $userclass_list . ") AND news_start < " . $_t . " ORDER BY news_datestamp ASC", true);
+
+ return e107::getDb()->retrieve($query,true);
+
+ }
+
+
+
function import()
{
$import = array();
@@ -41,16 +75,9 @@ class news_gsitemap
);
}
+ $data = $this->getNewsPosts();
- $query = "SELECT n.*, nc.category_name, nc.category_sef FROM #news AS n
- LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id
- WHERE n.news_class IN (". $userclass_list.") AND n.news_start < ".$_t." AND (n.news_end=0 || n.news_end>".time().") ORDER BY n.news_datestamp ASC ";
-
- // $data = $sql->retrieve("news", "*", "news_class IN (" . $userclass_list . ") AND news_start < " . $_t . " ORDER BY news_datestamp ASC", true);
-
- $data = $sql->retrieve($query,true);
-
foreach($data as $row)
{
$import[] = array(
@@ -66,6 +93,31 @@ class news_gsitemap
return $import;
}
+
+
+ /* Custom Function for dynamic sitemap of news posts */
+ function latest()
+ {
+ $data = $this->getNewsPosts();
+
+ $ret = [];
+
+ foreach($data as $row)
+ {
+ $ret[] = [
+ 'url' => $this->url('news', $row),
+ 'lastmod' => (int) $row['news_datestamp'],
+ 'freq' => 'always',
+ 'priority' => 0.7
+ ];
+ }
+
+ return $ret;
+
+ }
+
+
+
/**
* Used above and by gsitemap/e_event.php to update the URL when changed in news, pages etc.
*
diff --git a/gsitemap.php b/gsitemap.php
index 55944c5c3..a94c3472a 100644
--- a/gsitemap.php
+++ b/gsitemap.php
@@ -23,6 +23,105 @@ if(!e107::isInstalled('gsitemap'))
e107::lan('gsitemap');
+
+
+class gsitemap_xml
+{
+ function __construct()
+ {
+
+ $items = [];
+
+ // Gsitemap Addon.
+ if(!empty($_GET['plug']) && !empty($_GET['func']))
+ {
+ if(!e107::isInstalled($_GET['plug']))
+ {
+ exit;
+ }
+
+ $obj = e107::getAddon($_GET['plug'], 'e_gsitemap');
+ if($items = e107::callMethod($obj, $_GET['func']))
+ {
+ $this->renderXML($items);
+ }
+
+ }
+ else // From Gsitemap Database Table.
+ {
+ $this->renderXML([], 'gsitemap_');
+ }
+
+
+ }
+
+ /**
+ * @param $items
+ * @return void
+ */
+ function renderXML($items=array())
+ {
+ header('Content-type: application/xml', TRUE);
+ $xml = "
+ ";
+
+ if(empty($items))
+ {
+ $smArray = e107::getDb()->retrieve("gsitemap", "*", "gsitemap_active IN (".USERCLASS_LIST.") ORDER BY gsitemap_order ",true);
+ $xml .= $this->renderXMLItems($smArray);
+ }
+ else
+ {
+ $xml .= $this->renderXMLItems($items);
+ }
+
+
+ $xml .= "
+ ";
+
+ echo $xml;
+
+
+
+ }
+
+
+
+ function renderXMLItems($data, $prefix = '')
+ {
+ $tp = e107::getParser();
+
+ $xml = '';
+
+ foreach($data as $sm)
+ {
+ $url = $sm[$prefix.'url'];
+
+ if($url[0] === '/')
+ {
+ $url = ltrim($url, '/');
+ }
+
+ $loc = (strpos($url, 'http') === 0) ? $url : SITEURL.$tp->replaceConstants($url,true);
+ $xml .= "
+
+ ".$loc."
+ ".date('c', (int) $sm[$prefix.'lastmod'])."
+ ".$sm[$prefix.'freq']."
+ ".$sm[$prefix.'priority']."
+ ";
+ }
+
+ return $xml;
+
+ }
+
+}
+
+
+
+// HTML below.
+
if(e_QUERY == "show" || !empty($_GET['show']))
{
e107::canonical('gsitemap');
@@ -30,7 +129,9 @@ if(e_QUERY == "show" || !empty($_GET['show']))
require_once(HEADERF);
- $nfArray = $sql ->retrieve("gsitemap", "*", "gsitemap_active IN (".USERCLASS_LIST.") ORDER BY gsitemap_order ",true);
+ $nfArray = e107::getDb()->retrieve("gsitemap", "*", "gsitemap_active IN (".USERCLASS_LIST.") ORDER BY gsitemap_order ",true);
+
+ $tp = e107::getParser();
if(deftrue('BOOTSTRAP'))
{
@@ -54,45 +155,13 @@ if(e_QUERY == "show" || !empty($_GET['show']))
}
$text .= "";
- $ns -> tablerender(GSLAN_Name."", $text);
+ e107::getRender() -> tablerender(GSLAN_Name, $text);
require_once(FOOTERF);
exit;
}
-header('Content-type: application/xml', TRUE);
-$xml = "
-";
-
-$smArray = e107::getDb()->retrieve("gsitemap", "*", "gsitemap_active IN (".USERCLASS_LIST.") ORDER BY gsitemap_order ",true);
-
-foreach($smArray as $sm)
-{
- if($sm['gsitemap_url'][0] == '/') $sm['gsitemap_url'] = ltrim($sm['gsitemap_url'], '/');
- $loc = (substr($sm['gsitemap_url'],0,4)== "http")? $sm['gsitemap_url'] : SITEURL.$tp->replaceConstants($sm['gsitemap_url'],TRUE);
- $xml .= "
-
- ".$loc."
- ".get_iso_8601_date($sm['gsitemap_lastmod'])."
- ".$sm['gsitemap_freq']."
- ".$sm['gsitemap_priority']."
- ";
-}
-
-$xml .= "
-";
-
-echo $xml;
-
-/* ungu at terong dot com */
-function get_iso_8601_date($int_date)
-{
- $date_mod = date('Y-m-d\TH:i:s', $int_date);
- $pre_timezone = date('O', $int_date);
- $time_zone = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2);
- $date_mod .= $time_zone;
- return $date_mod;
-}
+new gsitemap_xml;