<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Customize Sitemap</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=9532292" />
  <subtitle>Customize Sitemap</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=9532292</id>
  <updated>2026-04-06T00:02:12Z</updated>
  <dc:date>2026-04-06T00:02:12Z</dc:date>
  <entry>
    <title>Customize Sitemap</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=9532291" />
    <author>
      <name>Simone Romei</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=9532291</id>
    <updated>2011-06-22T12:23:21Z</updated>
    <published>2011-06-22T12:23:21Z</published>
    <summary type="html">In liferay 5.X (maybe even in 6) only not hidden page can be part of sitemap.xml.&lt;br /&gt;&lt;br /&gt;For customize xml generation the only need is:&lt;br /&gt;&lt;br /&gt;- put in struts-config-ext.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;action path=&amp;#34;/layout_management/sitemap&amp;#34; type=&amp;#34;package.SitemapActionHiddenPage&amp;#34; /&amp;gt;&lt;br /&gt;&lt;br /&gt;and create custom class like:&lt;br /&gt;&lt;br /&gt;public class SitemapActionHiddenPage extends Action {&lt;br /&gt;&lt;br /&gt;	public ActionForward execute(&lt;br /&gt;			ActionMapping mapping, ActionForm form, HttpServletRequest request,&lt;br /&gt;			HttpServletResponse response)&lt;br /&gt;		throws Exception {&lt;br /&gt;&lt;br /&gt;		try {&lt;br /&gt;			ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(&lt;br /&gt;				WebKeys.THEME_DISPLAY);&lt;br /&gt;&lt;br /&gt;			long groupId = ParamUtil.getLong(request, &amp;#34;groupId&amp;#34;);&lt;br /&gt;			boolean privateLayout = ParamUtil.getBoolean(&lt;br /&gt;				request, &amp;#34;privateLayout&amp;#34;);&lt;br /&gt;&lt;br /&gt;			LayoutSet layoutSet = null;&lt;br /&gt;&lt;br /&gt;			if (groupId &amp;gt; 0) {&lt;br /&gt;				Group group = GroupLocalServiceUtil.getGroup(groupId);&lt;br /&gt;&lt;br /&gt;				if (group.isStagingGroup()) {&lt;br /&gt;					groupId = group.getLiveGroupId();&lt;br /&gt;				}&lt;br /&gt;&lt;br /&gt;				layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(&lt;br /&gt;					groupId, privateLayout);&lt;br /&gt;			}&lt;br /&gt;			else {&lt;br /&gt;				String host = PortalUtil.getHost(request);&lt;br /&gt;&lt;br /&gt;				layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(host);&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			String sitemap = SitemapUtilHiddenPage.getSitemap(&lt;br /&gt;				layoutSet.getGroupId(), layoutSet.isPrivateLayout(),&lt;br /&gt;				themeDisplay);&lt;br /&gt;&lt;br /&gt;//			ServletResponseUtil.sendFile(&lt;br /&gt;//				response, null, sitemap.getBytes(StringPool.UTF8),&lt;br /&gt;//				ContentTypes.TEXT_XML_UTF8);&lt;br /&gt;			&lt;br /&gt;			response.setContentType(ContentTypes.TEXT_XML_UTF8);&lt;br /&gt;			response.getWriter().print(sitemap);&lt;br /&gt;			&lt;br /&gt;		}&lt;br /&gt;		catch (NoSuchLayoutSetException nslse) {&lt;br /&gt;			PortalUtil.sendError(&lt;br /&gt;				HttpServletResponse.SC_NOT_FOUND, nslse, request, response);&lt;br /&gt;		}&lt;br /&gt;		catch (Exception e) {&lt;br /&gt;			if (_log.isWarnEnabled()) {&lt;br /&gt;				_log.warn(e, e);&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			PortalUtil.sendError(&lt;br /&gt;				HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e, request,&lt;br /&gt;				response);&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;With a Sitemap generator like&lt;br /&gt;&lt;br /&gt;public class SitemapUtil {&lt;br /&gt;&lt;br /&gt;	public static String getSitemap(&lt;br /&gt;			long groupId, boolean privateLayout, ThemeDisplay themeDisplay)&lt;br /&gt;		throws PortalException, SystemException {&lt;br /&gt;&lt;br /&gt;		Document doc = SAXReaderUtil.createDocument();&lt;br /&gt;&lt;br /&gt;		doc.setXMLEncoding(StringPool.UTF8);&lt;br /&gt;&lt;br /&gt;		Element root = doc.addElement(&lt;br /&gt;			&amp;#34;urlset&amp;#34;, &amp;#34;http://www.google.com/schemas/sitemap/0.84&amp;#34;);&lt;br /&gt;&lt;br /&gt;		List&amp;lt;Layout&amp;gt; layouts = LayoutLocalServiceUtil.getLayouts(&lt;br /&gt;			groupId, privateLayout);&lt;br /&gt;&lt;br /&gt;		_visitLayouts(root, layouts, themeDisplay);&lt;br /&gt;&lt;br /&gt;		return doc.asXML();&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public static String encodeXML(String input) {&lt;br /&gt;		return StringUtil.replace(&lt;br /&gt;			input,&lt;br /&gt;			new String[] {&amp;#34;&amp;amp;&amp;#34;, &amp;#34;&amp;lt;&amp;#34;, &amp;#34;&amp;gt;&amp;#34;, &amp;#34;&amp;#39;&amp;#34;, &amp;#34;\&amp;#34;&amp;#34;},&lt;br /&gt;			new String[] {&amp;#34;&amp;amp;amp;&amp;#34;, &amp;#34;&amp;amp;lt;&amp;#34;, &amp;#34;&amp;amp;gt;&amp;#34;, &amp;#34;&amp;amp;apos;&amp;#34;, &amp;#34;&amp;amp;quot;&amp;#34;});&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private static void _visitLayouts(&lt;br /&gt;			Element element, List&amp;lt;Layout&amp;gt; layouts, ThemeDisplay themeDisplay)&lt;br /&gt;		throws PortalException, SystemException {&lt;br /&gt;&lt;br /&gt;		for (Layout layout : layouts) {&lt;br /&gt;			UnicodeProperties props = layout.getTypeSettingsProperties();&lt;br /&gt;&lt;br /&gt;			if (PortalUtil.isLayoutSitemapable(layout) &amp;amp;&amp;amp; !layout.isHidden() &amp;amp;&amp;amp;&lt;br /&gt;				GetterUtil.getBoolean(&lt;br /&gt;					props.getProperty(&amp;#34;sitemap-include&amp;#34;), true)) {&lt;br /&gt;&lt;br /&gt;				Element url = element.addElement(&amp;#34;url&amp;#34;);&lt;br /&gt;&lt;br /&gt;				String layoutURL = PortalUtil.getLayoutURL(&lt;br /&gt;					layout, themeDisplay);&lt;br /&gt;&lt;br /&gt;				if (!HttpUtil.hasDomain(layoutURL)) {&lt;br /&gt;					layoutURL = themeDisplay.getPortalURL() + layoutURL;&lt;br /&gt;				}&lt;br /&gt;&lt;br /&gt;				url.addElement(&amp;#34;loc&amp;#34;).addText(encodeXML(layoutURL));&lt;br /&gt;&lt;br /&gt;				String changefreq = props.getProperty(&amp;#34;sitemap-changefreq&amp;#34;);&lt;br /&gt;&lt;br /&gt;				if (Validator.isNotNull(changefreq)) {&lt;br /&gt;					url.addElement(&amp;#34;changefreq&amp;#34;).addText(changefreq);&lt;br /&gt;				}&lt;br /&gt;&lt;br /&gt;				String priority = props.getProperty(&amp;#34;sitemap-priority&amp;#34;);&lt;br /&gt;&lt;br /&gt;				if (Validator.isNotNull(priority)) {&lt;br /&gt;					url.addElement(&amp;#34;priority&amp;#34;).addText(priority);&lt;br /&gt;				}&lt;br /&gt;&lt;br /&gt;				List&amp;lt;Layout&amp;gt; children = layout.getChildren();&lt;br /&gt;&lt;br /&gt;				_visitLayouts(element, children, themeDisplay);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;}</summary>
    <dc:creator>Simone Romei</dc:creator>
    <dc:date>2011-06-22T12:23:21Z</dc:date>
  </entry>
</feed>
