diff --git a/htdocs/core/lib/website2.lib.php b/htdocs/core/lib/website2.lib.php index 6510d5fff8d..8824d9cc06d 100644 --- a/htdocs/core/lib/website2.lib.php +++ b/htdocs/core/lib/website2.lib.php @@ -203,10 +203,6 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } // Add translation reference (main language) if ($object->isMultiLang()) { - // Add myself - $tplcontent .= 'fk_default_home == $objectpage->id) ? '/' : (($shortlangcode != substr($object->lang, 0, 2)) ? '/'.$shortlangcode : '')).'/'.$objectpage->pageurl.'.php") { ?>'."\n"; - $tplcontent .= ''."\n"; - // Add page "translation of" $translationof = $objectpage->fk_page; if ($translationof) { @@ -225,6 +221,7 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } } } + // Add "has translation pages" $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page where fk_page IN ('.$db->sanitize($objectpage->id.($translationof ? ', '.$translationof : '')).")"; $resql = $db->query($sql); @@ -244,6 +241,11 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } else { dol_print_error($db); } + + // Add myself + $tplcontent .= 'fk_default_home == $objectpage->id) ? '/' : (($shortlangcode != substr($object->lang, 0, 2)) ? '/'.$shortlangcode : '')).'/'.$objectpage->pageurl.'.php") { ?>'."\n"; + $tplcontent .= ''."\n"; + $tplcontent .= ''."\n"; } // Add manifest.json. Do we have to add it only on home page ? diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 7075bd770c9..510f9b278dc 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2250,12 +2250,16 @@ $tempdir = $conf->website->dir_output.'/'.$websitekey.'/'; // Generate web site sitemaps if ($action == 'generatesitemaps' && $usercanedit) { $domtree = new DOMDocument('1.0', 'UTF-8'); + $root = $domtree->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset'); - $domtree->createAttributeNS("http://www.w3.org/1999/xhtml", 'xmlns:xhtml'); + $root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); + $domtree->formatOutput = true; + $xmlname = 'sitemap.'.$websitekey.'.xml'; - $sql = "SELECT wp.type_container , wp.pageurl, wp.lang, wp.tms as tms, w.virtualhost"; + $sql = "SELECT wp.rowid, wp.type_container , wp.pageurl, wp.lang, wp.fk_page, wp.tms as tms,"; + $sql .= " w.virtualhost, w.fk_default_home"; $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w"; $sql .= " WHERE wp.type_container IN ('page', 'blogpost')"; $sql .= " AND wp.fk_website = w.rowid"; @@ -2269,10 +2273,25 @@ if ($action == 'generatesitemaps' && $usercanedit) { while ($i < $num_rows) { $objp = $db->fetch_object($resql); $url = $domtree->createElement('url'); - $pageurl = $objp->pageurl; + + $shortlangcode = ''; if ($objp->lang) { - $pageurl = $objp->lang.'/'.$pageurl; + $shortlangcode = substr($objp->lang, 0, 2); // en_US or en-US -> en } + if (empty($shortlangcode)) { + $shortlangcode = substr($object->lang, 0, 2); // en_US or en-US -> en + } + + // Forge $pageurl, adding language prefix if it is an alternative language + $pageurl = $objp->pageurl; + if ($objp->fk_default_home == $objp->rowid) { + $pageurl = ''; + } else { + if ($shortlangcode != substr($object->lang, 0, 2)) { + $pageurl = $shortlangcode.'/'.$pageurl.'.php'; + } + } + if ($objp->virtualhost) { $domainname = $objp->virtualhost; } @@ -2281,11 +2300,77 @@ if ($action == 'generatesitemaps' && $usercanedit) { } //$pathofpage = $dolibarr_main_url_root.'/'.$pageurl.'.php'; - $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl.'.php'); + // URL of sitemaps must end with trailing slash if page is '' + $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl); $lastmod = $domtree->createElement('lastmod', $db->jdate($objp->tms)); + $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values + $priority = $domtree->createElement('priority', '1'); $url->appendChild($loc); $url->appendChild($lastmod); + // Add suggested frequency for refresh + if (!empty($conf->global->WEBSITE_SITEMAPS_ADD_WEEKLY_FREQ)) { + $url->appendChild($changefreq); + } + // Add higher priority for home page + if ($objp->fk_default_home == $objp->rowid) { + $url->appendChild($priority); + } + + // Now add alternate language entries + if ($object->isMultiLang()) { + // Add page "translation of" + $translationof = $objp->fk_page; + if ($translationof) { + $tmppage = new WebsitePage($db); + $tmppage->fetch($translationof); + if ($tmppage->id > 0) { + $tmpshortlangcode = ''; + if ($tmppage->lang) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $tmppage->lang); // en_US or en-US -> en + } + if (empty($tmpshortlangcode)) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $object->lang); // en_US or en-US -> en + } + if ($tmpshortlangcode != $shortlangcode) { + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + } + } + + // Add "has translation pages" + $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page where fk_page IN ('.$db->sanitize($objp->rowid.($translationof ? ', '.$translationof : '')).")"; + $resql = $db->query($sql); + if ($resql) { + $num_rows = $db->num_rows($resql); + if ($num_rows > 0) { + while ($objhastrans = $db->fetch_object($resql)) { + $tmpshortlangcode = ''; + if ($objhastrans->lang) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $objhastrans->lang); // en_US or en-US -> en + } + if ($tmpshortlangcode != $shortlangcode) { + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + } + } + } else { + dol_print_error($db); + } + + // Add myself + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$shortlang.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + $root->appendChild($url); $i++; }