Step 3: Add setContext Object

Now that you’ve set the query rule that specifies what the Search experience should do based on context received, you have to actually pass in the context. To set the context, you’ll need to pass in an object to the setContext function. There are two options to do so.

Option 1: Search Bar Integration

Generally you will place the setContext function in the onReady function, but setContext can be called any time after the Search library is initialized and before the user runs a search.

Looking at the search bar integration instructions (check out the step to initialize the library ), set the context below the addComponent call in the onReady function, like so (be sure to update any REPLACE_ME values as specified in that integration guide):

<head>
  <!-- Other stuff in the head here -->
  <link
    rel="stylesheet"
    type="text/css"
    href="https://assets.sitescdn.net/answers-search-bar/v1.0/answers.css"
  />
  <script src="https://assets.sitescdn.net/answers-search-bar/v1.0/answerstemplates.compiled.min.js"></script>
  <script>
    const userData = {
      segment: "swift-fan",
      age: "34-55",
      gender: "male"
    };

    function initAnswers() {
      ANSWERS.init({
        apiKey: "REPLACE_ME_API_KEY",
        experienceKey: "REPLACE_ME_EXPERIENCE_KEY",
        experienceVersion: "PRODUCTION",
        locale: "en", // e.g. en
        businessId: "REPLACE_ME_BUSINESS_ID",
        templateBundle: TemplateBundle.default,
        onReady: function() {
          ANSWERS.addComponent("SearchBar", {
            container: ".search_form",
            name: "search-bar", 
            redirectUrl: "REPLACE_ME_SEARCH_RESULT_URL",
            placeholderText: "Search...",
          });
          //Set Context Function goes here
          ANSWERS.setContext(userData);
        },
      });
    }
  </script>
  <script
    src="https://assets.sitescdn.net/answers-search-bar/v1.0/answers.min.js"
    onload="ANSWERS.domReady(initAnswers)"
    async
    defer
  ></script>
</head>

You can see that userData is specified ahead of time and then that object is passed into setContext after the components are rendered. This is helpful since userData will usually come from some other system like a CDP, CRM, an analytics tool, or a cookie you set. You can also pass the user data object directly into setContext if you choose, such as:

ANSWERS.setContext({segment: "swift-fan", age: "34-55", gender: "male"});

To see this fully in action, here is a working example in CodeSandbox:

Option 2: Override the Theme

You can add context by directly editing the code in the Theme. Similarly, we need to call the setContext function after the Search library is initialized on the search results page. To do this, you will need to override the Theme using a Jambo Command  and edit the script > after-init.js file. This file loads after the Search library is loaded on the page, which ensures you’re able to call the setContext() function:

ANSWERS.setContext({segment: "swift-fan", age: "34-55", gender: "male"});
Feedback