How to Show Payment Methods for Particular Categories in Magento 2
Steps to Show Payment Methods for Particular Categories in Magento 2:
Step 1: First, create an events.xml file inside the etc folder at the below file path
app\code\Vendor\Extension\etc
Now add the code as mentioned below.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="payment_method_is_active">
<observer name="payment_method_is_active" instance="Vendor\Extension\Observer\ActivePaymentMethod" />
</event>
</config>
Step 2: In the second step, create the ActivePaymentMethod.php file inside the model folder at the following path
app\code\Vendor\Extension\Observer
Then add the code as follows.
<?php
namespace Vendor\Extension\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
class ActivePaymentMethod implements ObserverInterface
{
protected $_cart;
protected $_checkoutSession;
protected $productRepository;
public function __construct(
\Magento\Checkout\Model\Cart $cart,
\Magento\Checkout\Model\Session $checkoutSession,
ProductRepositoryInterface $productRepository
)
{
$this->_cart = $cart;
$this->_checkoutSession = $checkoutSession;
$this->productRepository = $productRepository;
}
/**
* Execute observer
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$quote = $this->getCheckoutSession()->getQuote();
$categoryID = "Add your category ID";
$items = $quote->getAllItems();
$flag = false;
foreach($items as $item)
{
$product = $this->getProduct($item->getProductId());
$categoryIds = $product->getCategoryIds();
if(in_array($categoryID, $categoryIds))
{
$flag = true;
break;
}
}
if($flag == false && $observer->getEvent()->getMethodInstance()->getCode()=="Enter Your Payment Method Code")
{
$checkResult = $observer->getEvent()->getResult();
$checkResult->setData('is_available', false);
}
}
public function getProduct($productId)
{
return $product = $this->productRepository->getById($productId);
}
public function getCart()
{
return $this->_cart;
}
public function getCheckoutSession()
{
return $this->_checkoutSession;
}
}
Comments
Post a Comment