Extending the Sitemap.xml
Extending Google Sitemap with Images and Language Versions
XperienCentral exposes three interfaces that make it possible to integrate images and content item language versions into Google Sitemap:
- SEOGoogleSitemapFilterProvider
- SEOGoogleSitemapImageProvider
- SEOGoogleSitemapImageEnrichProvider
The following are examples of how to use each interface. See also the XperienCentral Javadoc for complete information on these interfaces.
SEOGoogleSitemapFilterProvider
This implementation excludes modular content items with a certain property from the sitemap. The rest of the code is a default service component.
public class SitemapRedirectFilterProviderServiceImpl extends SimpleServiceComponent implements SEOGoogleSitemapFilterProvider {
// Logger for this class
private static final Logger LOG = Logger.getLogger(SitemapRedirectFilterProviderServiceImpl.class.getName());
@Override
public boolean includeInGoogleSitemap(Website website, ContentItemVersion<?> contentItemVersion) {
if(contentItemVersion instanceof ModularMediaItemVersion) {
ModularTemplateInstance modularTemplateInstance = ((ModularMediaItemVersion) contentItemVersion).getModularTemplateInstance();
if(modularTemplateInstance != null) {
TemplateProperty redirectProperty = modularTemplateInstance.getPropertyByIdentifier("redirect_url");
if(redirectProperty != null) {
String redirect = redirectProperty.getStringValue();
return StringUtils.isEmpty(redirect);
}
}
}
return true;
}
}
SEOGoogleSitemapImageProvider
This implementation adds photos rendered in a media collection element to the sitemap.
public class SitemapImageProviderServiceImpl extends SimpleServiceComponent implements SEOGoogleSitemapImageProvider {
@Override
public List<SEOGoogleSitemapImage> getImages(ContentItemVersion<?> contentItemVersion) {
List<SEOGoogleSitemapImage> images = new ArrayList<>();
Element[] elements = new Element[0];
if(contentItemVersion instanceof PageVersion) {
elements = ((PageVersion) contentItemVersion).getElementHolderElements();
} else if (contentItemVersion instanceof MediaItemVersion) {
ElementHolder elementHolder = ((MediaItemVersion) contentItemVersion).getElementHolder();
if(elementHolder != null) {
elements = elementHolder.getElements();
}
}
for (Element element : elements) {
if (element instanceof MediaCollectionElement) {
images.addAll(getImagesFromMediaCollectionElement((MediaCollectionElement) element));
}
}
return images;
}
private List<SEOGoogleSitemapImage> getImagesFromMediaCollectionElement(MediaCollectionElement element) {
List<SEOGoogleSitemapImage> images = new ArrayList<>();
Presentation presentation = element.getPresentation();
if(presentation != null && "mediaCollectionElementPhotoGallery".equals(presentation.getIdentifier())) {
for(MediaItemVersion mediaItemVersion : element.getMediaItemVersions()) {
if(mediaItemVersion instanceof ModularMediaItemImageVersion) {
images.add(createSEOGoogleSitemapImageBean((ModularMediaItemImageVersion) mediaItemVersion));
}
}
}
return images;
}
private SEOGoogleSitemapImage createSEOGoogleSitemapImageBean(ModularMediaItemImageVersion mediaItemVersion) {
if(mediaItemVersion.getImage() != null) {
SEOGoogleSitemapImage seoGoogleSitemapImage = createSEOGoogleSitemapImageBean(mediaItemVersion.getImage());
seoGoogleSitemapImage.setTitle(mediaItemVersion.getTitle());
ModularTemplateInstance modularTemplateInstance = mediaItemVersion.getModularTemplateInstance();
if (modularTemplateInstance != null) {
seoGoogleSitemapImage.setCaption(modularTemplateInstance.getStringValue("caption"));
}
return seoGoogleSitemapImage;
}
return null;
}
private SEOGoogleSitemapImage createSEOGoogleSitemapImageBean(Image image) {
SEOGoogleSitemapImage seoGoogleSitemapImage = new SEOGoogleSitemapImage();
seoGoogleSitemapImage.setLoc(image.getAbsoluteUrl());
return seoGoogleSitemapImage;
}
}
SEOGoogleSitemapImageEnrichProvider
This implementation adds a custom caption for the sitemap.
public class SitemapImageProviderServiceImpl extends SimpleServiceComponent implements SEOGoogleSitemapImageEnrichProvider {
@Override
public SEOGoogleSitemapImage enrichImage(SEOGoogleSitemapImage seoGoogleSitemapImage, ImageElement imageElement) {
MediaItem mediaItem = imageElement.getMediaItem();
if(mediaItem != null) {
MediaItemVersion mediaItemVersion = mediaItem.getCurrent();
if(mediaItemVersion instanceof ModularMediaItemImageVersion) {
seoGoogleSitemapImage = createSEOGoogleSitemapImageBean((ModularMediaItemImageVersion) mediaItemVersion);
}
}
return seoGoogleSitemapImage;
}
private SEOGoogleSitemapImage createSEOGoogleSitemapImageBean(ModularMediaItemImageVersion mediaItemVersion) {
if(mediaItemVersion.getImage() != null) {
SEOGoogleSitemapImage seoGoogleSitemapImage = createSEOGoogleSitemapImageBean(mediaItemVersion.getImage());
seoGoogleSitemapImage.setTitle(mediaItemVersion.getTitle());
ModularTemplateInstance modularTemplateInstance = mediaItemVersion.getModularTemplateInstance();
if (modularTemplateInstance != null) {
seoGoogleSitemapImage.setCaption(modularTemplateInstance.getStringValue("caption"));
}
return seoGoogleSitemapImage;
}
return null;
}
private SEOGoogleSitemapImage createSEOGoogleSitemapImageBean(Image image) {
SEOGoogleSitemapImage seoGoogleSitemapImage = new SEOGoogleSitemapImage();
seoGoogleSitemapImage.setLoc(image.getAbsoluteUrl());
return seoGoogleSitemapImage;
}
}
, multiple selections available, Use left or right arrow keys to navigate selected items