Wordpress 自定义电子邮件发送两次

Wordpress Custom Email Sending Twice

我现在正在开发一个插件来将我的 WooCommerce 商店与第三方集成,作为该集成的一部分,我需要向客户发送一封新电子邮件,其中包含一些许可证密钥。电子邮件发送功能很好,class 及其模板按预期工作,但电子邮件发送了两次,我不明白为什么。

我梳理了新电子邮件 class 并将其与普通 WooCommerce 电子邮件 class 进行了比较,但无法判断我哪里出错了。我也尝试过使用 if (did_action( 'woocommerce_order_status_completed_notification' ) === 1) {} 检查将触发功能限制为一封电子邮件,甚至它仍然发送两封。

我的电子邮件 class 的代码在这里,这是我假设问题所在的地方,因为它不与除按预期工作的默认 WooCommerce 挂钩之外的任何东西交互香草电子邮件。我已经用许多不同的挂钩(包括香草 WooCommerce 挂钩和我从插件代码中调用的挂钩)对其进行了测试,但无论如何我都会收到同样的双重电子邮件。如果有人能看出我哪里出错了,那将非常有帮助!

<?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();

?>

我发现根本问题是我两次返回电子邮件 class:一次在 class 文件本身,一次在我的整体功能文件中。

这是我在那个函数文件中的旧代码:

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;
}

现在这是该文件中修改后的代码:

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;
}