Fuentes:

https://www.webempresa.com/blog/agregar-un-nuevo-estado-de-pedido-personalizado-en-woocommerce.html

https://iborra.es/blog/nuevos-estados-pedido-woocommerce/



Opción #1

/* Nuevo estado en órdenes */

add_action( 'init', 'wphelp_new_order_status_sent' );

function wphelp_new_order_status_sent() {

register_post_status( 'wc-sent', array(

'label' => _x( 'Sent', '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( 'Sent <span class="count">(%s)</span> ', 'Sent <span class="count">(%s)</span>', 'woocommerce' )

) );

}

// Agrega esto a los estados.

add_filter( 'wc_order_statuses', 'wphelp_order_sent' );

function wphelp_order_sent( $order_statuses ) {

$order_statuses['wc-sent'] = _x( 'Sent', 'Order status', 'woocommerce' );

return $order_statuses;

}

// Añadir el estado del pedido a las acciones masivas en el orden que queramos

function rename_or_reorder_bulk_actions( $actions ) {

$actions = array(

'trash' => $actions['trash'], //Send to thrash

'mark_processing' => $actions['mark_processing'], //Procesando

'mark_on-hold' => $actions['mark_on-hold'], //En espera

'mark_cancelled' => $actions['mark_cancelled'], //Cancelado

'mark_completed' => $actions['mark_completed'], //Completado

'mark_sent' => __( 'Change to sent', 'textdomain' ), // NUEVO ESTADO PERSONALIZADO

);

return $actions;

}

add_filter( 'bulk_actions-edit-shop_order', 'rename_or_reorder_bulk_actions', 20 );




Opcion #2:

// Registrar Estado del pedido Enviado

function wpex_wc_register_post_statuses() {

    register_post_status( 'wc-shipping-progress', array(

        'label'                     => _x( 'Enviado', 'WooCommerce Order status', 'text_domain' ),

        'public'                    => true,

        'exclude_from_search'       => false,

        'show_in_admin_all_list'    => true,

        'show_in_admin_status_list' => true,

        'label_count'               => _n_noop( 'Approved (%s)', 'Approved (%s)', 'text_domain' )

    ) );

}

add_filter( 'init', 'wpex_wc_register_post_statuses' );


// Añadir Estado del pedido Enviado a WooCommerce

function wpex_wc_add_order_statuses( $order_statuses ) {

    $order_statuses['wc-shipping-progress'] = _x( 'Enviado', 'WooCommerce Order status', 'text_domain' );

    return $order_statuses;

}

add_filter( 'wc_order_statuses', 'wpex_wc_add_order_statuses' );




«Enviado» aparecerá al final de la lista, para ponerlo después del estado Procesando, debemos añadir el siguiente código.

// Añadir Estado del pedido Enviado en la lista después del estado Procesando

function add_shipping_progress_to_order_statuses( $order_statuses ) {

    $new_order_statuses = array();

    foreach ( $order_statuses as $key => $status ) {

        $new_order_statuses[ $key ] = $status;

        if ( 'wc-processing' === $key ) {

            $new_order_statuses['wc-shipping-progress'] = 'Enviado';

        }

    }

    return $new_order_statuses;

}

add_filter( 'wc_order_statuses', 'add_shipping_progress_to_order_statuses' );



Crear un email al nuevo estado «Enviado»

// Email que se envía cuando el estado del pedido está en Enviado

function email_shipping_notification( $order_id, $checkout=null ) {

   global $woocommerce;

   $order = new WC_Order( $order_id );

   //error_log( $order->status );

   if($order->status === 'shipping-progress' ) {

      // Mensaje del email.

      $mailer = $woocommerce->mailer();

      $message_body = __( 'Su pedido se encuentra listo y está siendo enviado en estos momentos.<br><br>Por favor, ingrese en su cuenta desde la página web de <strong>Nombre de tu web</strong> para que pueda realizar un seguimiento de su pedido en la sección de Pedidos:<br><br><a href="http://nombredetuweb.com/mi-cuenta/" target="_blank">Acceso a su cuenta</a>.', 'text_domain'  );

      $message = $mailer->wrap_message(

      // Mensaje en header.

      sprintf( __( 'Su pedido ha sido enviado', 'text_domain'  ), $order->get_order_number() ), $message_body );

      // Asunto del mensaje.

  $result = $mailer->send( $order->billing_email, sprintf( __( 'Su pedido ha sido enviado en Nombre de tu web', 'text_domain'  ), $order->get_order_number() ), $message );

  //error_log( $result );

}

}

add_action( 'woocommerce_order_status_changed', 'email_shipping_notification');



Renombrar un estado del pedido

// Renombrar un estado del pedido

function wc_renaming_order_status( $order_statuses ) {

    foreach ( $order_statuses as $key => $status ) {

        $new_order_statuses[ $key ] = $status;

        if ( 'wc-completed' === $key ) {

            $order_statuses['wc-completed'] = _x( 'Pedido Recibido', 'Order status', 'woocommerce' );

        }

    }

    return $order_statuses;

}

add_filter( 'wc_order_statuses', 'wc_renaming_order_status' );