Promotions play a crucial role in the success of an eCommerce business. They are essential for attracting customers, increasing sales, building brand loyalty, and staying competitive in the online marketplace.
Managing promotions in Magento 2 can be done through the built-in promotional tools and features. Magento 2 offers a flexible and powerful promotion system to create various types of promotions like discounts, coupons, free shipping, etc. But there is always a scope for change in the business requirement for creating a promotion, and we are going to discuss more on this requirement.
Currently, Magento provides the below conditions on which you can create your promotion rules. But by following the below steps you can manage and learn to add more options to the cart price rule.
Step 1: First, we need to add a plugin for class Magento\SalesRule\Model\Rule\Condition\Product.
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<!-- Case-wsie Promo attribute-->
<type name="Magento\SalesRule\Model\Rule\Condition\Product">
<plugin name="add_sales_uom_in_cart_rule" type="MageInsight\ ModuleName\Plugin\SalesRule\Conditions\Product"/>
</type>
</config>
Step 2: Then we need to add a plugin class as mentioned in di.xml.
<?php
namespace MageInsight\ModuleName\Plugin\SalesRule\Conditions;
/**
* Additional attr for validator.
*/
class Product
{
/**
* Name For Condition Attribute
*/
public const CONDITION_SALES_UOM = 'quote_item_sales_uom_qty_per';
/**
* @param \Magento\Rule\Model\Condition\Product\AbstractProduct $subject
* @param \Magento\SalesRule\Model\Rule\Condition\Product $result
*
* @return \Magento\SalesRule\Model\Rule\Condition\Product
*/
public function afterLoadAttributeOptions(
\Magento\Rule\Model\Condition\Product\AbstractProduct $subject,
\Magento\SalesRule\Model\Rule\Condition\Product $result
) {
$attributes = $subject->getAttributeOption();
$attributes[self::CONDITION_SALES_UOM] = __('Sales Uom Qty Per');
$subject->setAttributeOption($attributes);
return $result;
}
/**
* @param \Magento\Rule\Model\Condition\Product\AbstractProduct $subject
* @param \Magento\Framework\Model\AbstractModel $object
*/
public function beforeValidate(
\Magento\Rule\Model\Condition\Product\AbstractProduct $subject,
\Magento\Framework\Model\AbstractModel $object
) {
if ($object instanceof \Magento\Quote\Api\Data\CartItemInterface
&& $object->getQuote()
&& $object->getQuote()->getItems()
) {
$options = $object->getProduct()->getTypeInstance(true)->getOrderOptions($object->getProduct());
// Here we are checking if the product is a case or a bottle.
if (is_array($options) && array_key_exists('info_buyRequest', $options) && array_key_exists('qty_for_bottle_option', $options['info_buyRequest'])) {
$object->getProduct()->setData(
self::CONDITION_SALES_UOM,
$object->getProduct()->getData('sales_uom_qty_per')
);
} else {
$object->getProduct()->setData(
self::CONDITION_SALES_UOM,
1
);
}
}
}
}
Once this is done, please clear the cache and then go to the cart price rule page. You can see a new attribute "Sales Uom Qty Per" under "Cart Item Attribute" while adding conditions to the promotion.
NOTE: This is an example of a customized requirement. We manage products in terms of quantity and case. As a result, we were managing it using separate reasoning. And we have a restriction that we only promote products in cases.
Comments
Post a Comment