Alors que WooCommerce comprend plusieurs statuts de commande différents, ceux-ci peuvent ne pas correspondre aux flux de votre boutique. Avec WooCommerce, vous pouvez marquer les commandes avec l'un des statuts suivants :

État de la commande :

  • Attente paiement
  • En cours
  • En attente
  • Terminée
  • Annulée
  • Remboursée
  • Échouée

 

Cependant, certaines boutiques ont besoin de plus de statuts de commandes, comme « en attente d’expédition », « en cours de livraison », ou d’autres pour répondre à leurs besoins d’exécution d’une commande. Vous pouvez facilement les ajouter vous-même avec un petit peu de code personnalisé ou en utilisant ce plugin.

 

Woocommerce Awaiting Shipment 1.3 & Free Edition

Woocommerce Awaiting Shipment

Captures d’écran

woocommerce-awaiting-shipment-w001

woocommerce-awaiting-shipment-w002

Code

/** 
 * Adding a WooCommerce Custom Order Status
**/
function register_awaiting_shipment_order_status() {
    register_post_status( 'wc-awaiting-shipment', array(
        'label'                     => 'Awaiting shipment',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Awaiting shipment <span class="count">(%s)</span>', 'Awaiting shipment <span class="count">(%s)</span>' )
    ) );
}
add_action( 'init', 'register_awaiting_shipment_order_status' );

// Add to list of WC Order statuses
function add_awaiting_shipment_to_order_statuses( $order_statuses ) {

    $new_order_statuses = array();

    // add new order status after processing
    foreach ( $order_statuses as $key => $status ) {

        $new_order_statuses[ $key ] = $status;

        if ( 'wc-processing' === $key ) {
            $new_order_statuses['wc-awaiting-shipment'] = 'Awaiting shipment';
        }
    }

    return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'add_awaiting_shipment_to_order_statuses' );
Adding a WooCommerce Custom Order Status

Explication

Commençons par la première fonction de ce code :

// Register new status
function register_awaiting_shipment_order_status() {
    register_post_status( 'wc-awaiting-shipment', array(
        'label'                     => 'Awaiting shipment',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Awaiting shipment <span class="count">(%s)</span>', 'Awaiting shipment <span class="count">(%s)</span>' )
    ) );
}
add_action( 'init', 'register_awaiting_shipment_order_status' );
Register new status

Cette fonction enregistre le statut personnalisé comme un statut d’un post dans WordPress. Vous pouvez renommer la fonction en fonction de vos besoins, mais nous allons construire le statut de la commande « en attente d’expédition », de sorte que celle-ci sera nommée register_awaiting_shipment_order_status() pour refléter ceci.

Il faut ensuite construire le statut de post en utilisant la fonction WordPress register_post_status(). Notez que la première fonctionnalité de cette fonction est le "slug" pour le statut de la commande, préfixé par "wc-" pour "WooCommerce". Si vous voulez un nom différent pour l'état de votre commande, vous devrez changer le texte après le trait d'union, tout slug est en minuscules, comme par exemple wc-building ou wc-packing-order.

Votre statut personnalisé ne peut contenir que 20 caractères maximum, y compris les tirets (selon le codex register_post_status), vous devez donc être conscient de cela lors de la création de votre propre slug.

Il faut ensuite créer un array, qui est un ensemble de données qui définit notre statut de post personnalisé. L'étiquette (label) est ce qui sera affiché, de sorte que vous pouvez changer cela pour le nom exact du statut de votre commande. Ensuite, vous pouvez insérer le label_count dans le tableau, mais laissez le reste de ce tableau inchangé.

Enfin, l'action de fin exécute cette fonction et ajoute ce statut à WordPress comme notre statut de post personnalisé.

Parlons maintenant de la deuxième partie:

// Add to list of WC Order statuses
function add_awaiting_shipment_to_order_statuses( $order_statuses ) {
  
    $new_order_statuses = array();
  
    // add new order status after processing
    foreach ( $order_statuses as $key => $status ) {
  
        $new_order_statuses[ $key ] = $status;
  
        if ( 'wc-processing' === $key ) {
            $new_order_statuses['wc-awaiting-shipment'] = 'Awaiting shipment';
        }
    }
  
    return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'add_awaiting_shipment_to_order_statuses' );
New order status

La fonction add_awaiting_shipment_to_order_statuses() va ajouter ce nouveau statut de post personnalisé dans la liste "État de la commande" disponible dans les pages WooCommerce "Commandes" et "Modifier commande" afin de pouvoir l'utiliser facilement.

La boucle foreach ici passe par la liste des statuts des commandes actuelles jusqu'à ce qu'elle trouve celui que nous voulons. Dans ce cas, « en attente d'expédition » est inséré après le statut de la commande « En cours ». Voilà ce que l'if() fait ici : — Si le statut de la commande est « En cours », ajoute « en attente d'expédition » ici, puis continue en passant par les statuts des commandes.

Vous pouvez insérer votre nouveau statut après les statuts existants - vous pouvez trouver la liste d'entre eux ici. Par exemple, vous pouvez rechercher à la place wc-pending et ajouter votre statut après.

C'est tout ! Vous pouvez maintenant ajouter votre propre statut et l'insérer n'importe où dans la liste "État de la commande".

 

Mise à jour - 02/02/2017

À la suite du commentaire d'Olivier, je me suis penché sur l'ajout du statut « en attente d'expédition » dans les actions groupées (Bulk Actions).

Commençons par la première fonction de ce code :

