添加新的订单状态,以便在WooCommerce 4+中发送电子邮件通知

问题描述

我想与此订单状态一起向我的网站添加新的订单状态和电子邮件通知。我尝试了这段代码

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

但是代码不发送电子邮件。我该如何解决这种情况?我尝试了其他一些代码。但是他们都不起作用。

注意:我正在function.PHP文件中键入此代码,我需要在其他地方编写它吗?

解决方法

基于this answer codethis unaccepted answer thread,这是重新访问的代码,它将为WooCommerce订单添加自定义状态,并将触发针对此自定义状态的自定义电子邮件通知:

// 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','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',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','awaiting_delivery_order_status_email_notification',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',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',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;
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。