2014-11-24 3 views
9

ich einen wc-order-confirmed benutzerdefinierten Status hinzugefügt senden:WooCommerce - individuelle E-Mail auf kundenspezifischen Auftrag Statusänderung

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

ich eine E-Mail individuelle hinzugefügt 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 

ich die E-Mail in den E-Mail-Einstellungen sehen und den Status in der Dropdown-Liste der Auftragsstatus. Jetzt muss ich meine neue E-Mail immer senden, wenn der Bestellstatus auf wc-order-confirmed geändert wird. Der Übergangshaken scheint nie zu feuern.

ich auch versucht:

/** 
* 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); 
} 

, die überhaupt nicht zu funktionieren scheinen auch ... Irgendwelche Ideen, bitte?

Antwort

10

Wie Xcids Antwort zeigt, müssen Sie die E-Mail registrieren.

In WC 2.2+ Ich glaube, Sie können dies tun über die folgenden:

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

ich einen Filter zu WooCommerce 2.3 hinzugefügt hatte, so dass, wenn das kommt wird benutzerdefinierte E-Mails aus der Lage der hinzugefügt werden Liste der E-Mail-Aktionen, die WooCommerce registriert:

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

Der Haken Sie brauchen, ist:

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

Beste und einfache Lösung. Danke –

+0

der Haken ist korrekt und funktioniert. Sie können E-Mails bei jeder Statusänderung senden, auch wenn der Auftragsstatus gerade als "in Warteschleife" erstellt wurde. Der wc() -> mailer benutzt die php mail Klasse, so dass Sie sogar die wp_mail Funktion verwenden können, um E-Mails zu versenden und Anhänge hinzuzufügen, etc., die einfach zu benutzen ist, wenn Sie wissen wie man Mails mit PHP Skript versendet. –

4

Wie Sie hier sehen können:

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

mit Ihnen: https://github.com/woothemes/woocommerce/blob/f8a161c40673cb019eb96b04c04a774ca040a15a/includes/abstracts/abstract-wc-order.php#L2097 Sie diesen Haken verwenden können Benutzerdefinierter Status geben sollte:

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

Ich stelle mir vor, dass Sie auch Sie benutzerdefinierte hinzufügen, an den Mailer E-Mail, wenn nicht:

nur hinzufügen:

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:

Sie benötigen um Woocommerce-E-Mails vorher zu instanziieren, so können Sie

hinzufügen
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

Danke, das sieht vielversprechend aus! Was meinst du mit WC() -> Mailer()? – user1049961

+0

WC() -> mailer() ist eine interne Woocommerce-Funktion, die Woocommerce-E-Mail-Dienst instanziiert, mit anderen Worten die Funktion wird Ihre benutzerdefinierte Klasse instanziieren. – XciD

+0

Yup, ich verstehe das WC() -> Mailer() sollte meine Klasse instanziieren, aber ich bin mir nicht sicher, wo ich es setzen soll? Sie wollen es der "woocommerce_order_status_wc-order-confirmed" Aktion hinzufügen oder wo? – user1049961

0

adding a custom email class ist dies der beste Link eine eigene E-Mail-Klasse für WooCommerce hinzuzufügen. Hat mir geholfen, als ich dieses Problem konfrontiert

1

Sie können versuchen, zu sehen, wenn der Status, um so diese in functions.php setzen sich geändert:

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"); 

Diese Funktion wird Ihre E-Mail auslösen und versenden.