/** 
 * Register Awaiting Shipment Order Status in Bulk Actions
**/

// Add Mark Awaiting shipment in bulk actions below the Mark as completed
add_action('admin_footer-edit.php', 'custom_bulk_admin_footer');
function custom_bulk_admin_footer() {
  
  global $post_type;
  
  if($post_type == 'shop_order') {
    ?>
    <script type="text/javascript">
      jQuery(document).ready(function() {
        jQuery('<option>').val('awaiting-shipment').text('<?php _e('Mark Awaiting shipment')?>').appendTo("select[name='action']");
        jQuery('<option>').val('awaiting-shipment').text('<?php _e('Mark Awaiting shipment')?>').appendTo("select[name='action2']");
      });
    </script>
    <?php
  }
}
Add Mark Awaiting Shipment in bulk actions

Il faut ensuite mettre à jour le nouveau statut de la commande :

// Update the order status
function change_order_status($orderid) {
    $order = new WC_Order($orderid);
    if($order->status!='awaiting-shipment') {
        $order->update_status('awaiting-shipment', 'order_note');
    }
}
Update the order status

La fonction pour les actions groupées :

// Function for the bulk actions
add_action('load-edit.php', 'custom_bulk_action');
function custom_bulk_action() {
    global $typenow;
    $post_type = $typenow;
    $sendback = admin_url( "edit.php?post_type=$post_type&success=1" );
     
    if($post_type == 'shop_order') {
        $wp_list_table = _get_list_table('WP_Posts_List_Table');
        $action = $wp_list_table->current_action();
        $allowed_actions = array("awaiting-shipment");
        if(!in_array($action, $allowed_actions)) return;
         
        if(isset($_REQUEST['post'])) {
            $orderids = array_map('intval', $_REQUEST['post']);
        }
         
         
        switch($action) {
            case "awaiting-shipment":
                foreach( $orderids as $orderid ) {
                    change_order_status($orderid);
                }
            break;
            default: return;
        }
         
        wp_redirect($sendback);
        exit();
    }
}
Function for the bulk actions

Code complet avec mise à jour

/** 
 * Adding a WooCommerce Custom Order Status
**/

function register_awaiting_shipment_order_status() {
    register_post_status( 'wc-awaiting-shipment', array(
        'label'                     => 'Awaiting shipment',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Awaiting shipment <span class="count">(%s)</span>', 'Awaiting shipment <span class="count">(%s)</span>' )
    ) );
}
add_action( 'init', 'register_awaiting_shipment_order_status' );

// Add to list of WC Order statuses
function add_awaiting_shipment_to_order_statuses( $order_statuses ) {

    $new_order_statuses = array();

    // add new order status after processing
    foreach ( $order_statuses as $key => $status ) {

        $new_order_statuses[ $key ] = $status;

        if ( 'wc-processing' === $key ) {
            $new_order_statuses['wc-awaiting-shipment'] = 'Awaiting shipment';
        }
    }

    return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'add_awaiting_shipment_to_order_statuses' );

/******************************************************************************************
***										PART II											***
******************************************************************************************/

/** 
 * Register Awaiting Shipment Order Status in Bulk Actions
**/

// Add Mark Awaiting shipment in bulk actions below the Mark as completed
add_action('admin_footer-edit.php', 'custom_bulk_admin_footer');
function custom_bulk_admin_footer() {
  
  global $post_type;
  
  if($post_type == 'shop_order') {
    ?>
    <script type="text/javascript">
      jQuery(document).ready(function() {
        jQuery('<option>').val('awaiting-shipment').text('<?php _e('Mark Awaiting shipment')?>').appendTo("select[name='action']");
        jQuery('<option>').val('awaiting-shipment').text('<?php _e('Mark Awaiting shipment')?>').appendTo("select[name='action2']");
      });
    </script>
    <?php
  }
}

// Update the order status
function change_order_status($orderid) {
    $order = new WC_Order($orderid);
    if($order->status!='awaiting-shipment') {
        $order->update_status('awaiting-shipment', 'order_note');
    }
}

// Function for the bulk actions
add_action('load-edit.php', 'custom_bulk_action');
function custom_bulk_action() {
    global $typenow;
    $post_type = $typenow;
    $sendback = admin_url( "edit.php?post_type=$post_type&success=1" );
     
    if($post_type == 'shop_order') {
        $wp_list_table = _get_list_table('WP_Posts_List_Table');
        $action = $wp_list_table->current_action();
        $allowed_actions = array("awaiting-shipment");
        if(!in_array($action, $allowed_actions)) return;
         
        if(isset($_REQUEST['post'])) {
            $orderids = array_map('intval', $_REQUEST['post']);
        }
         
         
        switch($action) {
            case "awaiting-shipment":
                foreach( $orderids as $orderid ) {
                    change_order_status($orderid);
                }
            break;
            default: return;
        }
         
        wp_redirect($sendback);
        exit();
    }
}
Adding a WooCommerce Custom Order Status

Vous pouvez utiliser le plugin Woocommerce Awaiting Shipment qui reprend ce code et la traduction en français.

Woocommerce Awaiting Shipment 1.3 & Free Edition

Woocommerce Awaiting Shipment

Attention si vous deviez ne plus utiliser ce code ou le plugin "Woocommerce Awaiting Shipment", il est préférable de modifier les statuts des commandes "En attente d'expédition" par un statut présent dans WooCommerce avant la suppression.

C'est tout ! ...pour le moment.