WooCommerce Email Triggering Twice (2x sends)
-
I have a custom email sent when products in certain shipping classes are ordered. This email is sent to one of our fulfillment centers with the items ordered that they need to fulfill. My problem right now is I have some code to generate an order programmatically, and those orders end up triggering the email twice. This is an issue because I don’t want my fulfillment center to end up shipping more than one package for the same order.
Here’s my custom email class:
<?php if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! class_exists( 'WC_Fulfillment_Order_Email' ) ) : /** * A custom Expedited Order WooCommerce Email class */ class WC_Fulfillment_Order_Email extends WC_Email { /** * Constructor. */ public function __construct() { $this->id = 'wc_fulfillment_order'; $this->title = 'Fulfillment Order'; $this->description = 'Fulfillment Order Notification emails are sent when an Fulfillment product is purchased.'; $this->heading = 'Fulfillment Shipping Order'; $this->subject = 'Fulfillment Shipping Order'; $this->template_html = 'emails/new-fulfillment-order.php'; $this->template_plain = 'emails/plain/new-fulfillment-order.php'; // Triggers for this email add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_pending_to_completed_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_pending_to_on-hold_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_failed_to_on-hold_notification', array( $this, 'trigger' ) ); // Call parent constructor parent::__construct(); // Other settings $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) ); } /** * Trigger. * * @param int $order_id */ public function trigger( $order_id ) { if ( $order_id ) { $this->object = wc_get_order( $order_id ); $this->find['order-date'] = '{order_date}'; $this->find['order-number'] = '{order_number}'; $this->replace['order-date'] = date_i18n( wc_date_format(), strtotime( $this->object->order_date ) ); $this->replace['order-number'] = $this->object->get_order_number(); } if ( ! $this->is_enabled() || ! $this->get_recipient() ) { return; } $fulfillment = false; foreach ($this->object->get_items() as $item) { $product = new WC_Product($item['product_id']); if ($product->get_shipping_class() == 'fulfillment') { $fulfillment = true; } } if (!$fulfillment) return; $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); } /** * Get content html. * * @access public * @return string */ public function get_content_html() { return wc_get_template_html( $this->template_html, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => true, 'plain_text' => false, 'email' => $this ) ); } /** * Get content plain. * * @access public * @return string */ public function get_content_plain() { return wc_get_template_html( $this->template_plain, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => true, 'plain_text' => true, 'email' => $this ) ); } /** * Initialise settings form fields. */ public function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __( 'Enable/Disable', 'woocommerce' ), 'type' => 'checkbox', 'label' => __( 'Enable this email notification', 'woocommerce' ), 'default' => 'yes' ), 'recipient' => array( 'title' => __( 'Recipient(s)', 'woocommerce' ), 'type' => 'text', 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', 'woocommerce' ), esc_attr( get_option('admin_email') ) ), 'placeholder' => '', 'default' => '', 'desc_tip' => true ), 'subject' => array( 'title' => __( 'Subject', 'woocommerce' ), 'type' => 'text', 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'woocommerce' ), $this->subject ), 'placeholder' => '', 'default' => '', 'desc_tip' => true ), 'heading' => array( 'title' => __( 'Email Heading', 'woocommerce' ), 'type' => 'text', 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'woocommerce' ), $this->heading ), 'placeholder' => '', 'default' => '', 'desc_tip' => true ), 'email_type' => array( 'title' => __( 'Email type', 'woocommerce' ), 'type' => 'select', 'description' => __( 'Choose which format of email to send.', 'woocommerce' ), 'default' => 'html', 'class' => 'email_type wc-enhanced-select', 'options' => $this->get_email_type_options(), 'desc_tip' => true ) ); } } endif; return new WC_Fulfillment_Order_Email();
And here’s the code that triggers the new order:
$address = array( 'first_name' => $payload['customer']['firstName'], 'last_name' => $payload['customer']['lastName'], 'email' => $payload['customer']['email'], 'phone' => $payload['customer']['phone'], 'address_1' => $payload['customer']['line1'], 'address_2' => $payload['customer']['line2'], 'city' => $payload['customer']['city'], 'state' => $payload['customer']['state'], 'postcode' => $payload['customer']['zip'], 'country' => 'US' ); $order = wc_create_order(); foreach ($payload['items'] as $item) { $order->add_product( get_product_by_sku( $item['sku'] ), $item['qty'] ); } $order->set_address( $address, 'billing' ); $order->set_address( $address, 'shipping' ); $order->update_status('processing'); $order->calculate_totals();
I’ve tried removing
$order->update_status('processing');
and just instantiating the order with that status by usingwc_create_order(array('status' => 'processing'));
but that just ended up not sending any emails. Also tried limiting the triggers to one, just usingwoocommerce_order_status_pending_to_processing_notification
but that still sends it twice.Thanks!
- The topic ‘WooCommerce Email Triggering Twice (2x sends)’ is closed to new replies.