I motivi possono essere diversi, ma mi capita spesso di dover impostare in WooCommerce un valore minimo o massimo d’acquisto per un ordine. Il proprietario dello store decide che, per poter fare acquisti, deve esserci una spesa minima e/o massima di tot Euro.
Ci sono diversi plugin per questo scopo, la maggior parte a pagamento ed alcuni con funzionalità evolute, ma se l’esigenza è solo quella di stabilire un minimo d’ordine per tutto lo store, si può risolvere senza scomodare nessun plugin aggiuntivo di terze parti.
È sufficiente un semplice snippet, poche righe di codice da inserire nel file delle funzioni del tema.
Il codice va inserito nel file delle funzioni del tema, il solito functions.php, come al solito è meglio utilizzare un tema child, per salvaguardare le personalizzazioni al tema da futuri aggiornamenti.
Hai bisogno di aiuto con WooCommerce?
Se hai bisogno di assistenza per il tuo store WooCommerce, o anche solo per mettere in pratica queste istruzioni, contattami!Acquisto minimo in WooCommerce
Poniamo il caso di voler impostare un ordine minimo di 30 Euro, questo è il codice codice da utilizzare, compatibile per le versioni 2.1 di WooCommerce e successive:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' ); add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' ); function wc_minimum_order_amount() { // Valore da impostare per ordine minimo $minimum = 30; if ( WC()->cart->total < $minimum ) { if( is_cart() ) { wc_print_notice( sprintf( 'Ordine minimo di %s, il tuo carrello contiene articoli per %s.' , woocommerce_price( $minimum ), woocommerce_price( WC()->cart->total ) ), 'error' ); } else { wc_add_notice( sprintf( 'Ordine minimo di %s, il tuo carrello contiene articoli per %s.' , woocommerce_price( $minimum ), woocommerce_price( WC()->cart->total ) ), 'error' ); } } }
Acquisto massimo in WooCommerce
Vediamo ora come definire un tetto massimo d’acquisto per un ordine, per esempio 900 Euro. Il codice da utilizzare è il seguente:
add_action( 'woocommerce_checkout_process', 'wc_maximum_order_amount' ); add_action( 'woocommerce_before_cart' , 'wc_maximum_order_amount' ); function wc_maximum_order_amount() { // Valore da impostare per ordine massimo $maximum = 900; if ( WC()->cart->total > $maximum ) { if( is_cart() ) { wc_print_notice( sprintf( 'Ordine massimo di %s, il tuo carrello contiene articoli per un totale di %s.' , woocommerce_price( $maximum ), woocommerce_price( WC()->cart->total ) ), 'error' ); } else { wc_add_notice( sprintf( 'Ordine massimo di %s, il tuo carrello contiene articoli per un totale di %s.' , woocommerce_price( $maximum ), woocommerce_price( WC()->cart->total ) ), 'error' ); } } }
Come puoi notare, sono due snippet molto simili, cambiano solamente pochi termini.
Nota bene (per entrambi i codici):
- I due snippet possono essere utilizzati contemporaneamente.
- I valori minimo o massimo d’ordine vanno impostati nella riga n. 6, rispettivamente alla variabile $minimum o $maximum.
Non bisogna inserire la valuta, viene assunta quella impostata in WooCommerce, e si possono utilizzare i decimali. - Il messaggio che appare a chi cerca di effettuare ordinativi con un importo inferiore o superiore a quello stabilito è personalizzabile, e va modificato nelle righe n. 13 e n. 22
- L’ordine minimo o massimo viene calcolato sul totale del carrello, spedizioni comprese.
- Entrambi i codici sono stati testati con le versioni correnti, ossia WooCommerce 2.3.8, WordPress 4.2.1 e tema Storefront.
- Questi codici non funzionano con WooCommerce 2.0.x e precedenti, per queste versioni occorre utilizzare una diversa versione del codice reperibile nella documentazione di WooCommerce
40 risposte
Buongiorno, è possibile integrare il codice aggiungendo che la regola dell’ordine minimo è valida solo per una nazione in particolare? Grazie
Ciao Gaia, francamente non l’ho mai dovuto fare, ma immagino si possa aggiungere una condizione iniziale che limiti lo script per una nazione.
Dovrei documentarmi ma così ad occhio non dovrebbe essere impossibile.
Grazie mille Roberto, se riuscissi a farmi sapere te ne sarei grata!
Volentieri, se mi capita di dedicarmici ti avviso
rob
Volevo solo segnalare che, per chi necessitasse di escludere le spese di spedizione dal calcolo dell’importo dell’ordine minimo, è sufficiente sostituire ogni volta che nel codice incontrate il termine “total” con “subtotal” 🙂 spero di aver fatto cosa gradita
Ciao Gabriele, sono sicuro che la tua segnalazione sarà sicuramente apprezzata 🙂
Grazie!
rob
Penso che dovrebbe anche disabilitare il tasto “Procedi con l’ordine” altrimenti chi non legge va avanti lo stesso e paga… a quel punto o gli restituisci i soldi o processi l’ordine (magari in perdita)
Ciao Diego,
vado a memoria ma in teoria dovrebbe bloccare la possibilità di ordinare.
Appena riesco faccio una verifica, grazie per la segnalazione!
rob
Ciao Roberto,
sei poi riuscito a capire come impostare un prezzo minimo per ruolo?
Ciao Silvio, purtroppo non ho ancora avuto modo di guardarci.
rob
Salve ho modificato il tuo codice pensando all’inverso (ordine massimo in quantità) ma non funziona, cosa ho sbagliato.
add_action( ‘woocommerce_check_cart_items’, ‘set_massimo__prodotti_checkout’ );
function set_massimo__prodotti_checkout() {
if( is_cart() || is_checkout() ) {
global $woocommerce;
// definire qui il numero minimo di prodotti
$maximum_num_products = 2;
$cart_num_products = WC()->cart->cart_contents_count;
if( $cart_num_products > $maximum_num_products ) { // Messaggio di errore personalizzabile wc_add_notice( sprintf( ‘Ordine massimo possibile è di %s prodotti. Prodotti attualmente nel tuo carrello: %s.’, $maximum_num_products, $cart_num_products ), ‘error’ ); } }
E se volessi impostare un limite minimo e massimo solo per una categoria di prodotti?
Ciao Rocco, questo snippet riguarda il carrello nel suo globale, la vedo impegnativa se non ardua impostare con dei filtri per le categorie.
Ci sono però plugin che gestiscono i quantitativi di articoli acquistabili, magari potrebbero tornare utili.
rob
Ciao, ho provato lo snippet e funziona perfettamente anche con l’ultima versione di woocommerce. Ma anche io, come l’utente Luca Lovino, vorrei impostare l’ordine minino solo su una categoria di prodotti. Non è possibile impostare lo snippet che funzioni solo su certe categorie o tag?
Spero tu possa aiutarmi.
Grazie mille in anticipo, indipendentemente se potrai o meno aiutarmi.
Ciao
Tony
Questo snippet non credo proprio, visto che va a prendere il totale dell’ordine.
Non so se ci sono soluzioni specifiche per categoria, dovrei documentarmi.
rob
Ciao io ho bisogno di un aiuto. Vorrei impostare uno snippet che, in base al peso totale nel carrello, il prezzo si azzera. Mi spiego meglio. Se il totale del peso dei prodotti è minore o uguale a 8, il prezzo da pagare è 0. Se il peso è uguale o maggiore a 9 il prezzo totale dei prodotti rimane così com’è. Spero di essermi spiegato. Grazie
A me personalmente non è mai capitato di doverlo fare, in rete però ci sono diversi snippet che lavorano con il peso dell’ordine, magari puoi trovarne uno facilmente adattabile.
rob
Ciao Roberto, avrei una domanda. Ho impostato un minimo d’ordine per il mio sito…funziona perfettamente, quindi grazie. Ora dal minimo d’ordine vorrei escludere una singola categoria per particolari acquisti al di sotto del limite impostato. E’ possibile farlo? Ti ringrazio in anticipo per l’aiuto che potrai darmi. Cordiali saluti
Ciao Luca, lo snippet non fa distinzioni ma prende solo il totale dell’ordine. Sinceramente non mi hanno mai chiesto nulla del genere, dovrei documentarmi.
rob
Ciao Roberto, grazie mille per il tuo snippet, funziona perfettamente! Avrei una domanda però, nel mio shop dovrei inserire un ordine minimo di prodotti (limite minimo 6 prodotti), piuttosto che il minimo in €. Come posso fare?
Ti ringrazio anticipatamente
Puoi usare questo snippet:
add_action( 'woocommerce_check_cart_items', 'set_minimo__prodotti_checkout' );
function set_minimo__prodotti_checkout() {
if( is_cart() || is_checkout() ) {
global $woocommerce;
// definire qui il numero minimo di prodotti
$minimum_num_products = 20;
$cart_num_products = WC()->cart->cart_contents_count;
if( $cart_num_products < $minimum_num_products ) { // Messaggio di errore personalizzabile wc_add_notice( sprintf( 'Ordine minimo richiesto di %s prodotti. Prodotti attualmente nel tuo carrello: %s.', $minimum_num_products, $cart_num_products ), 'error' ); } }
Grazie mille Roberto, funziona alla perfezione! Grande!!! 🙂
Salve Roberto e grazie per questo post.
Ho inserito il codice ed il messaggio di avviso appare ma permette lo stesso di andare avanti con il checkout. E’ possibile bloccare il processo di checkout quando la nostra condizione non è soddisfatta?
Grazie mille in anticipo!
Sei sicuro di averlo inserito correttamente? In teoria dovrebbe venirti fuori un avviso e l’impossibilità di continuare.
A meno che lo script non vada in conflitto con qualche plugin o con il tema…
rob
Io credo di averlo inserito come da istruzioni 🙂
Non so cosa altro fare
Come ti ho già detto, quando si parla di snippet potrebbe esserci un qualche conflitto con elementi utilizzati nell’installazione, temi o plugin che siano.
Senza un minimo di verifica/debug è difficile dire di più.
rob
Ciao Roberto, questo codice è valido solo per tutto lo STORE. Se io volessi applicarlo ad una sola catogoria?
ES. ho un un prodotto in quella categoria che si vende soltanto con un minimo di 10pz, come si fa?
ES. se volessi applicarlo ad un singolo prodotto?
Grazie 🙂
Ciao Giuseppe, puoi chiudere lo snippet in un condizionale, e puoi scegliere se la condizione è una categoria o un prodotto (o altro).
Gli esempi dei condizionali per woocommerce sono qui.
rob
Buonasera Roberto,
volevo chiederti se esiste un modo per impostare un costo minimo d’ordine per un ruolo specifico ?
Ho un ruolo utente “wholesale” che ha i prezzi scontati, pero’ vorrei che effettuasse un ordine minimo di 150€ per acquistare.. Mi sapresti dire qualcosa ?
Ti ringrazio !!
Luca
Così, su due piedi, mi verrebbe da dire che applicare un condizionale in base al ruolo utente allo snippet di questo articolo non dovrebbe essere un grosso problema.
rob
Grazie per la risposta !
Non sono molto esperto di php.. mi sapresti dare una mano ? :/
Ciao Luca, appena ho un attimo di tregua vedo se riesco a buttar giù qualcosa.
rob
Ciao Roberto,
volevo chiederti un consiglio.
Woocommerce se un cliente effettua l’ordine invia la mail al cliente con il riepilogo dell’ordine.
Pero a me che sono l’amministratore non arriva nulla, nemmeno una notifica che il cliente tale ha effettuato un ordine.
Se spedisce al cliente presumo che sia corretto la parte smtp delle mail.
Cosa puo essere ?
Grazie
Ciao Emiliano, hai verificato che le mail all’amministratore non siano state disattivate per qualche motivo?
Se sono attive, potrebbe essere un problema dell’hosting se la mail dell’amministratore ha lo stesso dominio dell’e-commerce.
rob
Io ho versione 2.0.20, e per vari motivi di customizzazione non posso aggiornare a breve, che modifiche vanno apportate al codice?
Per la tua versione dovrebbe andare questa versione:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
global $woocommerce;
$minimum = 10;
if ( $woocommerce->cart->get_cart_total() < $minimum ) { $woocommerce->add_error( sprintf( 'Devi avere un ordine minimo di %s per poter completare questo ordine.' , $minimum ) );
}
}
rob
GRAZIE mille!! Spiegazione semplice e il codice fa il suo dovere!! Grazie
Ciao Admir, grazie a te per il feedback! 😉
rpb
Ciao Roberto. Grazie per i tuoi, sempre preziosi, consigli. Sai se il codice sopra riportato è valido con la versione 2.1.12. Ho inserito il codice nel function del chil ma mi da un errore sia in fornend, sia in backend.
Grazie e buona giornata.
Alfredo
Ciao Alfredo, io uso lo stesso codice in almeno un paio di installazioni, tutte aggiornate all’ultima versione di WordPress e WooCommerce.
Lo script è lo stesso consigliato da WooThemes.
Temo che tu abbia un problema di altra natura, tipo di compatibilità con tema o plugin, o con altre funzioni.
rob