2016-11-16 156 views
3

我试图适应在https://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/添加自定义woocommerce电子邮件基于产品属性

我的意图找到自定义邮件插件是,如果客户选择产品(它是一个变量的产品),其具有特定属性,当客户发出新的订单时(它必须发送它正在等待处理或处理),就会发送一封自定义电子邮件。

我的属性slu is是“csr-dates”。自定义插件由两个文件组成(见上面的链接):woocommerce-csr-order-email.php和(存储在“includes”文件夹中)class-wc-csr-order-email.php

我想这个问题是在类文件,这是我到这里报到:

<?php 

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

/** 
* A custom Order WooCommerce Email class 
* 
* @since 0.1 
* @extends \WC_Email 
*/ 
class WC_CSR_Order_Email extends WC_Email { 


    /** 
    * Set email defaults 
    * 
    * @since 0.1 
    */ 
    public function __construct() { 

     // set ID, this simply needs to be a unique name 
     $this->id = 'customer_csr_order'; 
     $this->customer_email = true; 
     // this is the title in WooCommerce Email settings 
     $this->title = 'CSR Cruise Order'; 

     // this is the description in WooCommerce email settings 
     $this->description = 'CSR Cruise Order Notification emails are sent when a customer places an order for a CSR cruise'; 

     // these are the default heading and subject lines that can be overridden using the settings 
     $this->heading = 'CSR Cruise Order'; 
     $this->subject = 'CSR Cruise Order'; 

     // these define the locations of the templates that this email should use, we'll just use the new order template since this email is similar 
     $this->template_html = 'emails/customer-processing-order-csr.php'; //qui posso duplicare il template e farne uno ad hoc per questo tipo di mail con i file attached 
     $this->template_plain = 'emails/plain/customer-processing-order.php'; 

     // Trigger on new paid orders 
     add_action('woocommerce_order_status_pending_to_processing_notification', array($this, 'trigger')); 
     add_action('woocommerce_order_status_failed_to_processing_notification', array($this, 'trigger')); 
     add_action('woocommerce_order_status_pending_to_on-hold_notification', array($this, 'trigger')); 
     add_action('woocommerce_order_status_failed_to_on-hold_notification', array($this, 'trigger')); 
     // Call parent constructor to load any other defaults not explicity defined here 
     parent::__construct(); 


     // if none was entered, just use the WP admin email as a fallback 
     if (! $this->recipient) 
      $this->recipient = get_option('admin_email'); 
    } 


    /** 
    * Determine if the email should actually be sent and setup email merge variables 
    * 
    * @since 0.1 
    * @param int $order_id 
    */ 
    public function trigger($order_id) { 

     // bail if no order ID is present 
     if (! $order_id) 
      return; 

      $order = new WC_Order($order_id); 

      //step 1) find first the product_id 
      $items = $order->get_items(); 
      foreach ($items as $item) { 
       $product_id = $item['product_id']; 
      } 
       //set 2) from the product_id get the product attribute 
       $product = new WC_Product($product_id); // create an object of WC_Product class 

       $patt = $product->get_attribute(); // call get_attribute method 

      //step 3) condition valid to send the email (if the attributes is csr-dates) 
      if ($patt == 'pa_csr-dates' ) 
      { 
       //send the email 
       // setup order object 
       $this->object = new WC_Order($order_id); 
       $this->recipient = $this->object->billing_email; 

       // replace variables in the subject/headings 
       $this->find[] = '{order_date}'; 
       $this->replace[] = date_i18n(woocommerce_date_format(), strtotime($this->object->order_date)); 

       $this->find[] = '{order_number}'; 
       $this->replace[] = $this->object->get_order_number(); 

       if (! $this->is_enabled() || ! $this->get_recipient()) 
        return; 

       // woohoo, send the email! 
       $this->send($this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments()); 

      } 

      else 
      { 
       return; //do nothing if is not csr-dates attribute 
      } 
    } 


    /** 
    * get_content_html function. 
    * 
    * @since 0.1 
    * @return string 
    */ 
    public function get_content_html() { 
     ob_start(); 
     woocommerce_get_template($this->template_html, array(
      'order'   => $this->object, 
      'email_heading' => $this->get_heading(), 
      'sent_to_admin' => false, 
      'plain_text' => false, 
      'email'   => $this 
     )); 
     return ob_get_clean(); 
    } 


    /** 
    * get_content_plain function. 
    * 
    * @since 0.1 
    * @return string 
    */ 
    public function get_content_plain() { 
     ob_start(); 
     woocommerce_get_template($this->template_plain, array(
      'order'   => $this->object, 
      'email_heading' => $this->get_heading(), 
      'sent_to_admin' => false, 
      'plain_text' => true, 
      'email'   => $this 
     )); 
     return ob_get_clean(); 
    } 


    /** 
    * Initialize Settings Form Fields 
    * 
    * @since 2.0 
    */ 
    public function init_form_fields() { 

     $this->form_fields = array(
      'enabled' => array(
       'title' => 'Enable/Disable', 
       'type' => 'checkbox', 
       'label' => 'Enable this email notification', 
       'default' => 'yes' 
      ), 
      'subject' => array(
       'title'  => 'Subject', 
       'type'  => 'text', 
       'description' => sprintf('This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', $this->subject), 
       'placeholder' => '', 
       'default'  => '' 
      ), 
      'heading' => array(
       'title'  => 'Email Heading', 
       'type'  => 'text', 
       'description' => sprintf(__('This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.'), $this->heading), 
       'placeholder' => '', 
       'default'  => '' 
      ), 
      'email_type' => array(
       'title'  => 'Email type', 
       'type'  => 'select', 
       'description' => 'Choose which format of email to send.', 
       'default'  => 'html', 
       'class'  => 'email_type', 
       'options'  => array(
        'plain'  => __('Plain text', 'woocommerce'), 
        'html'  => __('HTML', 'woocommerce'), 
        'multipart' => __('Multipart', 'woocommerce'), 
       ) 
      ) 
     ); 
    } 


} // end \WC_CSR_Order_Email class 

我想,什么是错的代码,我写来获得属性(步骤1-2)和/或发送的条件电子邮件(步骤3)。

有人可以帮我解决这个问题吗?谢谢

回答

5

而不是使用get_attribute()功能,你应该尝试使用get_attributes()这样:

//set 2) from the product_id get the product attribute 
$product = new WC_Product($product_id); // create an object of WC_Product class 

$patt = $product->get_attributes(); // call get_attributes method 

//step 3) condition valid to send the email (if the attributes is csr-dates) 
if (array_key_exists('pa_csr-dates', $patt)) 
{ 

试试吧,这应该工作...

+0

非常感谢@LoicTheAztec!它工作完美! –

+0

我忘了!谢谢。还为您的答案添加了分数 –