Shopify: add collection handle to the product url
Note:
This functionality is only available for Shopify users.
Components:
If you want to add a collection handle to your product url, e.g. if you have a collection: /collection/shorts and a product url: /product/nice-shorts and you want to have collection breadcrumbs in the product page like this: /collection/shorts/products/nice-shorts.
To do that, you would need to update a few things as shown below:
/* some imports here */
import { withProps, compose, withHandlers } from 'recompose';
/* some code here */
/* we need this function to navigate to a different url */
const navigate = (openInNewWindow, url) => {
if (!window) return;
if (openInNewWindow) return window.open(url, '_blank');
return window.location.href = url;
}
/* this function updates the url by adding collection handle */
const appendCollectionSlot = (url) =>{
const collectionSlot = findify.utils.collectionPath();
return url.split('/products/').join(`/${collectionSlot}/products/`);
}
/* this enhancer has a check for whether it's a collection or not and creates a new onClick function when clicked on a product card to change the default onClick event */
const enhancer = compose(
withProps(({ config }) => ({
isCollection: config.get('type') === 'smart-collection',
})),
withHandlers({
onClick: ({ item, isCollection }) => (e) =>{
e.preventDefault();
const openInNewWindow = e && (e.ctrlKey || e.metaKey);
const productUrl = isCollection ? appendCollectionSlot(item.get('product_url')) : item.get('product_url');
item.analytics.sendEvent(
'click-item',
{ rid: item.meta.get('rid'), item_id: item.get('id') },
!openInNewWindow
);
navigate(openInNewWindow, productUrl);
}
})
);
/* some code here */
const ProductCardView: React.SFC<IProductCardProps> = ({
item,
config,
theme,
isCollection,
onClick // new onClick function
}: any) => (
<a
onClick={onClick} // place this new onClick function here
href={item.get('product_url')}
className={classNames(
theme.root,
config.get('simple') && theme.simple,
theme.productCard,
)}
>
// some code
</a>
)
export default enhancer(ProductCardView); // add the enhancer
Updated over 4 years ago