Is there an API call or cart/quote setting I can use to turn off customer notifications just for the order confirmation?
I create order using this api
Method:PUT
url:
http://localhost/testproject/rest/V1/carts/{cart_id or quote_id}/order
1 Answer 1
Disable the order confirmation email from the Magento Admin and send an email programmatically for website only:
Stores > Configuration > Sales > Sales Email > Order > Enabled = No
app/code/VendorName/ModuleName/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="VendorName_ModuleName" setup_version="1.0.0">
<sequence>
<module name="Magento_Checkout" />
</sequence>
</module>
</config>
app/code/VendorName/ModuleName/etc/frontend/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="checkout_onepage_controller_success_action">
<observer name="checkout_onepage_controller_success_action_sendmail" instance="VendorName\ModuleName\Observer\SendMailOnOrderSuccess" />
</event>
</config>
app/code/VendorName/ModuleName/Observer/SendMailOnOrderSuccess.php
<?php
namespace VendorName\ModuleName\Observer;
use Magento\Framework\Event\ObserverInterface;
class SendMailOnOrderSuccess implements ObserverInterface
{
/**
* @var \Magento\Sales\Model\OrderFactory
*/
protected $orderModel;
/**
* @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
*/
protected $orderSender;
/**
* @var \Magento\Checkout\Model\Session $checkoutSession
*/
protected $checkoutSession;
/**
* @param \Magento\Sales\Model\OrderFactory $orderModel
* @param \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender
* @param \Magento\Checkout\Model\Session $checkoutSession
*
* @codeCoverageIgnore
*/
public function __construct(
\Magento\Sales\Model\OrderFactory $orderModel,
\Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender,
\Magento\Checkout\Model\Session $checkoutSession
)
{
$this->orderModel = $orderModel;
$this->orderSender = $orderSender;
$this->checkoutSession = $checkoutSession;
}
/**
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$orderIds = $observer->getEvent()->getOrderIds();
if (count($orderIds)) {
$this->checkoutSession->setForceOrderMailSentOnSuccess(true);
$order = $this->orderModel->create()->load($orderIds[0]);
$this->orderSender->send($order, true);
}
return $this;
}
}
app/code/VendorName/ModuleName/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Sales\Model\Order\Email\Container\OrderIdentity">
<plugin name="enable_method" type="VendorName\ModuleName\Plugin\Sales\Order\Email\Container\OrderIdentityPlugin"/>
</type>
</config>
app/code/VendorName/ModuleName/Plugin/Sales/Order/Order/Email/Container/OrderIdentityPlugin.php
<?php
namespace VendorName\ModuleName\Plugin\Sales\Order\Email\Container;
class OrderIdentityPlugin
{
/**
* @var \Magento\Checkout\Model\Session $checkoutSession
*/
protected $checkoutSession;
/**
* @param \Magento\Checkout\Model\Session $checkoutSession
*
* @codeCoverageIgnore
*/
public function __construct(
\Magento\Checkout\Model\Session $checkoutSession
) {
$this->checkoutSession = $checkoutSession;
}
/**
* @param \Magento\Sales\Model\Order\Email\Container\OrderIdentity $subject
* @param callable $proceed
* @return bool
*/
public function aroundIsEnabled(\Magento\Sales\Model\Order\Email\Container\OrderIdentity $subject, callable $proceed)
{
$returnValue = $proceed();
$forceOrderMailSentOnSuccess = $this->checkoutSession->getForceOrderMailSentOnSuccess();
if (isset($forceOrderMailSentOnSuccess) && $forceOrderMailSentOnSuccess) {
if ($returnValue) {
$returnValue = false;
} else {
$returnValue = true;
}
$this->checkoutSession->unsForceOrderMailSentOnSuccess();
}
return $returnValue;
}
}
-
I want to disable order confirmation from api side not website side.Gagan– Gagan2020年08月23日 15:18:04 +00:00Commented Aug 23, 2020 at 15:18
-
Please implement above code once and place order using API.Pratik Oza– Pratik Oza2020年08月23日 15:26:11 +00:00Commented Aug 23, 2020 at 15:26
-
after follow this steps not sending emails of website orders.Please suggest how to send emails in website.Gagan– Gagan2020年08月31日 06:06:20 +00:00Commented Aug 31, 2020 at 6:06
-
Try above updated code.Pratik Oza– Pratik Oza2020年08月31日 08:41:50 +00:00Commented Aug 31, 2020 at 8:41
-
I try updated code but not getting any email. I recieved other emails like customer registration but not getting order confirmation email in website.Please checkGagan– Gagan2020年08月31日 10:39:58 +00:00Commented Aug 31, 2020 at 10:39