2014-11-24 20 views
9

Tôi đã thêm một trạng thái tùy chỉnh wc-order-confirmed:WooCommerce - gửi email tùy chỉnh trên để tùy chỉnh thay đổi trạng thái

// Register new status 
function register_order_confirmed_order_status() { 
    register_post_status('wc-order-confirmed', array(
     'label' => 'Potvrzení objednávky', 
     'public' => true, 
     'exclude_from_search' => false, 
     'show_in_admin_all_list' => true, 
     'show_in_admin_status_list' => true, 
     'label_count' => _n_noop('Potvrzení objednávky <span class="count">(%s)</span>', 'Potvrzení objednávky <span class="count">(%s)</span>') 
    )); 
} 
add_action('init', 'register_order_confirmed_order_status'); 

// Add to list of WC Order statuses 
function add_order_confirmed_to_order_statuses($order_statuses) { 
    $new_order_statuses = array(); 
// add new order status after processing 
    foreach ($order_statuses as $key => $status) { 
     $new_order_statuses[ $key ] = $status; 
     if ('wc-processing' === $key) { 
      $new_order_statuses['wc-order-confirmed'] = 'Potvrzení objednávky'; 
     } 
    } 
    return $new_order_statuses; 
} 
add_filter('wc_order_statuses', 'add_order_confirmed_to_order_statuses'); 

Tôi đã thêm một email tùy chỉnh wc_confirmed_order:

/** 
* A custom confirmed Order WooCommerce Email class 
* 
* @since 0.1 
* @extends \WC_Email 
*/ 
class WC_Confirmed_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 = 'wc_confirmed_order'; 

     // this is the title in WooCommerce Email settings 
     $this->title = 'Potvrzení objednávky'; 

     // this is the description in WooCommerce email settings 
     $this->description = 'Confirmed Order Notification'; 

     // these are the default heading and subject lines that can be overridden using the settings 
     $this->heading = 'Potvrzení objednávky'; 
     $this->subject = 'Potvrzení objednávky'; 

     // 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-confirmed-order.php'; 
     $this->template_plain = 'emails/plain/admin-new-order.php'; 

     // Trigger on confirmed orders 
     add_action('woocommerce_order_status_pending_to_order_confirmed', array($this, 'trigger')); 
     add_action('woocommerce_order_status_processing_to_order_confirmed', array($this, 'trigger')); 

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

     // this sets the recipient to the settings defined below in init_form_fields() 
     $this->recipient = $this->get_option('recipient'); 

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

     if ($order_id) { 
      $this->object  = wc_get_order($order_id); 
      $this->recipient = $this->object->billing_email; 

      $this->find['order-date']  = '{order_date}'; 
      $this->find['order-number'] = '{order_number}'; 

      $this->replace['order-date'] = date_i18n(wc_date_format(), strtotime($this->object->order_date)); 
      $this->replace['order-number'] = $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()); 
    } 


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


    /** 
    * get_content_plain function. 
    * 
    * @since 0.1 
    * @return string 
    */ 
    public function get_content_plain() { 
     ob_start(); 
     wc_get_template($this->template_plain, array(
      'order'   => $this->object, 
      'email_heading' => $this->get_heading() 
     )); 
     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' 
      ), 
      'recipient' => array(
       'title'  => 'Recipient(s)', 
       'type'  => 'text', 
       'description' => sprintf('Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', esc_attr(get_option('admin_email'))), 
       'placeholder' => '', 
       'default'  => '' 
      ), 
      '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_confirmed_Order_Email class 

tôi có thể thấy email trong phần cài đặt email và trạng thái trong menu thả xuống trạng thái đơn đặt hàng. Bây giờ, tôi cần gửi email mới của mình bất cứ khi nào trạng thái đơn đặt hàng được thay đổi thành wc-order-confirmed. Móc chuyển tiếp dường như không bao giờ bắn.

Tôi cũng đã cố gắng:

/** 
* Register the "woocommerce_order_status_pending_to_quote" hook which is necessary to 
* allow automatic email notifications when the order is changed to refunded. 
* 
* @modified from http://stackoverflow.com/a/26413223/2078474 to remove anonymous function 
*/ 
add_action('woocommerce_init', 'so_25353766_register_email'); 
function so_25353766_register_email(){ 
    add_action('woocommerce_order_status_pending_to_order_confirmed', array(WC(), 'send_transactional_email'), 10, 10); 
    add_action('woocommerce_order_status_processing_to_order_confirmed', array(WC(), 'send_transactional_email'), 10, 10); 
} 

nào cũng dường như không làm việc ở tất cả ... Bất kỳ ý kiến, xin vui lòng?

Trả lời

10

Khi câu trả lời của Xcid cho biết, bạn cần đăng ký email.

Trong WC 2.2 + Tôi tin rằng bạn có thể làm điều này thông qua như sau:

