Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a new order status that Send an email notification in WooCommerce 4+

I would like to add a new order status and email notification to my site in conjunction with this order status. I tried this code:

// register a custom post status 'awaiting-delivery' for Orders
add_action( 'init', 'register_custom_post_status', 20 );
function register_custom_post_status() {
    register_post_status( 'wc-awaiting-delivery', array(
        'label'                     => _x( 'Kargoya Verildi', 'Order status', 'woocommerce' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Kargoya Verildi <span class="count">(%s)</span>', 'Kargoya Verildi <span class="count">(%s)</span>', 'woocommerce' )
    ) );
}

// Adding custom status 'awaiting-delivery' to order edit pages dropdown
add_filter( 'wc_order_statuses', 'custom_wc_order_statuses', 20, 1 );
function custom_wc_order_statuses( $order_statuses ) {
    $order_statuses['wc-awaiting-delivery'] = _x( 'Kargoya Verildi', 'Order status', 'woocommerce' );
    return $order_statuses;
}

// Adding custom status 'awaiting-delivery' to admin order list bulk dropdown
add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 20, 1 );
function custom_dropdown_bulk_actions_shop_order( $actions ) {
    $actions['mark_awaiting-delivery'] = __( 'Kargoya Verildi', 'woocommerce' );
    return $actions;
}

// Adding action for 'awaiting-delivery'
add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 );
function custom_email_actions( $action ) {
    $actions[] = 'woocommerce_order_status_wc-awaiting-delivery';
    return $actions;
}

add_action( 'woocommerce_order_status_wc-awaiting-delivery', array( WC(), 'send_transactional_email' ), 10, 1 );

// Sending an email notification when order get 'awaiting-delivery' status
add_action('woocommerce_order_status_awaiting-delivery', 'backorder_status_custom_notification', 20, 2);
function backorder_status_custom_notification( $order_id, $order ) {
    // HERE below your settings
    $heading   = __('Kargoya Verildi','woocommerce');
    $subject   = '[{site_title}] Siparişiniz Kargoya Verildi ({order_number}) - {order_date}';

    // Getting all WC_emails objects
    $mailer = WC()->mailer()->get_emails();

    // Customizing Heading and subject In the WC_email processing Order object
    $mailer['WC_Email_Customer_Processing_Order']->heading = $heading;
    $mailer['WC_Email_Customer_Processing_Order']->subject = $subject;

    // Sending the customized email
    $mailer['WC_Email_Customer_Processing_Order']->trigger( $order_id );
}

But the code doesn't send e-mail. How can I fix this situation? I tried a few other codes. But none of them worked.

NOTE: I am typing this code in the function.php file, do I need to write it somewhere different?

like image 341
Alperen Eroğlu Avatar asked Oct 30 '20 11:10

Alperen Eroğlu


People also ask

How to manage WooCommerce orders?

Orderable helps you to create new custom order statuses for your WooCommerce store and add email notifications for them. It also allows you to edit existing or core order statuses, all so you can take care of your orders without the hassle. The WooCommerce plugin designed to help store owners manage their orders with ease.

How do I add a custom order status in WordPress?

When on your WordPress dashboard, go to Orderable > Custom Order Status and click the Add New button at the top of the page. While on the Edit Custom Order Status page, give your new order status a status name. Then, click the checkbox next to Enabled, to have this order status appear on the Orders page.

What is the WooCommerce after-purchase email plugin?

If you're running a WooCommerce store, the default email messages are very generic and absolutely need to be customized. This plugin makes the process a lot faster, simpler, less prone to error, and of course with more features. It's a must-have if you're using WooCommerce. Why should you bother with after-purchase emails?

How do I remove personal data retention in WooCommerce?

Go to: WooCommerce > Settings > Accounts & Privacy. Enable Remove access to downloads on request, if the customer should no longer access the download links once their personal details have been removed. Personal data retention can also be automated.


Video Answer


1 Answers

