WooCommerce: Fügen Sie benutzerdefinierte Bestellstatus mit benutzerdefinierten E-Mail-Benachrichtigungen hinzu

Lesezeit: 13 Minuten

Benutzer-Avatar
JustCode

Mit Hinzufügen eines neuen Bestellstatus, Senden einer E-Mail-Benachrichtigung in WooCommerce 4+ Antwortcode, konnte ich eine E-Mail-Benachrichtigung für EINEN benutzerdefinierten Status erhalten, kann mir aber nicht vorstellen, wie ich die E-Mail-Benachrichtigung senden könnte BEIDE benutzerdefinierte Status.

Siehe unten die Beispielcodes und den Code, den ich für mehrere benutzerdefinierte Status-E-Mail-Benachrichtigungen ausprobiert habe. Ich habe auch meinen VOLLSTÄNDIGEN Code eingefügt, der den gesamten Prozess der Erstellung der mehreren Status zeigt.

Würde mich über Hilfe bei dieser schnellen Lösung freuen!

Was den E-Mail-BODY betrifft – gibt es eine Möglichkeit, den Inhalt des Verarbeitungsauftrags durch diesen Code zu ändern, ohne eine neue E-Mail-Vorlage erstellen zu müssen?

FUNKTIONIERT – Einzelne benutzerdefinierte Status-E-Mail-Benachrichtigung “Versendet”

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

VERSUCHT/FUNKTIONIERT NICHT – E-Mail-Benachrichtigung für BEIDE benutzerdefinierte Status

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

VOLLSTÄNDIGER CODE MIT ARBEITSMAIL FÜR EINZELNEN BENUTZERDEFINIERTEN STATUS.
Dies zeigt meinen vollständigen Prozess zum Hinzufügen von benutzerdefinierten Status mit Massenaktionen und Aktionsschaltflächen – alles funktioniert einwandfrei.

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

Benutzer-Avatar
LoicTheAztec

Es gibt einige Fehler… Verwenden Sie für mehrere Bestellstatus mit benutzerdefinierten E-Mail-Benachrichtigungen den folgenden vollständigen Code (Entfernen vor dem gesamten zugehörigen Code):

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

Der Code wird in die Datei functions.php des aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.

1353910cookie-checkWooCommerce: Fügen Sie benutzerdefinierte Bestellstatus mit benutzerdefinierten E-Mail-Benachrichtigungen hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy