Links
Comment on page

Overriding Product Data

In order to modify the product data that is sent to Nosto you must create a small Magento 2 module. Start by following the steps described in the wiki page Extending Nosto's Module. By creating a M2 module you can override the product model in a way that the modifications take place in API calls, exports and in the tagging.

Required files and configurations

1. The events config app/code/My/Nosto/etc/events.xml

<?xml version="1.0"?>
<!--suppress XmlUnboundNsPrefix -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="nosto_product_load_after">
<observer name="nosto_product_load_after" instance="My\Nosto\Observer\Product\Load" />
</event>
</config>

2. The observer app/code/My/Nosto/Observer/Product/Load.php

<?php
namespace My\Nosto\Observer\Product;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class Load implements ObserverInterface
{
public function __construct()
{
}
/**
* Observer for "nosto_product_load_after" event
*
* @param Observer $observer
* @return void
*/
public function execute(Observer $observer)
{
/* @var $product \NostoProduct */
$product = $observer->getProduct();
/*
* Here you can modify any product property you need and it will
* automatically be used both in the store front tagging and the
* server-to-server API calls.
*
* Note that any new properties will not automatically be used.
*
* @see https://support.nosto.com/get-started/tagging-product-pages/
*/
/*
* Example 1
*
* Adding "tag2" and "tag3" properties.
*
* These properties are used to include more information about the
* product that can in turn be used for more granular control in the
* product recommendations.
*
* It is important to notice that the `addTag()` function receives a string as an argument
* and can be called multiple times in order to add multiple arguments.
* If you call:
* $product->addTag3('example1');
* $product->addTag3('example2');
* You will have `example1` and `example2` as in the tag3 field.
*
* The `setTag` function takes an array of strings as argument and
* will override any previously assigned values to the tag:
*
* $product->setTag2(['example1', 'example2']);
* $product->setTag3(['example3']);
*
*/
/*
* Example 2
*
* Changing the product image URL.
*
* If you are, for example, using a 3rd party cloud storage for your
* product images.
*
* The url must be absolute and includes the protocol (http or https).
* $product->setImageUrl('http://example.com/p/example.jpg');
*
*/
// This can be removed when implementing this extension, it's here only to
// check that the override works when implemented.
$product->addTag3('nosto');
}
}

Adding custom attributes to product tags

<?php
namespace My\Nosto\Observer\Product;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
class Load implements ObserverInterface
{
protected $productRepository;
public function __construct(ProductRepositoryInterface $productRepository)
{
$this->productRepository = $productRepository;
}
/**
* Observer for "nosto_product_load_after" event
*
* @param Observer $observer
* @return void
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function execute(Observer $observer)
{
/* @var $product \NostoProduct */
$product = $observer->getProduct();
// Get the Magento product
$magentoProduct = $this->productRepository->getById($product->getProductId());
// If you have a custom attribute (string value) stored in the Magento
// product model, it can be added to a tag field like this:
$myAttribute = $magentoProduct->getCustomAttribute('my_custom_attribute');
if($myAttribute) {
$product->addTag3($myAttribute->getValue());
}
}
}
If all the steps were followed correctly, your final directory structure should have these files:
app
├── code
│ └── My
│ └── Nosto
│ ├── Observer
│ │ └── Product
│ │ └── Load.php
│ ├── composer.json
│ ├── etc
│ │ ├── events.xml
│ │ └── module.xml
│ ├── registration.php
Run the following commands to update the generated code in Magento's end bin/magento module:enable --clear-static-content My_Nosto
bin/magento setup:upgrade
As of module version >= 4.0.0 Nosto product data is cached and thus you must run full reindex for Nosto indexers in order for the changes to be reflected to Nosto.