Based on this answer code and this unaccepted answer thread, Here is the revisited code, that will add a custom status to WooCommerce orders and will trigger a customized email notification for this custom status:

// register a custom post status 'awaiting-delivery' for Orders
add_action( 'init', 'register_custom_post_status', 20 );
function register_custom_post_status() {
    register_post_status( 'wc-awaiting-delivery', array(
        'label'                     => _x( 'Kargoya Verildi', 'Order status', 'woocommerce' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Kargoya Verildi <span class="count">(%s)</span>', 'Kargoya Verildi <span class="count">(%s)</span>', 'woocommerce' )
    ) );
}

// Adding custom status 'awaiting-delivery' to order edit pages dropdown
add_filter( 'wc_order_statuses', 'custom_wc_order_statuses' );
function custom_wc_order_statuses( $order_statuses ) {
    $order_statuses['wc-awaiting-delivery'] = _x( 'Kargoya Verildi', 'Order status', 'woocommerce' );
    return $order_statuses;
}

// Adding custom status 'awaiting-delivery' to admin order list bulk dropdown
add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 20, 1 );
function custom_dropdown_bulk_actions_shop_order( $actions ) {
    $actions['mark_awaiting-delivery'] = __( 'Kargoya Verildi', 'woocommerce' );
    return $actions;
}

// Adding action for 'awaiting-delivery'
add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 );
function custom_email_actions( $actions ) {
    $actions[] = 'woocommerce_order_status_wc-awaiting-delivery';
    return $actions;
}

add_action( 'woocommerce_order_status_wc-awaiting-delivery', array( WC(), 'send_transactional_email' ), 10, 1 );

// Sending an email notification when order get 'awaiting-delivery' status
add_action('woocommerce_order_status_awaiting-delivery', 'awaiting_delivery_order_status_email_notification', 20, 2);
function awaiting_delivery_order_status_email_notification( $order_id, $order ) {
    // HERE below your settings
    $heading   = __('Kargoya Verildi','woocommerce');
    $subject   = '[{site_title}] Siparişiniz Kargoya Verildi ({order_number}) - {order_date}';

        // The email notification type
        $email_key   = 'WC_Email_Customer_Processing_Order';

        // Get specific WC_emails object
        $email_obj = WC()->mailer()->get_emails()[$email_key];

        // Sending the customized email
        $email_obj->trigger( $order_id );
}

// Customize email heading for this custom status email notification
add_filter( 'woocommerce_email_heading_customer_processing_order', 'email_heading_customer_awaiting_delivery_order', 10, 2 );
function email_heading_customer_awaiting_delivery_order( $heading, $order ){
    if( $order->has_status( 'awaiting-delivery' ) ) {
        $email_key   = 'WC_Email_Customer_Processing_Order'; // The email notification type
        $email_obj   = WC()->mailer()->get_emails()[$email_key]; // Get specific WC_emails object
        $heading_txt = __('Kargoya Verildi','woocommerce'); // New heading text

        return $email_obj->format_string( $heading_txt );
    }
    return $heading;
}

// Customize email subject for this custom status email notification
add_filter( 'woocommerce_email_subject_customer_processing_order', 'email_subject_customer_awaiting_delivery_order', 10, 2 );
function email_subject_customer_awaiting_delivery_order( $subject, $order ){
    if( $order->has_status( 'awaiting-delivery' ) ) {
        $email_key   = 'WC_Email_Customer_Processing_Order'; // The email notification type
        $email_obj   = WC()->mailer()->get_emails()[$email_key]; // Get specific WC_emails object
        $subject_txt = sprintf( __('[%s] Siparişiniz Kargoya Verildi (%s) - %s', 'woocommerce'), '{site_title}', '{order_number}', '{order_date}' ); // New subject text

        return $email_obj->format_string( $subject_txt );
    }
    return $subject;
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

like image 140
LoicTheAztec Avatar answered Sep 24 '22 00:09

LoicTheAztec