name = 'gsitemap'; $this->tab = 'seo'; $this->version = '3.0.5'; $this->author = 'PrestaShop'; $this->need_instance = 0; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Google sitemap'); $this->description = $this->l('Generate your Google sitemap file'); /* @Override */ $this->type_array = array('home', 'meta', 'product', 'category', 'manufacturer', 'supplier', 'cms', 'module'); $metas = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'meta` ORDER BY `id_meta` ASC'); $disabled_metas = explode(',', Configuration::get('GSITEMAP_DISABLE_LINKS')); foreach ($metas as $meta) if (in_array($meta['id_meta'], $disabled_metas)) if (($key = array_search($meta['page'], $this->type_array)) !== false) unset($this->type_array[$key]); /* @Override */ $this->metas_plus = array('cmspscategory', 'cmspspost', 'cmspsedito'); } /* @Override */ public function getContent(){ /* Store the posted parameters and generate a new Google Sitemap files for the current Shop */ if (Tools::isSubmit('SubmitGsitemap')) { Configuration::updateValue('GSITEMAP_FREQUENCY', pSQL(Tools::getValue('gsitemap_frequency'))); Configuration::updateValue('GSITEMAP_INDEX_CHECK', ''); Configuration::updateValue('GSITEMAP_CHECK_IMAGE_FILE', pSQL(Tools::getValue('gsitemap_check_image_file'))); $meta = ''; if (Tools::getValue('gsitemap_meta')) $meta .= implode(', ', Tools::getValue('gsitemap_meta')); Configuration::updateValue('GSITEMAP_DISABLE_LINKS', $meta); $this->emptySitemap(); $this->createSitemap(); } elseif (Tools::isSubmit('SubmitBlogGsitemap')) { Configuration::updateValue('GSITEMAP_FREQUENCY', pSQL(Tools::getValue('gsitemap_frequency'))); $this->type_array = array('cmspscategory', 'cmspspost', 'cmspsedito'); $this->createSpecificSitemap(2); } elseif (Tools::isSubmit('SubmitImgGsitemap')) { Configuration::updateValue('GSITEMAP_FREQUENCY', pSQL(Tools::getValue('gsitemap_frequency'))); } /* if no posted form and the variable [continue] is found in the HTTP request variable keep creating sitemap */ elseif (Tools::getValue('continue')) $this->createSitemap(); /* Empty the Shop domain cache */ if (method_exists('ShopUrl', 'resetMainDomainCache')) ShopUrl::resetMainDomainCache(); $this->context->smarty->assign( array( 'gsitemap_form' => './index.php?tab=AdminModules&configure=gsitemap&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module='.$this->tab.'&module_name=gsitemap', 'gsitemap_cron' => _PS_BASE_URL_._MODULE_DIR_.'gsitemap/gsitemap-cron.php?token='.substr(Tools::encrypt('gsitemap/cron'), 0, 10).'&id_shop='.$this->context->shop->id, 'gsitemap_feed_exists' => file_exists($this->normalizeDirectory(_PS_ROOT_DIR_).'index_sitemap.xml'), 'gsitemap_last_export' => Configuration::get('GSITEMAP_LAST_EXPORT'), 'gsitemap_frequency' => Configuration::get('GSITEMAP_FREQUENCY'), 'gsitemap_store_url' => 'http://'.Tools::getShopDomain(false, true).__PS_BASE_URI__, 'gsitemap_links' => Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'gsitemap_sitemap` WHERE id_shop = '.(int)$this->context->shop->id), 'store_metas' => Meta::getMetasByIdLang((int)$this->context->cookie->id_lang), 'gsitemap_disable_metas' => explode(',', Configuration::get('GSITEMAP_DISABLE_LINKS')), 'gsitemap_disable_metas_plus' => explode(',', Configuration::get('GSITEMAP_DISABLE_LINKS_PLUS')), 'gsitemap_customer_limit' => array( 'max_exec_time' => (int)ini_get('max_execution_time'), 'memory_limit' => intval(ini_get('memory_limit')) ), 'prestashop_ssl' => Configuration::get('PS_SSL_ENABLED'), 'gsitemap_check_image_file' => Configuration::get('GSITEMAP_CHECK_IMAGE_FILE'), 'shop' => $this->context->shop ) ); return $this->display(__FILE__, 'views/templates/admin/configuration.tpl'); } public function createSpecificSitemap($index, $id_shop = 0) { if (@fopen($this->normalizeDirectory(_PS_ROOT_DIR_).'/test.txt', 'w') == false) { $this->context->smarty->assign('google_maps_error', $this->l('An error occured while trying to check your file permissions. Please adjust your permissions to allow PrestaShop to write a file in your root directory.')); return false; } else @unlink($this->normalizeDirectory(_PS_ROOT_DIR_).'test.txt'); if ($id_shop != 0) $this->context->shop = new Shop((int)$id_shop); $type = Tools::getValue('type') ? Tools::getValue('type') : ''; $languages = Language::getLanguages(true, $id_shop); $lang_stop = Tools::getValue('lang') ? true : false; $id_obj = Tools::getValue('id') ? (int)Tools::getValue('id') : 0; foreach ($languages as $lang) { $i = 0; // $index = (Tools::getValue('index') && Tools::getValue('lang') == $lang['iso_code']) ? (int)Tools::getValue('index') : 0; if ($lang_stop && $lang['iso_code'] != Tools::getValue('lang')) continue; elseif ($lang_stop && $lang['iso_code'] == Tools::getValue('lang')) $lang_stop = false; $link_sitemap = array(); foreach ($this->metas_plus as $type_val) { if ($type == '' || $type == $type_val) { $function = '_get'.ucfirst($type_val).'Link'; if (!$this->$function($link_sitemap, $lang, $index, $i, $id_obj)) return false; $type = ''; $id_obj = 0; } } $this->_recursiveSitemapCreator($link_sitemap, $lang['iso_code'], $index); $page = ''; $index = 0; } $this->_createIndexSitemap(); Configuration::updateValue('GSITEMAP_LAST_EXPORT', date('r')); switch ($index) { case 1: Tools::file_get_contents('http://www.google.com/webmasters/sitemaps/ping?sitemap='.urlencode('http'.(Configuration::get('PS_SSL_ENABLED') ? 's' : '').'://'.Tools::getShopDomain(false, true).$this->context->shop->physical_uri.$this->context->shop->virtual_uri.$this->context->shop->id.'_blog_sitemap.xml')); break; case 2: Tools::file_get_contents('http://www.google.com/webmasters/sitemaps/ping?sitemap='.urlencode('http'.(Configuration::get('PS_SSL_ENABLED') ? 's' : '').'://'.Tools::getShopDomain(false, true).$this->context->shop->physical_uri.$this->context->shop->virtual_uri.$this->context->shop->id.'_img_sitemap.xml')); break; default: break; } /*if ($this->cron) die();*/ if (!$this->cron){ header('location: ./index.php?tab=AdminModules&configure=gsitemap&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module='.$this->tab.'&module_name=gsitemap&validation'); die(); } } /** * @param array $link_sitemap contain all the links for the Google Sitemap file to be generated * @param string $lang the language of link to add * @param int $index the index of the current Google Sitemap file * * @return bool */ private function _recursiveSitemapCreator($link_sitemap, $lang, &$index) { if (!count($link_sitemap)) return false; $sitemap_link = $this->context->shop->id.'_'.$lang.'_'.$index.'_sitemap.xml'; $write_fd = fopen($this->normalizeDirectory(_PS_ROOT_DIR_).$sitemap_link, 'w'); fwrite($write_fd, ''."\r\n".''."\r\n"); foreach ($link_sitemap as $key => $file) { fwrite($write_fd, ''."\r\n"); $lastmod = (isset($file['lastmod']) && !empty($file['lastmod'])) ? date('c', strtotime($file['lastmod'])) : null; $this->_addSitemapNode($write_fd, htmlspecialchars(strip_tags($file['link'])), $this->_getPriorityPage($file['page']), Configuration::get('GSITEMAP_FREQUENCY'), $lastmod); if ($file['image']) { $this->_addSitemapNodeImage( $write_fd, htmlspecialchars(strip_tags($file['image']['link'])), isset($file['image']['title_img']) ? htmlspecialchars( str_replace( array( "\r\n", "\r", "\n" ), '', strip_tags($file['image']['title_img']) ) ) : '', isset($file['image']['caption']) ? htmlspecialchars( str_replace( array( "\r\n", "\r", "\n" ), '', strip_tags($file['image']['caption']) ) ) : '' ); } fwrite($write_fd, ''."\r\n"); } fwrite($write_fd, ''."\r\n"); fclose($write_fd); $this->_saveSitemapLink($sitemap_link); $index++; return true; } /** * return the priority value set in the configuration parameters * * @param string $page * * @return float|string|bool */ private function _getPriorityPage($page) { return Configuration::get('GSITEMAP_PRIORITY_'.Tools::strtoupper($page)) ? Configuration::get('GSITEMAP_PRIORITY_'.Tools::strtoupper($page)) : 0.1; } /** * Add a new line to the sitemap file * * @param resource $fd file system object resource * @param string $loc string the URL of the object page * @param string $priority * @param string $change_freq * @param int $last_mod the last modification date/time as a timestamp */ private function _addSitemapNode($fd, $loc, $priority, $change_freq, $last_mod = null) { fwrite($fd, ''.(Configuration::get('PS_REWRITING_SETTINGS') ? '' : $loc).''."\r\n".''.number_format($priority, 1, '.', '').''."\r\n".($last_mod ? ''.date('c', strtotime($last_mod)).'' : '')."\r\n".''.$change_freq.''."\r\n"); } private function _addSitemapNodeImage($fd, $link, $title, $caption) { fwrite($fd, ''."\r\n".''.(Configuration::get('PS_REWRITING_SETTINGS') ? '' : $link).''."\r\n".''."\r\n".''."\r\n".''."\r\n"); } /** * Create the index file for all generated sitemaps * @return boolean */ private function _createIndexSitemap() { $sitemaps = Db::getInstance()->ExecuteS('SELECT `link` FROM `'._DB_PREFIX_.'gsitemap_sitemap` WHERE id_shop = '.$this->context->shop->id); if (!$sitemaps) return false; $xml = ''; $xml_feed = new SimpleXMLElement($xml); foreach ($sitemaps as $link) { $sitemap = $xml_feed->addChild('sitemap'); $sitemap->addChild('loc', 'http'.(Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE') ? 's' : '').'://'.Tools::getShopDomain(false, true).__PS_BASE_URI__.$link['link']); $sitemap->addChild('lastmod', date('c')); } file_put_contents($this->normalizeDirectory(_PS_ROOT_DIR_).$this->context->shop->id.'_index_sitemap.xml', $xml_feed->asXML()); return true; } private function tableColumnExists($table_name, $column = null) { if (array_key_exists($table_name, $this->sql_checks)) if (!empty($column) && array_key_exists($column, $this->sql_checks[$table_name])) return $this->sql_checks[$table_name][$column]; else return $this->sql_checks[$table_name]; $table = Db::getInstance()->ExecuteS('SHOW TABLES LIKE \''.$table_name.'\''); if (empty($column)) if (count($table) < 1) return $this->sql_checks[$table_name] = false; else $this->sql_checks[$table_name] = true; else { $table = Db::getInstance()->ExecuteS('SELECT * FROM `'.$table_name.'` LIMIT 1'); return $this->sql_checks[$table_name][$column] = array_key_exists($column, current($table)); } return true; } /** * Store the generated Sitemap file to the database * * @param string $sitemap the name of the generated Google Sitemap file * * @return bool */ private function _saveSitemapLink($sitemap) { if ($sitemap) return Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'gsitemap_sitemap` (`link`, id_shop) VALUES (\''.pSQL($sitemap).'\', '.(int)$this->context->shop->id.')'); return false; } /** * Hydrate $link_sitemap with cmspscategories link * * @param array $link_sitemap contain all the links for the Google Sitemap file to be generated * @param string $lang language of link to add * @param int $index index of the current Google Sitemap file * @param int $i count of elements added to sitemap main array * @param int $id_category cmspscategories object identifier * * @return bool */ protected function _getCmspscategoryLink(&$link_sitemap, $lang, &$index, &$i, $id_category = 0) { if(!class_exists('CmsPS')) { require _PS_MODULE_DIR_.'cmsps/cmsps.php'; } $link = new Link(); if (method_exists('ShopUrl', 'resetMainDomainCache')) ShopUrl::resetMainDomainCache(); $categories_id = Db::getInstance()->ExecuteS( 'SELECT c.`id_category` FROM `'._DB_PREFIX_.'cmsps_categories` c LEFT JOIN `'._DB_PREFIX_.'cmsps_categories_shop` ls ON c.`id_category` = ls.`id_category` WHERE c.`id_category`>'.(int)$id_category.' AND ls.`id_shop` = '.(int)$this->context->shop->id.' ORDER BY c.`id_category` ASC' ); foreach ($categories_id as $category_id) { $category = new CmsPsCategory((int)$category_id['id_category'], (int)$lang['id_lang']); $url = $link->getCategoryCmsLink((int)$category->id); if(file_exists(_CMS_CAT_IMG_DIR_.(int)$category->id.'.jpg')) { $image = _CMS_CAT_IMG_DIR_.(int)$category->id.'.jpg'; $image_url = ImageManager::thumbnail($image, 'cmsps_categories_'.(int)(int)$category->id.'.jpg', 350, 'jpg', true, true); } $file_headers = (Configuration::get('GSITEMAP_CHECK_IMAGE_FILE')) ? @get_headers($image_url) : true; $image_category = array(); if (isset($image_url) && ($file_headers[0] != 'HTTP/1.1 404 Not Found' || $file_headers === true)) $image_category = array( 'title_img' => htmlspecialchars(strip_tags($category->title)), 'link' => $image_url ); if (!$this->_addLinkToSitemap( $link_sitemap, array( 'type' => 'cmspscategory', 'page' => 'categorycms', 'lastmod' => $category->date_upd, 'link' => $url, 'image' => $image_category ), $lang['iso_code'], $index, $i, (int)$category->id )) return false; unset($image_url); } return true; } /** * Hydrate $link_sitemap with cmspsposts link * * @param array $link_sitemap contain all the links for the Google Sitemap file to be generated * @param string $lang language of link to add * @param int $index index of the current Google Sitemap file * @param int $i count of elements added to sitemap main array * @param int $id_post cmspsposts object identifier * * @return bool */ protected function _getCmspspostLink(&$link_sitemap, $lang, &$index, &$i, $id_post = 0) { if(!class_exists('CmsPS')) { require _PS_MODULE_DIR_.'cmsps/cmsps.php'; } $link = new Link(); if (method_exists('ShopUrl', 'resetMainDomainCache')) ShopUrl::resetMainDomainCache(); $posts_id = Db::getInstance()->ExecuteS( 'SELECT p.`id_post` FROM `'._DB_PREFIX_.'cmsps_posts` p LEFT JOIN `'._DB_PREFIX_.'cmsps_posts_shop` ps ON p.`id_post` = ps.`id_post` WHERE p.`id_post`>'.(int)$id_post.' AND ps.`id_shop` = '.(int)$this->context->shop->id.' ORDER BY p.`id_post` ASC' ); foreach ($posts_id as $post_id) { $post = new CmsPsPost((int)$post_id['id_post'], (int)$lang['id_lang']); $url = $link->getPostCmsLink((int)$post->id, (int)$lang['id_lang']); if(file_exists(_CMS_CAT_IMG_DIR_.(int)$post->id.'.jpg')) { $image = _CMS_CAT_IMG_DIR_.(int)$post->id.'.jpg'; $image_url = ImageManager::thumbnail($image, 'cmsps_posts_'.(int)(int)$post->id.'.jpg', 350, 'jpg', true, true); } $file_headers = (Configuration::get('GSITEMAP_CHECK_IMAGE_FILE')) ? @get_headers($image_url) : true; $image_post = array(); if (isset($image_url) && ($file_headers[0] != 'HTTP/1.1 404 Not Found' || $file_headers === true)) $image_post = array( 'title_img' => htmlspecialchars(strip_tags($post->title)), 'link' => $image_url ); if (!$this->_addLinkToSitemap( $link_sitemap, array( 'type' => 'cmspspost', 'page' => 'postcms', 'lastmod' => $post->date_upd, 'link' => $url, 'image' => $image_post ), $lang['iso_code'], $index, $i, (int)$post->id )) return false; unset($image_url); } return true; } /** * Hydrate $link_sitemap with cmspseditos link * * @param array $link_sitemap contain all the links for the Google Sitemap file to be generated * @param string $lang language of link to add * @param int $index index of the current Google Sitemap file * @param int $i count of elements added to sitemap main array * @param int $id_edito cmspseditos object identifier * * @return bool */ protected function _getCmspseditoLink(&$link_sitemap, $lang, &$index, &$i, $id_edito = 0) { if(!class_exists('CmsPS')) { require _PS_MODULE_DIR_.'cmsps/cmsps.php'; } $link = new Link(); if (method_exists('ShopUrl', 'resetMainDomainCache')) ShopUrl::resetMainDomainCache(); $editos_id = Db::getInstance()->ExecuteS( 'SELECT e.`id_edito` FROM `'._DB_PREFIX_.'cmsps_editos` e LEFT JOIN `'._DB_PREFIX_.'cmsps_editos_shop` es ON e.`id_edito` = es.`id_edito` WHERE e.`id_edito`>'.(int)$id_edito.' AND es.`id_shop` = '.(int)$this->context->shop->id.' ORDER BY e.`id_edito` ASC' ); foreach ($editos_id as $edito_id) { $edito = new CmsPsEdito((int)$edito_id['id_edito'], (int)$lang['id_lang']); $url = $link->getPostEditoLink((int)$edito->id); if(file_exists(_CMS_CAT_IMG_DIR_.(int)$edito->id.'.jpg')) { $image = _CMS_CAT_IMG_DIR_.(int)$edito->id.'.jpg'; $image_url = ImageManager::thumbnail($image, 'cmsps_editos_'.(int)(int)$edito->id.'.jpg', 350, 'jpg', true, true); } $file_headers = (Configuration::get('GSITEMAP_CHECK_IMAGE_FILE')) ? @get_headers($image_url) : true; $image_edito = array(); if (isset($image_url) && ($file_headers[0] != 'HTTP/1.1 404 Not Found' || $file_headers === true)) $image_edito = array( 'title_img' => htmlspecialchars(strip_tags($edito->title)), 'link' => $image_url ); if (!$this->_addLinkToSitemap( $link_sitemap, array( 'type' => 'cmspsedito', 'page' => 'editocms', 'lastmod' => $edito->date_upd, 'link' => $url, 'image' => $image_edito ), $lang['iso_code'], $index, $i, (int)$edito->id )) return false; unset($image_url); } return true; } }