Come creare uno stato dell’ordine personalizzato in WooCommerce

Creare uno stato dell’ordine personalizzato in WooCommerce è utile per chi vuole gestire in maniera più precisa o personalizzata il flusso di un ordine in WooCommerce.

Ad esempio, ho avuto bisogno di uno stato come “In preparazione”, utile per avvisare il cliente che il suo ordine è stato preso in carico ma non è ancora spedito.

Aggiungere un nuovo stato richiede soltanto un piccolo intervento sul codice del sito, oppure l’uso di un plugin come il mio Custom Order Status for WooCommerce.

Se hai voglia, prova il mio plugin e poi lasciami una recensione, grazie.

In questo articolo vedremo come farlo manualmente tramite codice.

Registrare il nuovo stato dell’ordine

La prima cosa da fare è registrare il nuovo stato in WooCommerce.

Per farlo useremo la funzione register_post_status().

Basta aggiungere questo codice al file functions.php del tema child:

// Registrazione dello stato personalizzato "In preparazione"
function riaco_wcos_registra_stato_in_preparazione() {
	register_post_status(
		'wc-in-preparazione',
		array(
			'label'                     => 'In preparazione',
			'public'                    => true,
			'exclude_from_search'       => false,
			'show_in_admin_all_list'    => true,
			'show_in_admin_status_list' => true,
			'label_count'               => _n_noop( 'In preparazione <span class="count">(%s)</span>', 'In preparazione <span class="count">(%s)</span>' ),
		)
	);
}
add_action( 'init', 'riaco_wcos_registra_stato_in_preparazione' );

Questo snippet registra un nuovo stato chiamato “In preparazione”.

Ora dovrai aggiungerlo alla lista degli stati WooCommerce, altrimenti non si vedrà.

Aggiungere lo stato alla lista degli stati WooCommerce

Per fare in modo che il nuovo stato sia selezionabile dal menu a tendina nella pagina di gestione ordini e che WooCommerce lo riconosca correttamente, dobbiamo aggiungerlo alla lista degli stati ufficiali con questo codice:

// Aggiunge lo stato personalizzato alla lista degli stati di WooCommerce
function riaco_wcos_aggiungi_stato_in_preparazione( $order_statuses ) {
    $order_statuses['wc-in-preparazione'] = 'In preparazione';
    return $order_statuses;
}
add_filter( 'wc_order_statuses', 'riaco_wcos_aggiungi_stato_in_preparazione' );

Con questa funzione, lo stato “In preparazione” sarà disponibile e potrai selezionarlo per qualsiasi ordine.

Dopo aver salvato le modifiche al file functions.php, vai su WooCommerce > Ordini.

Seleziona un ordine e, nel menu a tendina degli stati, troverai il nuovo stato “In preparazione”.

Puoi usarlo manualmente ogni volta che vuoi indicare ai clienti che il loro ordine è in questa fase.

stato woocommerce personalizzato

Ecco come viene visualizzato nel frontend nell’account dell’utente.

ordine account woocommerce

Inviare un’email automatica per lo stato personalizzato

WooCommerce non invia email per gli stati personalizzati di default, quindi dobbiamo creare un’azione che intercetti il cambio di stato e invii un’email.

Per inviare l’email automatica usiamo la funzione wp_mail di WordPress.

Aggiungi questo snippet al tuo functions.php del tema child, dopo i precedenti:

// Invia email quando l'ordine passa a "In preparazione"
add_action( 'woocommerce_order_status_in-preparazione', 'riaco_wcos_invia_email_in_preparazione' );

function riaco_wcos_invia_email_in_preparazione( $order_id ) {
    if ( !$order_id ) return;
    
    $order = wc_get_order( $order_id );
    $to = $order->get_billing_email();
    $subject = 'Il tuo ordine è in preparazione';
    $headers = array('Content-Type: text/html; charset=UTF-8');
    
    $message = '<p>Ciao ' . $order->get_billing_first_name() . ',</p>';
    $message .= '<p>Il tuo ordine n. ' . $order->get_order_number() . ' è ora in preparazione.</p>';
    $message .= '<p>Riceverai un’altra email quando sarà spedito.</p>';
    
    wp_mail( $to, $subject, $message, $headers );
}

