• Resolved magnificentjake

    (@magnificentjake)


    Hi folks,

    Asked this in the main WordPress forums and was pointed over here as well.

    I’m in the middle of developing a custom plugin for integrating my WooCommerce store with a third-party. As part of that integration I’m sending a new email, which (after some kind help on these forums!) is sending fine. The trouble is, the email in question is sending twice and I’m not sure why. I’m sure it’s something simple, but I can’t spot what it is.

    Can any of you kind folks spot where I’m going wrong in my email class below? I *think* this is where the problem ought to be.

    <?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
    			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 __( 'Foundry 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();
    
    ?>
Viewing 4 replies - 1 through 4 (of 4 total)
  • Hi, @magnificentjake!

    It is great to know you are developing a custom plugin for your WooCommerce integration. The WooCommerce developer resources found here could be helpful.

    Since what you are trying to achieve requires custom coding, which is outside our scope of support, I am leaving this thread open for a bit to see if anyone can chime in to help you out.

    For additional assistance on this topic, we recommend getting in touch with one of the customization experts listed on the WooCommerce Customizations Page.

    Also, you can visit the WooCommerce Facebook group or the #developers channel of the WooCommerce Community Slack, you could find help from the community of open-source developers for WooCommerce that hangs in there.

    Cheers!

    Thread Starter magnificentjake

    (@magnificentjake)

    Ok, so I actually managed to fix it myself, but I’m not sure if my fix is problematic? Removing the return new Foundry_Code_Email(); clause at the end of the php file appears to have sorted it, but I notice that all the WooCommerce core templates have a return clause at the end.

    Is this going to cause problems?

    Hi @magnificentjake

    Glad to know you managed to fix it.

    Kindly note that custom coding being outside of the scope of this forum, this isn’t the best place to evaluate the custom coded plugin and provide suggestions.

    We encourage you to make use of the resources stated in our previous interaction, where developers hang out, and you can get helpful inputs for sure.

    Cheers

    This thread has been inactive for a bit, so I’m going to mark it as closed.

    Please feel free to open a new thread if you have any other questions.

Viewing 4 replies - 1 through 4 (of 4 total)

The topic ‘WooCommerce Email Triggering Twice’ is closed to new replies.