Home > OS >  Woocommerce hook not triggering emails for custom statuses
Woocommerce hook not triggering emails for custom statuses

Time:12-22

I've registered custom order statuses in a plugin I'm working on, but I can't get emails to fire when moving in or out of one of these statuses. (including to/from a core status, ie. the processing/completed emails don't fire when moving from a custom status).

I've registered every possible combination of actions I can think of (excluding on-hold and pending, based on our use case)

Can anyone tell me what I'm missing please?

Initial class:

<?php
/**
 * @author BAKKBONE Australia
 * @package Bkf_WC_Email
 * @license GNU General Public License (GPL) 3.0
**/

if ( ! defined( 'ABSPATH' ) ) {
    return;
}

/**
 * Class Bkf_WC_Email
 */
class Bkf_WC_Email {

    /**
     * Bkf_WC_Email constructor.
     */
    public function __construct() {
        add_action( 'woocommerce_email_classes', array( $this, 'bkf_register_email' ), 90, 1 );
        define( 'CUSTOM_WC_EMAIL_PATH', plugin_dir_path( __FILE__ ) );
        add_filter('woocommerce_email_actions', array($this, 'bkf_woocommerce_email_actions'), 10, 1);
    }

    /**
     * @param array $emails
     *
     * @return array
     */
    public function bkf_register_email( $emails ) {
        $emails['WC_Email_Customer_Scheduled_Order'] = include __DIR__ . 'emails/class-wc-customer-scheduled-order.php';
        $emails['WC_Email_Customer_Prepared_Order'] = include __DIR__ . 'emails/class-wc-customer-made-order.php';
        $emails['WC_Email_Customer_Out_for_Delivery_Order'] = include __DIR__ . 'emails/class-wc-customer-out-order.php';

        return $emails;
    }

    public function bkf_woocommerce_email_actions($actions)
    {
$actions[] = 'woocommerce_order_status_scheduled';
$actions[] = 'woocommerce_order_status_made';
$actions[] = 'woocommerce_order_status_out';
$actions[] = 'woocommerce_order_status_relay';
$actions[] = 'woocommerce_order_status_processing';
$actions[] = 'woocommerce_order_status_completed';
$actions[] = 'woocommerce_order_status_scheduled_to_made';
$actions[] = 'woocommerce_order_status_scheduled_to_out';
$actions[] = 'woocommerce_order_status_scheduled_to_relay';
$actions[] = 'woocommerce_order_status_scheduled_to_processing';
$actions[] = 'woocommerce_order_status_scheduled_to_completed';
$actions[] = 'woocommerce_order_status_made_to_scheduled';
$actions[] = 'woocommerce_order_status_made_to_out';
$actions[] = 'woocommerce_order_status_made_to_relay';
$actions[] = 'woocommerce_order_status_made_to_processing';
$actions[] = 'woocommerce_order_status_made_to_completed';
$actions[] = 'woocommerce_order_status_out_to_scheduled';
$actions[] = 'woocommerce_order_status_out_to_made';
$actions[] = 'woocommerce_order_status_out_to_relay';
$actions[] = 'woocommerce_order_status_out_to_processing';
$actions[] = 'woocommerce_order_status_out_to_completed';
$actions[] = 'woocommerce_order_status_relay_to_scheduled';
$actions[] = 'woocommerce_order_status_relay_to_made';
$actions[] = 'woocommerce_order_status_relay_to_out';
$actions[] = 'woocommerce_order_status_relay_to_processing';
$actions[] = 'woocommerce_order_status_relay_to_completed';
$actions[] = 'woocommerce_order_status_processing_to_scheduled';
$actions[] = 'woocommerce_order_status_processing_to_made';
$actions[] = 'woocommerce_order_status_processing_to_out';
$actions[] = 'woocommerce_order_status_processing_to_relay';
$actions[] = 'woocommerce_order_status_processing_to_completed';
$actions[] = 'woocommerce_order_status_completed_to_scheduled';
$actions[] = 'woocommerce_order_status_completed_to_made';
$actions[] = 'woocommerce_order_status_completed_to_out';
$actions[] = 'woocommerce_order_status_completed_to_relay';
$actions[] = 'woocommerce_order_status_completed_to_processing';
        $bkfoptions = get_option("bkf_options_setting");
        if($bkfoptions["bkf_petals"] == "1") {
$actions[] = 'woocommerce_order_status_new';
$actions[] = 'woocommerce_order_status_accept';
$actions[] = 'woocommerce_order_status_reject';
$actions[] = 'woocommerce_order_status_scheduled_to_new';
$actions[] = 'woocommerce_order_status_scheduled_to_accept';
$actions[] = 'woocommerce_order_status_scheduled_to_reject';
$actions[] = 'woocommerce_order_status_made_to_new';
$actions[] = 'woocommerce_order_status_made_to_accept';
$actions[] = 'woocommerce_order_status_made_to_reject';
$actions[] = 'woocommerce_order_status_out_to_new';
$actions[] = 'woocommerce_order_status_out_to_accept';
$actions[] = 'woocommerce_order_status_out_to_reject';
$actions[] = 'woocommerce_order_status_relay_to_new';
$actions[] = 'woocommerce_order_status_relay_to_accept';
$actions[] = 'woocommerce_order_status_relay_to_reject';
$actions[] = 'woocommerce_order_status_processing_to_new';
$actions[] = 'woocommerce_order_status_processing_to_accept';
$actions[] = 'woocommerce_order_status_processing_to_reject';
$actions[] = 'woocommerce_order_status_completed_to_new';
$actions[] = 'woocommerce_order_status_completed_to_accept';
$actions[] = 'woocommerce_order_status_completed_to_reject';
$actions[] = 'woocommerce_order_status_new_to_scheduled';
$actions[] = 'woocommerce_order_status_new_to_made';
$actions[] = 'woocommerce_order_status_new_to_out';
$actions[] = 'woocommerce_order_status_new_to_relay';
$actions[] = 'woocommerce_order_status_new_to_processing';
$actions[] = 'woocommerce_order_status_new_to_completed';
$actions[] = 'woocommerce_order_status_new_to_accept';
$actions[] = 'woocommerce_order_status_new_to_reject';
$actions[] = 'woocommerce_order_status_accept_to_scheduled';
$actions[] = 'woocommerce_order_status_accept_to_made';
$actions[] = 'woocommerce_order_status_accept_to_out';
$actions[] = 'woocommerce_order_status_accept_to_relay';
$actions[] = 'woocommerce_order_status_accept_to_processing';
$actions[] = 'woocommerce_order_status_accept_to_completed';
$actions[] = 'woocommerce_order_status_accept_to_new';
$actions[] = 'woocommerce_order_status_accept_to_reject';
$actions[] = 'woocommerce_order_status_reject_to_scheduled';
$actions[] = 'woocommerce_order_status_reject_to_made';
$actions[] = 'woocommerce_order_status_reject_to_out';
$actions[] = 'woocommerce_order_status_reject_to_relay';
$actions[] = 'woocommerce_order_status_reject_to_processing';
$actions[] = 'woocommerce_order_status_reject_to_completed';
$actions[] = 'woocommerce_order_status_reject_to_new';
$actions[] = 'woocommerce_order_status_reject_to_accept';
        }
        return $actions;
    }
  
}

