WooCommerce:使用自定义电子邮件通知添加自定义订单状态

AG9

使用“在WooCommerce 4+应答代码中发送电子邮件通知的添加新订单状态”,我已经能够获得一个自定义状态的电子邮件通知,但是我无法理解如何发送有关以下内容的电子邮件通知:两种自定义状态。

请参阅下面的示例代码和我为多个自定义状态电子邮件通知尝试的代码。我还包含了完整代码,该代码显示了创建多个状态的整个过程。

希望此快速修复有帮助!

另外,对于电子邮件正文-是否有可能通过此代码更改处理订单内容中的内容而无需创建新的电子邮件模板?

工作-单个“自定义状态”电子邮件通知“已发送”

add_filter( 'woocommerce_email_actions', 'filter_woocommerce_email_actions' );
function filter_woocommerce_email_actions( $actions ){
    $actions[] = 'woocommerce_order_status_wc-shipped';
    return $actions;
}
// Send Customer Processing Order email notification when order status get changed from "tree" to "processing"
add_action('woocommerce_order_status_changed', 'shipped_status_custom_notification', 10, 4);
function shipped_status_custom_notification( $order_id, $from_status, $to_status, $order ) {
    if(  'shipped' === $to_status ) {
        // 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_shipped_order', 10, 2 );
function email_heading_customer_shipped_order( $heading, $order ){
    if( $order->has_status( 'shipped' ) ) {
        $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 = sprintf( __('Order #%s has been Shipped!', 'woocommerce'), '{order_number}' ); // New subject 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_shipped_order', 10, 2 );
function email_subject_customer_shipped_order( $subject, $order ){
    if( $order->has_status( 'shipped' ) ) {
        $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( __('Your %s Order #%s has been Shipped!', 'woocommerce'), '{site_title}', '{order_number}' ); // New subject text
        return $email_obj->format_string( $subject_txt );
    }
    return $subject;
}

尝试/不工作-两种自定义状态的电子邮件通知

// 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-shipped';
  $actions[] = 'woocommerce_order_status_wc-readytocollect';
  return $actions;
}

add_action( 'woocommerce_order_status_wc-shipped', array( WC(), 'send_transactional_email' ), 10, 1 );
add_action( 'woocommerce_order_status_wc-readytocollect', array( WC(), 'send_transactional_email' ), 10, 1 );

// Sending an email notification when order gets a custom status
add_action('woocommerce_order_status_changed', 'custom_status_trigger_email_notification', 10, 4);
function custom_status_trigger_email_notification( $order_id, $from_status, $to_status, $order ) {
   $custom_statuses = array('Shipped', 'Ready to Collect'); // Here your custom statuses slugs

   if( in_array($to_status, $custom_statuses) ) {
       // Loop through each custom status
       foreach ( $custom_statuses as $custom_status ) {
           // Trigger an email notification when a order get a custom status
           if ( $custom_status === $to_status ) {
               WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger( $order_id );
           }
       }
   }
}

// Customize email heading for your custom statuses email notifications
add_filter( 'woocommerce_email_heading_customer_processing_order', 'custom_email_heading_for_custom_order_status', 10, 2 );
function custom_email_heading_for_custom_order_status( $heading, $order ){
   // Here your custom statuses slugs / Heading texts pairs
   $custom_statuses = array(
       'Shipped'         => __('Planet Vape {order_number} has been Shipped!','woocommerce'),
       'Ready to Collect' => __('Planet Vape {order_number} is Ready to Collect!','woocommerce')
   );

   // Loop through each custom status / heading text pairs
   foreach ( $custom_statuses as $custom_status => $heading_text ) {
       // Change an email notification heading text when a order get a custom status
       if( $order->has_status( $custom_status ) ) {
           $email = WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']; // Get the specific WC_emails object

           return $email->format_string( $heading_text );
       }
   }
   return $heading;
}

// Customize email subject for your custom statuses email notifications
add_filter( 'woocommerce_email_subject_customer_processing_order', 'custom_email_subject_for_custom_order_status', 10, 2 );
function custom_email_subject_for_custom_order_status( $subject, $order ){
   // Here your custom statuses slugs / Heading texts pairs
   $custom_statuses = array(
       'Shipped'         => __('Planet Vape {order_number} has been Shipped!','woocommerce'),
       'Ready to Collect' => __('Planet Vape {order_number} is Ready to Collect!','woocommerce')
   );

   // Loop through each custom status / subject text pairs
   foreach ( $custom_statuses as $custom_status => $subject_text ) {
       // Change an email notification heading text when a order get a custom status
       if( $order->has_status( $custom_status ) ) {
           $email = WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']; // Get the specific WC_emails object

           return $email->format_string( $subject_text );
       }
   }
   return $subject;
}

带有工作邮件的完整代码,可用于单个定制状态。这显示了我使用批量操作和操作按钮添加自定义状态的完整过程-一切正常。

add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {
    register_post_status('wc-shipped ', array(
        'label' => __( 'Shipped', 'woocommerce' ),
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Shipped <span class="count">(%s)</span>', 'Shipped <span class="count">(%s)</span>')
    ));
    register_post_status('wc-readytocollect ', array(
        'label' => __( 'Ready to Collect', 'woocommerce' ),
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Ready to Collect <span class="count">(%s)</span>', 'Ready to Collect <span class="count">(%s)</span>')
    ));
}


// Add a custom order status to list of WC Order statuses
add_filter('wc_order_statuses', 'add_custom_order_statuses');
function add_custom_order_statuses($order_statuses) {
    $new_order_statuses = array();

    // add new order status before processing
    foreach ($order_statuses as $key => $status) {
        $new_order_statuses[$key] = $status;
        if ('wc-processing' === $key) {
            $new_order_statuses['wc-shipped'] = __('Shipped', 'woocommerce' );
            $new_order_statuses['wc-readytocollect'] = __('Ready to Collect', 'woocommerce' );
        }
    }
    return $new_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', 50, 1 );
function custom_dropdown_bulk_actions_shop_order( $actions ) {
    $new_actions = array();

    // add new order status before processing
    foreach ($actions as $key => $action) {
        if ('mark_processing' === $key)
            $new_actions['mark_shipped'] = __( 'Change status to shipped', 'woocommerce' );
            $new_actions['mark_readytocollect'] = __( 'Change status to Ready to Collect', 'woocommerce' );
            
        $new_actions[$key] = $action;
    }
    return $new_actions;
}

// Add a custom order status action button (for orders with "processing" status)
add_filter( 'woocommerce_admin_order_actions', 'add_custom_order_status_actions_button', 100, 2 );
function add_custom_order_status_actions_button( $actions, $order ) {
    // Display the button for all orders that have a 'processing', 'pending' or 'on-hold' status
    if ( $order->has_status( array( 'on-hold', 'processing', 'pending' ) ) ) {

        // The key slug defined for your action button
        $action_slug = 'shipped';

        // Set the action button
        $actions[$action_slug] = array(
            'url'       => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status='.$action_slug.'&order_id='.$order->get_id() ), 'woocommerce-mark-order-status' ),
            'name'      => __( 'Shipped', 'woocommerce' ),
            'action'    => $action_slug,
        );
    }
    return $actions;
}

// Set styling for custom order status action button icon and List icon
add_action( 'admin_head', 'add_custom_order_status_actions_button_css' );
function add_custom_order_status_actions_button_css() {
    $action_slug = "shipped"; // The key slug defined for your action button
    ?>
    <style>
        .wc-action-button-<?php echo $action_slug; ?>::after {
            font-family: woocommerce !important; content: "\e029" !important;
        }
    </style>
    <?php
}

add_filter( 'woocommerce_email_actions', 'filter_woocommerce_email_actions' );
function filter_woocommerce_email_actions( $actions ){
    $actions[] = 'woocommerce_order_status_wc-shipped';
    return $actions;
}

// Send Customer Processing Order email notification when order status get changed from "tree" to "processing"
add_action('woocommerce_order_status_changed', 'shipped_status_custom_notification', 10, 4);
function shipped_status_custom_notification( $order_id, $from_status, $to_status, $order ) {
    if(  'shipped' === $to_status ) {
        // 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_shipped_order', 10, 2 );
function email_heading_customer_shipped_order( $heading, $order ){
    if( $order->has_status( 'shipped' ) ) {
        $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 = sprintf( __('Order #%s has been Shipped!', 'woocommerce'), '{order_number}' ); // New subject 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_shipped_order', 10, 2 );
function email_subject_customer_shipped_order( $subject, $order ){
    if( $order->has_status( 'shipped' ) ) {
        $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( __('Your %s Order #%s has been Shipped!', 'woocommerce'), '{site_title}', '{order_number}' ); // New subject text

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

有一些错误…对于具有自定义电子邮件通知的多个订单状态,请使用以下完整代码(在所有相关代码之前删除)

// Enable custom statuses for WooCommerce Orders
add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {

    register_post_status('wc-shipped ', array(
        'label' => __( 'Shipped', 'woocommerce' ),
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Shipped <span class="count">(%s)</span>', 'Shipped <span class="count">(%s)</span>')
    ));

    register_post_status('wc-readytocollect ', array(
        'label' => __( 'Ready to Collect', 'woocommerce' ),
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Ready to Collect <span class="count">(%s)</span>', 'Ready to Collect <span class="count">(%s)</span>')
    ));
}

// Add a custom order status to list of WC Order statuses
add_filter('wc_order_statuses', 'add_custom_order_statuses');
function add_custom_order_statuses($order_statuses) {
    $new_order_statuses = array();

    // add new order status before processing
    foreach ($order_statuses as $key => $status) {
        $new_order_statuses[$key] = $status;
        if ('wc-processing' === $key) {
            $new_order_statuses['wc-shipped'] = __('Shipped', 'woocommerce' );
            $new_order_statuses['wc-readytocollect'] = __('Ready to Collect', 'woocommerce' );
        }
    }
    return $new_order_statuses;
}

// Adding custom status statuses to admin order list bulk dropdown
add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 50, 1 );
function custom_dropdown_bulk_actions_shop_order( $actions ) {
    $new_actions = array();

    // add new order status before processing
    foreach ($actions as $key => $action) {
        if ('mark_processing' === $key) {
            $new_actions['mark_shipped'] = __( 'Change status to shipped', 'woocommerce' );
            $new_actions['mark_readytocollect'] = __( 'Change status to Ready to Collect', 'woocommerce' );
        }
        $new_actions[$key] = $action;
    }
    return $new_actions;
}

// Add a custom order statuses action button (for orders with "processing" status)
add_filter( 'woocommerce_admin_order_actions', 'add_custom_order_status_actions_button', 100, 2 );
function add_custom_order_status_actions_button( $actions, $order ) {
    $allowed_statuses = array( 'on-hold', 'processing', 'pending', 'shipped', 'readytocollect' ); // Define allowed statuses

    // Display the button for all orders that have allowed status (as defined in the array)
    if ( in_array( $order->get_status(), $allowed_statuses ) ) {

        // The key slug defined from status with the name
        $action_slugs = array(
            'shipped'        => __('Shipped', 'woocommerce'),
            'readytocollect' => __('Ready to Collect', 'woocommerce')
        );

        // Loop through custom statuses
        foreach ( $action_slugs as $action_slug => $name ) {
            // Display "processing" action button
            $actions['processing'] = array(
                'url'    => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=processing&order_id=' . $order->get_id() ), 'woocommerce-mark-order-status' ),
                'name'   => __( 'Processing', 'woocommerce' ),
                'action' => 'processing',
            );

            // Display "complete" action button
            $actions['complete'] = array(
                'url'    => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=completed&order_id=' . $order->get_id() ), 'woocommerce-mark-order-status' ),
                'name'   => __( 'Complete', 'woocommerce' ),
                'action' => 'complete',
            );

            // Display custom status action buttons
            if( $order->get_status() !== $action_slug ) {
                // Set the action button
                $actions[$action_slug] = array(
                    'url'       => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status='.$action_slug.'&order_id='.$order->get_id() ), 'woocommerce-mark-order-status' ),
                    'name'      => $name,
                    'action'    => $action_slug,
                );
            }
        }
    }
    return $actions;
}

// Set styling for custom order status action button icon and List icon
add_action( 'admin_head', 'add_custom_order_status_actions_button_css' );
function add_custom_order_status_actions_button_css() {
    // The key slug defined from status with the icon code
    $action_slugs = array(
        'shipped'        => '\e019',
        'readytocollect' => '\e029'
    );
    ?>
    <style>
    <?php foreach ( $action_slugs as $action_slug => $icon_code ) : ?>
        .wc-action-button-<?php echo $action_slug; ?>::after {
            font-family: woocommerce !important; content: "<?php echo $icon_code; ?>" !important;
        }
    <?php endforeach; ?>
    </style>
    <?php
}

// Adding action for custom statuses
add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 );
function custom_email_actions( $action ) {
    $actions[] = 'woocommerce_order_status_wc-shipped';
    $actions[] = 'woocommerce_order_status_wc-readytocollect';

    return $actions;
}

add_action( 'woocommerce_order_status_wc-shipped', array( 'WC_Emails', 'send_transactional_email' ), 10, 1 );
add_action( 'woocommerce_order_status_wc-readytocollect', array( 'WC_Emails', 'send_transactional_email' ), 10, 1 );


// Sending an email notification when order get a custom status
add_action('woocommerce_order_status_shipped', 'cutom_status_trigger_email_notification', 10, 2 );
add_action('woocommerce_order_status_readytocollect', 'cutom_status_trigger_email_notification', 10, 2 );
function cutom_status_trigger_email_notification( $order_id, $order ) {
    WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger( $order_id );
}

// Customize email heading for your custom statuses email notifications
add_filter( 'woocommerce_email_heading_customer_processing_order', 'custom_email_heading_for_custom_order_status', 10, 2 );
function custom_email_heading_for_custom_order_status( $heading, $order ){
    // Here your custom statuses slugs / Heading texts pairs
    $data = array(
        'shipped'        => __('Planet Vape {order_number} has been Shipped!','woocommerce'),
        'readytocollect' => __('Planet Vape {order_number} is Ready to Collect!','woocommerce')
    );

    // Loop through each custom status / heading text pairs
    foreach ( $data as $custom_status => $heading_text ) {
        // Change an email notification heading text when a order get a custom status
        if( $order->has_status( $custom_status ) ) {
           $email = WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']; // Get the specific WC_emails object

           $heading = $email->format_string( $heading_text ); // don't return directly
        }
    }
    return $heading;
}

// Customize email subject for your custom statuses email notifications
add_filter( 'woocommerce_email_subject_customer_processing_order', 'custom_email_subject_for_custom_order_status', 10, 2 );
function custom_email_subject_for_custom_order_status( $subject, $order ){
    // Here your custom statuses slugs / Heading texts pairs
    $data = array(
        'shipped'        => __('Planet Vape {order_number} has been Shipped!','woocommerce'),
        'readytocollect' => __('Planet Vape {order_number} is Ready to Collect!','woocommerce')
    );

    // Loop through each custom status / subject text pairs
    foreach ( $data as $custom_status => $subject_text ) {
        // Change an email notification heading text when a order get a custom status
        if( $order->has_status( $custom_status ) ) {
            $email = WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']; // Get the specific WC_emails object

            $subject = $email->format_string( $subject_text ); // don't return directly
        }
    }
    return $subject;
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在WooCommerce中自定义订单状态更改时发送电子邮件通知

根据订单状态自定义 Woocommerce 电子邮件通知内容

Woocommerce新订单电子邮件通知中的自定义“回复”电子邮件标题

当订单状态更改为自定义订单状态时,从WooCommerce发送电子邮件

为特定的Woocommerce电子邮件通知向BCC添加自定义电子邮件

在WooCommerce订单和电子邮件通知上显示自定义交货通知

在Woocommerce订单和电子邮件中的订单总数之后添加自定义文本

WooCommerce-发送有关自定义订单状态更改的自定义电子邮件

将自定义文本添加到本地取货 Woocommerce 订单的特定电子邮件通知

在 WooCommerce 客户处理订单电子邮件通知中根据付款方式添加自定义消息

在WooCommerce订单和电子邮件通知中显示自定义字段值

根据运输方式自定义Woocommerce新订单电子邮件通知

订单自定义字段未显示在WooCommerce电子邮件通知中

在Woocommerce 3中更改电子邮件主题以获取自定义订单状态

如何在订单状态电子邮件中添加自定义消息?

在WooCommerce“订单已完成”电子邮件中添加自定义产品字段

通过添加自定义表来自定义WooCommerce电子邮件

仅在 Woocommerce 中针对本地运输和已完成订单的自定义电子邮件通知

将产品自定义字段添加到WooCommerce已完成的订单电子邮件中

在WooCommerce订单和电子邮件中添加和显示自定义购物车项目数据

如何将自定义字段作为抄送添加到WooCommerce客户订单电子邮件

在订单电子邮件通知中输出产品自定义字段值

WooCommerce 订单状态处理然后与客户一起发送电子邮件到自定义电子邮件

在Woocommerce订单和电子邮件中显示产品变体的自定义字段

WooCommerce订单相关预订的自定义电子邮件主题占位符

在Woocommerce管理员,订单和电子邮件中显示自定义付款字段

如何在新订单电子邮件中显示WooCommerce自定义产品元?

在WooCommerce的电子邮件和订单页面中保存并显示产品自定义数据

WooCommerce电子邮件上的订单自定义字段中的替换收件人