Home > Mobile >  Wordpress Custom Email Sending Twice
Wordpress Custom Email Sending Twice

Time:02-15

I'm developing a plugin to integrate my WooCommerce store with a third-party right now, and as part of that integration I need to send the customer a new email with some license keys in it. The email sending functionality is fine, the class and its template are working as intended, but the email's sending twice, and I can't figure out why.

I've combed over the new email class and compared it with vanilla WooCommerce email classes, and can't tell where I'm going wrong. I've also tried using an if (did_action( 'woocommerce_order_status_completed_notification' ) === 1) {} check to limit the trigger function to one email, and even still it's sending two.

The code for my email class is here, which is where I'm assuming the problem to be as it doesn't interface with anything other than the default WooCommerce hooks that are working as expected with the vanilla emails. I've tested it with a number of different hooks (both vanilla WooCommerce ones and those I'm calling from my plugin's code), and I'm getting this same double email regardless. If anyone can see where I'm going wrong it'd be tremendously helpful!

<?php

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if ( ! class_exists( 'Foundry_Code_Email', false ) ) :

    class Foundry_Code_Email extends WC_Email {

        /**
        * Set email defaults
        */

        public function __construct() {
        

            $this->id = 'foundry_code_email'; // Unique ID for custom email
            $this->customer_email = true; // Is a customer email
            $this->title = __( 'Foundry Premium Content Email', 'woocommerce' ); // Title field in WooCommerce Email settings
            $this->description = __( 'Foundry email is sent when customer purchases Foundry Premium Content', 'woocommerce' ); // Description field in WooCommerce email settings
            $this->template_base    = WP_PLUGIN_DIR . '/foundry-premium-content/templates/';
            $this->template_html = 'emails/foundry-code-email.php';
            $this->template_plain = 'emails/plain/foundry-code-email.php';
            // $this->template_html = 'emails/customer-refunded-order.php';
            $this->placeholders = array(
                // '{site_title}'   => $this->get_blogname(),
                '{order_date}'  => '',
                '{order_number}' => '',
            );

            // Trigger email when woocommerce_order_status_completed_notification is called when payment is complete - double email debug
            add_action( 'woocommerce_order_status_completed_notification', array( $this, 'trigger' ), 10, 2 );

            // Call parent constructor to load any other defaults not explicitly defined here.
            parent::__construct();
        }

        /**
        * Prepares email content and triggers the email
        *
        * @param int $order_id
        */
        public function trigger( $order_id, $order = false ) {
            $this->setup_locale();  

            if ( $order_id && ! is_a( $order, 'WC_Order') ) {
                $order = wc_get_order( $order_id );
            }

            if ( is_a( $order, 'WC_Order' ) ) {
                $this->object                           = $order;
                $this->recipient                        = $this->object->get_billing_email();
                $this->placeholders['{order_date}']     = wc_format_datetime( $this->object->get_date_created() );
                $this->placeholders['{order_number}']   = $this->object->get_order_number();

                // Maybe include an additional check to make sure that stuff happened
            }

            if ( $this->is_enabled() && $this->get_recipient() ) {
                // All well, send the email
                $this->send ( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
            }

            $this->restore_locale();

            // Add order note about the same
            $this->object->add_order_note( sprintf(__('%s email sent to the customer.', 'woocommerce'), $this->get_title() ) );

            // Set order meta to indicate that the welcome email was sent
            update_post_meta( $order_id, 'foundry_code_email_sent', 1);
        } 

        /**
        * Get email subject.
        *
        * @since 3.1.0
        * @return string
        */
        public function get_default_subject() {
            return __( '{site_title}: Foundry VTT Premium Content Codes', 'woocommerce' ); 
        }

        /**
        * Get email heading
        *
        * @since 3.1.0
        * @return string
        */
        public function get_default_heading() {
            return __('Your Foundry Premium Content Codes', 'woocommerce' );
        }

        /**
        * get_content_html function
        *
        * @return string
        */
        public function get_content_html() {
            return wc_get_template_html(
                    $this->template_html,
                    array(
                        'order'              => $this->object,
                        'email_heading'      => $this->get_heading(),
                        'additional_content' => $this->get_additional_content(),
                        'sent_to_admin'      => false,
                        'plain_text'         => false,
                        'email'              => $this,
                    ), '', $this->template_base
                );
        }

        public function get_content_plain() {
            return wc_get_template_html(
                    $this->template_plain,
                    array(
                        'order'              => $this->object,
                        'email_heading'      => $this->get_heading(),
                        'additional_content' => $this->get_additional_content(),
                        'sent_to_admin'      => false,
                        'plain_text'         => true,
                        'email'              => $this,
                    ), '', $this->template_base
                );
        } 

        public function get_default_additional_content() {
            return __( 'Thanks for shopping with us.', 'woocommerce' );
        }



        /*
        * 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',
                        'default'   => 'yes'
                ),
                'subject'   => array(
                        'title'     => __( 'Subject', 'woocommerce' ),
                        'type'      => 'text',
                        'desc_tip'  => true,
                        'description'   => sprintf( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', $this->get_subject() ),
                        'placeholder'   => $this->get_default_subject(),
                        'default'   => ''
                ),
                'heading'   => array(
                        'title'     => __( 'Email Heading', 'woocommerce' ),
                        'type'      => 'text',
                        'desc_tip'  => true,
                        'description'   => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.' ), $this->get_heading() ),
                        'placeholder'   => $this->get_default_heading(),
                        'default'   => ''
                ),
                '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 Foundry_Code_Email();

?>

CodePudding user response:

I found the root issue with this was that I was returning the email class twice: once in the class file itself and once in my overall functions file.

This was my old code in that functions file:

function fpc_custom_woocommerce_emails( $email_classes ) {
    // Custom email for Foundry Premium Content

    $plugin_dir = dirname(__DIR__);

    include_once( $plugin_dir . '/Includes/class-foundry-code-email.php' );

    $email_classes['Foundry_Code_Email'] = new Foundry_Code_Email(); // Add to the list of email classes that WooCommerce loads.

    return $email_classes;
}

And this is the revised code in that file now:

function fpc_custom_woocommerce_emails( $email_classes ) {
    // Custom email for Foundry Premium Content

    $plugin_dir = dirname(__DIR__);
    $email_classes['Foundry_Code_Email'] = include_once( $plugin_dir . '/Includes/class-foundry-code-email.php' );
    return $email_classes;
}
  • Related