web-dev-qa-db-fra.com

WooCommerce - envoyer un courrier électronique personnalisé lors du changement de statut d'une commande personnalisée

J'ai ajouté un statut personnalisé wc-order-confirmed:

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

J'ai ajouté un email personnalisé 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

Je peux voir le courrier électronique dans les paramètres de courrier électronique et le statut dans la liste déroulante des statuts de commande. Maintenant, je dois envoyer mon nouvel email chaque fois que le statut de la commande est modifié en wc-order-confirmed. Le crochet de transition ne semble jamais tirer.

J'ai aussi essayé:

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

Qui aussi ne semble pas fonctionner du tout ... Des idées, s'il vous plaît?

11
user1049961

Comme l'indique la réponse de Xcid, vous devez enregistrer l'e-mail. 

Dans WC 2.2+, je pense que vous pouvez le faire via:

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

J'avais ajouté un filtre à WooCommerce 2.3. Par conséquent, les messages personnalisés pourront être ajoutés à la liste des actions de messagerie enregistrées par WooCommerce:

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

Le crochet dont vous avez besoin est: 

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

   }
}
14
Queli Coto

Vous pouvez essayer de voir quand le statut de la commande a changé alors mettez ceci dans 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");

Cette fonction déclenchera votre email et l'enverra.

2
JoseLazo

ajout d’une classe d’e-mail personnalisée C’est le meilleur lien pour ajouter une classe d’e-mail personnalisée pour woocommerce. M'a aidé quand j'ai fait face à ce problème

0
Mrinal