new Bkf_WC_Email();

Specific email's class:

<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

if ( ! class_exists( 'WC_Email' ) ) {
    return;
}

/**
 * Class WC_Email_Customer_Out_for_Delivery_Order
 */
class WC_Email_Customer_Out_for_Delivery_Order extends WC_Email {

    /**
     * Create an instance of the class.
     *
     * @access public
     * @return void
     */
    function __construct() {

        $this->id          = 'customer_out_order';
        $this->title       = __( 'Order Out for Delivery', 'woocommerce' );
        $this->description = __( 'An email sent to the customer when an order is out for delivery.', 'woocommerce' );
        $this->customer_email = true;
        $this->heading     = __( 'Order Out for Delivery', 'woocommerce' );
        $this->subject     = sprintf( _x( '[%s] Order Out for Delivery', 'default email subject for out for delivery emails', 'woocommerce' ), '{blogname}' );

        $this->template_html  = 'emails/customer-out-order.php';
        $this->template_plain = 'emails/plain/customer-out-order.php';
        $this->template_base  = CUSTOM_WC_EMAIL_PATH . 'templates/';

        add_action( 'woocommerce_order_status_out', array( $this, 'trigger' ) );

        parent::__construct();
    }

    /**
     * Trigger Function that will send this email to the customer.
     *
     * @access public
     * @return void
     */
    function trigger( $order_id ) {
        $this->object = wc_get_order( $order_id );

        if ( version_compare( '3.0.0', WC()->version, '>' ) ) {
            $order_email = $this->object->billing_email;
        } else {
            $order_email = $this->object->get_billing_email();
        }

        $this->recipient = $order_email;


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

        $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
    }

    /**
     * Get content html.
     *
     * @access public
     * @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 );
    }

    /**
     * Get content plain.
     *
     * @return string
     */
    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 );
    }

}

return new WC_Email_Customer_Out_for_Delivery_Order();

I welcome any ideas :)

CodePudding user response:

I think you are missing the triggers. Try to hook into woocommerce_order_status_changed action and fire your e-mails as you wish based on $from and $to statuses.

Here's a preview with 3 examples:

function custom_woocommerce_order_status_changed( $order_id, $from, $to, $order ) {

    // Get all WC mailer emails
    $wc_emails = WC()->mailer()->get_emails();

    // Example A: Handle (from) 'my-custom-status' triggers
    if( $from == 'my-custom-status' ) {

        // Trigger 'completed' e-mail if changing to 'completed'
        if( $to == 'completed' ) {
            $wc_emails['WC_Email_Customer_Completed_Order']->trigger( $order_id );
        }
    }

    // Example B: Handle (from) 'processing' triggers
    if( $from == 'processing' ) {

        // Trigger 'my-custom-status' e-mail if changing to 'my-custom-status'
        if( $to == 'my-custom-status' ) {
            $wc_emails['WC_Email_Customer_My_Custom_Status_Order']->trigger( $order_id );
        }
    }

    // Example C: Handle (to) 'my-custom-status' triggers
    // This will fire the email for every order changed to this status (whatever the $from status is)
    if( $to == 'my-custom-status' ) {
        $wc_emails['WC_Email_Customer_My_Custom_Status_Order']->trigger( $order_id );
    }
}
add_action( 'woocommerce_order_status_changed', 'custom_woocommerce_order_status_changed', 20, 4 );

Note: Try to write these conditions as simply and straightforward as you can. Remember that if your order change scenario will be a duplicate, the e-mail will be also triggered (sent) multiple times.

  • Related