base_dir = $cfg['main_dir'];
$this->base_url = $cfg['main_url'];
$this->sitemap_folder = $sitemap_folder;
$this->sitemap_name = $sitemap_name;
$this->sitemap_uri = $sitemap_folder . "/" . $sitemap_name;
$this->sitemap_type = $sitemap_type;
$this->sitemap_increment = 1;
// Check if the sitemap folder exists
if (!is_dir($this->sitemap_folder)) {
// Create a sitemap folder
mkdir($this->sitemap_folder) or die('Unable to create sitemap folder: ' . $this->sitemap_folder);
}
// Check if the core exists
if (!file_exists($sitemap_folder . "/core.xml")) {
// Create the core
$this->create_core($sitemap_folder);
}
$this->sitemap_uri = $this->sitemap_folder . '/' . $this->current_sitemap();
// Check if the sitemap exists
if (!file_exists($this->sitemap_uri . ".xml")) {
// Create the sitemap
$this->create_sitemap($this->sitemap_uri);
}
}
/*
* Creates a sitemap based on the given URI
* @param string $sitemap_uri
* @return boolean
*/
private function create_sitemap($sitemap_uri)
{
$sitemap_uri .= ".xml";
// Create the sitemap
$open_sitemap_folder = fopen($sitemap_uri, "w");
if (!$open_sitemap_folder) {
// if there was an error
return false;
}
// Close the file
fclose($open_sitemap_folder);
// Create the "empty" sitemap
$create_xml = new SimpleXMLElement('');
$create_xml->addAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
switch ($this->sitemap_type) {
case 'image':
$create_xml->addAttribute("xmlns:image", "http://www.google.com/schemas/sitemap-image/1.1", '');
$create_xml->asXML($sitemap_uri);
file_put_contents($sitemap_uri, preg_replace('/xmlns:xmlns=""\s?/', '', file_get_contents($sitemap_uri)));
break;
case "video":
case "short":
$create_xml->addAttribute("xmlns:video", "http://www.google.com/schemas/sitemap-video/1.1", '');
$create_xml->asXML($sitemap_uri);
file_put_contents($sitemap_uri, preg_replace('/xmlns:xmlns=""\s?/', '', file_get_contents($sitemap_uri)));
break;
default:
$create_xml->asXML($sitemap_uri);
break;
}
$core_config = array(
'type' => 'sitemap',
'params' => array(
'loc' => str_replace($this->base_dir, $this->base_url, $sitemap_uri),
),
);
$this->add_core($core_config);
// Show that it was success
return true;
}
/*
* Returns name of current sitemap
* @param int $offset
* @return string
*/
private function current_sitemap($offset = 0)
{
// count the number of sitemaps in the folder with the same name
$folder_data = opendir($this->sitemap_folder);
// create an empty array
$sitemap_folder_content = array();
while (false !== ($entry = readdir($folder_data))) {
$sitemap_folder_content[] = $entry;
}
foreach ($sitemap_folder_content as $sitemap) {
$result = strpos($sitemap, $this->sitemap_name);
if ($result !== false) {
$offset++;
}
}
if ($offset == 0) {
$offset++;
}
return $this->sitemap_name . "_" . $offset;
}
/*
* Returns name of current sitemap when incremented by one
* @param int $offset
* @return string
*/
private function increment_sitemap($offset = 1)
{
$current = $this->current_sitemap();
preg_match('/(.+)' . '_' . '([0-9]+)$/', $current, $match);
return isset($match[2]) ? $match[1] . '_' . ($match[2] + 1) : $this->sitemap_name . '_' . $offset;
}
/*
* Adds a node to a sitemap
* @param array $config
* @return boolean
*/
public function add_node($config)
{
// Check the # of nodes in the sitemap
if (strpos($this->sitemap_uri, '.xml') !== false) {
$url = $this->sitemap_uri;
} else {
$url = $this->sitemap_uri . '.xml';
}
$xml = simplexml_load_file($url);
$node_count = $xml->count();
// Count the nodes
if ($node_count > 999) {
$this->sitemap_uri = $this->sitemap_folder . '/' . $this->increment_sitemap();
// Create the sitemap
if (!$this->create_sitemap($this->sitemap_uri)) {
return false;
}
}
//Create a node
$node = $xml->addChild($config['type']);
// //Set the location of the URL
foreach ($config['params'] as $param => $node_value) {
if (is_array($node_value)) {
$newNode = $node->addChild("Test:" . $param . ":" . $param);
foreach ($node_value as $key => $namespace_value) {
if (substr($key, 0, 3) == 'tag') {$key = 'tag';}
$newNode->addChild("Test:" . $param . ":" . $key, $namespace_value);
}
} else {
$node->addChild($param, $node_value);
}
}
//Save the XML
$xml->asXML($url);
return true;
}
/*
* Creates a core sitemap in the specified sitemap folder
* @param string $sitemap_folder
* @return boolean
*/
private function create_core($sitemap_folder)
{
$core_uri = $sitemap_folder . "/core.xml";
// Create the sitemap
$open_map = fopen($core_uri, "w");
if (!$open_map) {
// if there was an error
return false;
}
// Close the file
fclose($open_map);
// Create the "empty" sitemap
$create_xml = new SimpleXMLElement('');
$create_xml->addAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
$create_xml->asXML($core_uri);
// Show that it was success
return true;
}
/*
* Adds a sitemap node in the core sitemap
* @param array $config
* @return boolean
*/
private function add_core($config)
{
// Check the # of nodes in the sitemap
$url = $this->sitemap_folder . '/core.xml';
$xml = simplexml_load_file($url);
//Create a node
$node = $xml->addChild($config['type']);
// //Set the location of the URL
foreach ($config['params'] as $param => $value) {
$node->addChild($param, $value);
}
//Save the XML
$xml->asXML($url);
return true;
}
}