add_action('woocommerce_order_status_wc-order-confirmed', array(WC(), 'send_transactional_email'), 10, 10); 

tôi đã thêm một bộ lọc để WooCommerce 2.3, vì vậy khi mà đi ra khỏi các email tùy chỉnh sẽ có thể được thêm vào danh sách các hành động email wooCommerce đăng ký:

// As of WooCommerce 2.3 
function so_27112461_woocommerce_email_actions($actions){ 
    $actions[] = 'woocommerce_order_status_wc-order-confirmed'; 
    return $actions; 
} 
add_filter('woocommerce_email_actions', 'so_27112461_woocommerce_email_actions'); 
12

Các móc gì bạn cần là:

woocommerce_order_status_changed

add_action("woocommerce_order_status_changed", "my_awesome_publication_notification"); 

function my_awesome_publication_notification($order_id, $checkout=null) { 
    global $woocommerce; 
    $order = new WC_Order($order_id); 
    if($order->status === 'completed') { 
     // Create a mailer 
     $mailer = $woocommerce->mailer(); 

     $message_body = __('Hello world!!!'); 

     $message = $mailer->wrap_message(
     // Message head and message body. 
     sprintf(__('Order %s received'), $order->get_order_number()), $message_body); 


     // Cliente email, email subject and message. 
    $mailer->send($order->billing_email, sprintf(__('Order %s received'), $order->get_order_number()), $message); 
    } 

    } 
} 
+0

Giải pháp tốt nhất và đơn giản nhất. Cảm ơn –

+0

móc là chính xác và hoạt động. bạn có thể gửi thư trên bất kỳ thay đổi trạng thái nào ngay cả khi trạng thái đơn đặt hàng vừa được tạo thành "đang giữ". wc() -> mailer đang sử dụng lớp thư php, vì vậy bạn thậm chí có thể sử dụng hàm wp_mail để gửi thư và thêm tệp đính kèm, v.v. khá đơn giản để sử dụng nếu bạn biết cách gửi thư bằng tập lệnh php. –

4

Như bạn có thể thấy ở đây: https://github.com/woothemes/woocommerce/blob/f8a161c40673cb019eb96b04c04a774ca040a15a/includes/abstracts/abstract-wc-order.php#L2097 bạn có thể sử dụng hook này:

do_action('woocommerce_order_status_' . $new_status, $this->id);

với bạn trạng thái tùy chỉnh nên cung cấp:

add_action('woocommerce_order_status_wc-order-confirmed' , array($this, 'trigger'));

Tôi tưởng tượng rằng bạn cũng có thêm bạn tùy chỉnh email đến bưu phẩm, nếu không muốn nói:

chỉ cần thêm:

add_filter('woocommerce_email_classes', array($this,'edit_woocommerce_email_classes')); 
function edit_woocommerce_email_classes($email_classes) { 
    require_once('your-email-class.php'); 
    $email_classes[ 'WC_Confirmed_Order_Email' ] = new WC_Confirmed_Order_Email(); 
    return $email_classes; 
} 

Edit:

Bạn cần để instanciate email woocommerce trước khi bạn có thể thêm

add_action('init' , 'initiate_woocommerce_email'); 

function initiate_woocommerce_email(){ 
    // Just when you update the order_status on backoffice 
    if(isset($_POST['order_status'])) { 
     WC()->mailer(); 
    } 
} 
+0

Cảm ơn, điều này có vẻ đầy hứa hẹn! Bạn có ý gì bằng cách thêm WC() -> mailer()? – user1049961

+0

WC() -> mailer() là một hàm woocommerce nội bộ hỗ trợ dịch vụ email woocommerce, nói cách khác hàm sẽ instanciate lớp tùy chỉnh của bạn. – XciD

+0

Yup, tôi hiểu WC() -> bưu phẩm() nên instanciate lớp học của tôi, nhưng tôi không chắc chắn nơi để đặt nó? Bạn muốn thêm nó vào hành động 'woocommerce_order_status_wc-order-confirmed' hoặc ở đâu? – user1049961

0

adding a custom email class này là liên kết tốt nhất cho việc thêm một lớp email tùy chỉnh cho woocommerce. Giúp tôi khi tôi phải đối mặt với vấn đề này

1

Bạn có thể thử để xem khi tình trạng trật tự thay đổi để đưa điều này vào functions.php:

function confirmed_notifications($order_id, $checkout=null) { 
    global $woocommerce; 
    $order = new WC_Order($order_id); 

    if($order->status === 'order-confirmed') { 

     // Trigger transactional email to client 
     $email = $mailer->emails['WC_Confirmed_Order_Email']; 
     $email->trigger($order_id); 
    } 
} 
add_action("woocommerce_order_status_changed", "confirmed_notifications"); 

Chức năng này sẽ kích hoạt email của bạn và gửi nó.

Các vấn đề liên quan