>source

저는 현재 WooCommerce 스토어를 타사와 통합하기 위한 플러그인을 개발 중이며 통합의 일환으로 고객에게 라이선스 키가 포함된 새 이메일을 보내야 합니다. 이메일 전송 기능은 정상이고 클래스와 해당 템플릿이 의도한 대로 작동하지만 이메일이 두 번 전송되고 이유를 알 수 없습니다.

새로운 이메일 클래스를 살펴보고 바닐라 WooCommerce 이메일 클래스와 비교했는데 어디가 잘못되었는지 알 수 없습니다. 나는 또한 사용하려고 시도했다if (did_action( 'woocommerce_order_status_completed_notification' )=== 1) {}트리거 기능을 하나의 이메일로 제한하려면 확인하십시오. 그리고 여전히 두 개를 보내고 있습니다.

내 이메일 클래스의 code가 여기에 있습니다. 여기에서 바닐라 이메일에서 예상대로 작동하는 기본 WooCommerce 후크 이외의 다른 것과 인터페이스하지 않기 때문에 문제가 있다고 가정합니다. 나는 여러 가지 다른 후크(바닐라 WooCommerce 것과 내 플러그인 code에서 호출하는 것)로 테스트했으며, 상관없이 동일한 이중 이메일을 받았습니다. 누구든지 내가 어디에서 잘못 가고 있는지 볼 수 있다면 엄청나게 도움이 될 것입니다!

<?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 &amp;
&amp;
 ! 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() &amp;
&amp;
 $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();
?>

약간의 수정 후에 이제 return new Foundry_Code_Email();을 제거하여 이것을 정렬할 수 있었습니다. 그러나 이것이 안정적인 수정인지 아닌지 확실하지 않습니다. 반환 선언 없이 내 클래스가 올바르게 작동합니까? 나는 모든 바닐라 WooCommerce 템플릿에 그것들이 있다는 것을 알았습니다.

MagnificentJake2022-02-15 03:57:13
  • 답변 # 1

    이 문제의 근본 문제는 이메일 클래스를 두 번 반환한다는 것이었습니다. 한 번은 클래스 파일 자체에서, 한 번은 내 전체 기능 파일에서.

    이것은 함수 파일에 있는 내 이전 code입니다.

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

    그리고 이것은 현재 해당 파일의 수정된 code입니다:

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

  • 이전 JSON 스키마는 숫자가 0 또는 1000보다 큰지 확인합니다.
  • 다음 Google 테스트에서 테스트 실행 중에 테스트를 실패한 대신 건너뛴 것으로 표시할 수 있습니다.