Ever heard of facets? You might not have heard of them but I’m sure you’ve seen them on e-commerce websites. They’re those filters on the side that let you know how many items are in each subcategory. You can create them using the Corvid Search API .
Here’s what you need to do:
-
Create a store collection for each facet you want to show. For example, you might have Sweaters, T-shirts, and Jackets collections.
-
Add products to each collection. Products can belong to multiple collections.
-
Add 2 repeaters to your page: 1 to display the facets, and 1 to display the filtered products.
-
Add the code below to your page. Don’t forget to match your element IDs to the IDs used in the code.
import wixSearch from 'wix-search';
$w.onReady(function () {
// Define what happens when the facet repeater's data is set
$w("#facetRepeater").onItemReady(($item, itemData, index) => {
$item("#facetText").text = itemData.facetValue;
$item("#facetNumberText").text = "(" + itemData.count + ")";
// When a facet is clicked, run the functions that display only
// the selected products and bold the selected facet text
$item("facetText").onClick(event => {
const selectedIndex = index;
const facet = $item("#facetText").text;
displaySelectedProducts(facet);
boldSelectedFacet(selectedIndex);
});
});
// Define what happens when the product repeater's data is set
$w("productRepeater").onItemReady(($item, itemData) => {
$item("#productTitleText").text = itemData.title;
$item("#productDescriptionText").text = itemData.description;
$item("#productImage").src = itemData.image;
});
// Run a search which applies a facet that categorizes store
// products according to the collection they belong to
wixSearch.search()
.documentType("Stores/Products")
.facets("collections")
.find()
.then((results) => {
// Get the first (and only) facet result
const facets = results.facets[0].facets;
// Add an ID to each object in the facets
// array (required for repeater data)
const newFacets = facets.map((facet) => {
facet._id = facet.facetValue;
return facet;
});
// Set the facet repeater's data
$w('#facetRepeater').data = newFacets;
// Set the initial pre-filtered product repeater's data
$w('#productRepeater').data = results.documents;
});
});
// Function for bolding the selected facet and unbolding
// all other facets
function boldSelectedFacet(selectedIndex) {
$w("#facetRepeater").forEachItem(($item, itemData, index) => {
let facetText = $item("#facetText").text;
let facetCount = $item("#facetNumberText").text
// If this is the selected facet text, bold it. You can also
// add whatever other formatting or styles you want.
if (index === selectedIndex) {
$item("#facetText").html = `<span style='font-weight:bold'>${facetText}</span>`;
$item("#facetNumberText").html = `<span style='font-weight:bold'>${facetCount}</span>`;
// If this is not the selected facet text, unbold it.
} else {
$item("#facetText").html = `<span style='font-weight:normal'>${facetText}</span>`;
$item("#facetNumberText").html = `<span style='font-weight:normal'>${facetCount}</span>`;
}
});
}
// Function for displaying only products from the collection
// corresponding to the selected facet
function displaySelectedProducts(facet) {
wixSearch.search()
.documentType("Stores/Products")
.hasSome("collections", [facet])
.find()
.then((results) => {
$w('#productRepeater').data = results.documents;
});
}