Con questo codice, ogni volta che imposti un ordine nello stato “In preparazione”, il cliente riceverà un’email automatica che lo avvisa sullo stato dell’ordine.

Creare un’email personalizzata con la classe WC_Email

Al posto della soluzione precedente, possiamo anche decidere di creare un’email WooCommerce integrata visibile nella sezione WooCommerce > Impostazioni > Email.

Questa soluzione offre la possibilità di gestire il template HTML e di attivare/disattivare la notifica direttamente dal pannello di amministrazione.

WooCommerce gestisce le email attraverso classi PHP che estendono WC_Email.

Ecco come crearne una nuova.

Aggiungi questo snippet nel file functions.php del tuo tema child:

// Aggiunge la nuova email alla lista di WooCommerce
add_filter( 'woocommerce_email_classes', 'riaco_wcos_aggiungi_email_in_preparazione' );

function riaco_wcos_aggiungi_email_in_preparazione( $email_classes ) {
	require_once get_stylesheet_directory() . '/emails/class-wc-email-in-preparazione.php';
	$email_classes['WC_Email_In_Preparazione'] = new WC_Email_In_Preparazione();
	return $email_classes;
}

Poi crea il file:
/wp-content/themes/tuo-tema-child/emails/class-wc-email-in-preparazione.php

All’interno inserisci questo codice:

<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class WC_Email_In_Preparazione extends WC_Email {

	public function __construct() {
		$this->id          = 'in_preparazione';
		$this->title       = 'Ordine in preparazione';
		$this->description = 'Questa email viene inviata quando un ordine passa nello stato In preparazione.';
		$this->heading     = 'Il tuo ordine è in preparazione';
		$this->subject     = 'Il tuo ordine {order_number} è in preparazione';

		$this->template_html  = 'emails/in-preparazione.php';
		$this->template_plain = 'emails/plain/in-preparazione.php';

		// L'email si attiva quando lo stato diventa "in-preparazione"
		add_action( 'woocommerce_order_status_in-preparazione', array( $this, 'trigger' ), 10, 2 );

		parent::__construct();

		$this->recipient = '';
	}

	public function trigger( $order_id, $order = false ) {
		if ( $order_id ) {
			$this->object    = wc_get_order( $order_id );
			$this->recipient = $this->object->get_billing_email();
		}

		if ( ! $this->is_enabled() || ! $this->get_recipient() ) {
			return;
		}

		$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
	}

	public function get_content_html() {
		return wc_get_template_html(
			$this->template_html,
			array(
				'order'         => $this->object,
				'email_heading' => $this->get_heading(),
				'sent_to_admin' => false,
				'plain_text'    => false,
				'email'         => $this,
			)
		);
	}

	public function get_content_plain() {
		return wc_get_template_html(
			$this->template_plain,
			array(
				'order'         => $this->object,
				'email_heading' => $this->get_heading(),
				'sent_to_admin' => false,
				'plain_text'    => true,
				'email'         => $this,
			)
		);
	}
}

Ora crea un file nella cartella del tema child:
/wp-content/themes/tuo-tema-child/woocommerce/emails/in-preparazione.php

Inserisci un template di base, ad esempio:

<?php
defined( 'ABSPATH' ) || exit;

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<p>Ciao <?php echo esc_html( $order->get_billing_first_name() ); ?>,</p>
<p>Il tuo ordine <strong>#<?php echo $order->get_order_number(); ?></strong> è ora in preparazione.</p>
<p>Riceverai un’ulteriore email quando sarà spedito.</p>

<?php
do_action( 'woocommerce_email_footer', $email );

Ora vai su WooCommerce > Impostazioni > Email e troverai la nuova email “Ordine in preparazione“.

woocommerce email personalizzata

Cliccaci sopra per personalizzare tutto e vedere una anteprima del risultato o per mandare una email di test.

Quando un ordine passa allo stato personalizzato, WooCommerce invierà la nuova email come qualsiasi altra notifica.

Sponsor

Vhosting
themeforest