Expand my Community achievements bar.

July 31st AEM Gems Webinar: Elevate your AEM development to master the integration of private GitHub repositories within AEM Cloud Manager.

Meta Keywords in DOM from AEM Tagging

Avatar

Level 3

Hi,

We have multiple tags created that follow a hierarchical taxonomy.

manasabojja7_0-1714168413363.png

 

Tags when added to pages show them in the hierarchy

manasabojja7_2-1714168602375.png

Is there a way that we could persist the order when they are translated to keywords in the <meta> tag?

 

Here's what is rendered on Page

<meta name="keywords" content="Receivers,Hopper Family,Products">

 

v/s maintaining the hierarchy(what we need)

<meta name="keywords" content="Products, Receivers, Hopper Family">

 

Is this possible? Thanks in advance for the help.

 

-Manasa

 

6 Replies

Avatar

Community Advisor

@manasabojja7 how they are stored in jcr? Can you check that? Ideally order of keywords displayed in page html depends on order in which they are stored in jcr..

Avatar

Level 9

@manasabojja7 Is there a reason why you want to order the tags? Is this for SEO purpose?

The order of keywords typically depends on the order in which they are stored in the JCR (Java Content Repository). If the tags are stored in the desired order in the JCR, they should be displayed in that order in the page HTML.

 

The keywords are usually stored in a property like cq:tags . You can fetch this property, modify the order of keywords as needed, and then save the changes back to the node.

 

Something like this:

Node pageNode = session.getNode(pagePath);
if (pageNode != null) {
    // Fetch the keywords property
    String[] keywords = pageNode.getProperty("cq:tags").getStrings();
    
    // Modify the order of keywords as needed
    // This is just an example of reversing the order
    ArrayUtils.reverse(keywords);
    
    // Save the modified keywords back to the property
    pageNode.setProperty("cq:tags", keywords);
    
    // Save the session to persist changes
    session.save();
}

 

 

Avatar

Level 10

Hi @manasabojja7 ,

To achieve the desired behavior of maintaining the hierarchical order of tags when translated to keywords in the <meta> tag, you would typically need to customize the logic that generates the <meta> tag content. This customization can be done in the backend Java code of your AEM project.

Here's a high-level approach to implement this customization:

  1. Retrieve Tags with Order: Modify the logic that retrieves the tags associated with the page to ensure that they are retrieved in the desired hierarchical order. You might need to query the tags with a specific order or sort them programmatically based on their hierarchy.

  2. Generate Meta Keywords: Generate the <meta> tag content by concatenating the tags in the desired order, separating them with commas.

  3. Inject Meta Keywords: Set the generated <meta> tag content as a property of your page's resource or as part of the response output. This can be done in your Java code where you handle the rendering of the page.

Here's a simplified example of how you might implement this logic in Java code (assuming you're using AEM's Sightly scripting language for rendering):

 

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import com.adobe.cq.wcm.api.Page;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.ServletResolverConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Component(
        service = { Servlet.class },
        property = {
                ServletResolverConstants.SLING_SERVLET_PATHS + "=/bin/my/custom/servlet",
                ServletResolverConstants.SLING_SERVLET_METHODS + "=GET"
        }
)
public class MyCustomServlet extends SlingAllMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        // Retrieve the current page
        Page currentPage = request.getResource().adaptTo(Page.class);

        // Retrieve tags associated with the page
        List<String> tags = Arrays.asList(currentPage.getProperties().get("cq:tags", new String[]{}));

        // Sort the tags based on hierarchical order
        List<String> sortedTags = sortTags(tags);

        // Generate meta keywords content
        String metaKeywords = sortedTags.stream().collect(Collectors.joining(", "));

        // Set meta keywords as a property of the current page's resource
        Resource pageResource = currentPage.getContentResource();
        pageResource.adaptTo(ValueMap.class).put("metaKeywords", metaKeywords);
    }

    // Custom method to sort tags based on hierarchical order
    private List<String> sortTags(List<String> tags) {
        // Implement logic to sort tags based on hierarchy
        // You might need to traverse the tag hierarchy and sort them accordingly
        // For simplicity, I'll just sort them alphabetically
        return tags.stream().sorted().collect(Collectors.toList());
    }
}

 

In this example:

  • MyCustomServlet is a servlet that retrieves the tags associated with the current page and generates the <meta> tag content.
  • sortTags() is a custom method to sort tags based on the desired hierarchical order. You would need to implement the logic to sort tags according to your specific requirements.
  • The generated meta keywords content is set as a property of the current page's resource (metaKeywords).

You would need to register this servlet in your AEM project and map it to an appropriate URL. Additionally, you might need to adapt this code to fit your specific project structure and requirements.

Avatar

Level 9

 manasabojja7, Did any of the suggestions worked for you? Can you share your findings?

Avatar

Administrator

@manasabojja7 Did you find the suggestions from users helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.



Kautuk Sahni