woocommerce-nascondere-il-prezzo

Qualche giorno fa un mio cliente mi ha chiesto se fosse possibile realizzare un sito e-commerce in cui i prezzi venissero resi visibili solo per gli utenti regolarmente registrati.

Senza voler giudicare in questa sede la scelta strategica, che può essere più o meno conveniente a seconda del modello di business che si è scelto per il proprio progetto, ci sono vari modi per soddisfare tale richiesta con WooCommerce.

Uno di questi prevede l’utilizzo di alcuni plugin o estensioni di WooCommerce a pagamento (vai direttamente in fondo all’articolo se preferisci una soluzione di questo tipo), ma se avete tempo e voglia di mettere mano al codice di WooCommerce, in questo articolo descriverò come ho soddisfatto la richiesta del cliente con poche righe di codice.

Soluzione con codice custom all’interno del child theme

Per prima cosa, cercando su Google, mi sono imbattuto in un topic del forum di WordPress.org, dove si consiglia di agganciarsi all’hook “woocommerce_get_price_html”, aggiungendo il seguente codice nel file functions.php (possibilmente nel vostro tema child).

add_filter('woocommerce_get_price_html','members_only_price_pages');
 
function members_only_price_pages($price){
	if( is_user_logged_in() ){
		return $price;
	} else {
		return '';
	}
}

A seconda delle necessità, nel caso in cui un utente non sia loggato, si può scegliere di non pubblicare niente oppure far visualizzare un messaggio di testo in questo modo:

add_filter('woocommerce_get_price_html','members_only_price_pages');
 
function members_only_price_pages($price){
	if( is_user_logged_in() ){
		return $price;
	} else {
		return 'Inserire qui il testo desiderato';
	}
}

Ad esempio, all’interno della stringa “Inserire qui il testo desiderato”, è possibile inserire del codice html che rimanda all’area login.

Nel mio caso la soluzione indicata nel topic, nonostante si sia rivelata un ottimo spunto e abbia risolto il mio problema all’80%, non è bastata. Infatti si continuavano a vedere i prezzi degli articoli all’interno del mini-carrello, del carrello completo e della pagina di checkout, il che avrebbe reso praticamente tutto inutile perché non avrei soddisfatto la richiesta del mio cliente.

Per mascherare i prezzi anche nelle altre sezioni, mi sono andato a cercare degli altri hook a cui agganciarmi e ho aggiunto le seguenti funzioni:

add_filter ('wc_price', 'members_only_price_pages_2');

function members_only_price_pages_2($return, $price, $args){
       if(is_user_logged_in() ){
              return $return;
       }
       else return '';
}

add_filter('woocommerce_cart_item_price','members_only_price_cart');   function members_only_price_cart($price){ if( is_user_logged_in() ){ return $price; } else return 'Login to view price'; }

add_filter('woocommerce_cart_subtotal', 'members_only_cart_subtotal');
 
function members_only_cart_subtotal($subtotal) {
	if ( is_user_logged_in()) {
		return $subtotal;
	} else {
	return 'Login to view subtotal';
	}
}
add_filter('woocommerce_cart_item_subtotal', 'members_only_cart_item_subtotal');
 
function members_only_cart_item_subtotal($subtotal) {
	if ( is_user_logged_in()) {
		return $subtotal;
	} else {
		return 'Login to view subtotal';
	}
}
add_filter('woocommerce_cart_totals_order_total_html', 'members_only_checkout_total');
 
function members_only_checkout_total($total) {
	if ( is_user_logged_in()) {
		return $total;
	} else {
		return 'Login to view subtotal';
	}
}

Ovviamente è possibile utilizzarne solo alcuni di questi hooks o, in alternativa, se il testo da far comparire al posto del prezzo è sempre lo stesso, utilizzare una sola funzione per uno o più hooks, in questo modo:

add_filter('woocommerce_cart_totals_order_total_html', 'members_only_price_cart');
add_filter('woocommerce_cart_item_subtotal', 'members_only_price_cart');
add_filter('woocommerce_cart_item_price','members_only_price_cart');
function members_only_price_cart($price){
	if(is_user_logged_in() ){
		return $price;
	} else {
		return 'Login to view price';
	}
}

Disabilitare il checkout per utenti non iscritti

Una volta nascosti i prezzi agli utenti non registrati, non resta altro che accertarsi che WooCommerce sia impostato per non permettere agli utenti di acquistare senza registrarsi.

Per fare questo, stavolta non bisogna scrivere neanche una riga di codice, perché l’impostazione si trova in WooCommerce / Impostazioni / Cassa.

Basterà accertarsi che l’opzione “Abilita il checkout per gli ospiti” sia deselezionata.

Soluzione con plugin

Se per qualsiasi motivo tutto questo ti sembra troppo complicato oppure semplicemente non hai tempo e voglia di scrivere codice e cerchi una soluzione molto più sbrigativa, nel marketplace “Codecanyon” di Envatomarket sono disponibili molti plugin che ti potrebbero essere utili. Ecco una selezione che ho fatto per te.

Per qualsiasi chiarimento o approfondimento, non esitare a contattarmi lasciando un commento oppure tramite il contact form del sito.
Se invece ti è semplicemente piaciuto questo articolo o lo hai trovato utile, condividilo! 😉

17 commenti
  1. Rosario Assenza
    Rosario Assenza dice:

    Salve anche a me il cliente mi ha chiesto di nascondere i prezzi dei prodotti ed ho trovato questi tuoi codici grandiosi purtroppo non sono riuscito a nascondere il prezzo nel carrello in alto al template il sito e : souvenirsicilia.com mi rivolgo a te con cortesia voveldomi aiutare a risolvere il problema. Grazie

    Rispondi
    • Massimiliano
      Massimiliano dice:

      Ciao Rosario, grazie per il tuo commento.

      Ho visto il sito che hai realizzato ed in effetti nel mio tema non c’era il totale in alto a destra accanto al carrello, come nel tuo caso. Ispezionando il codice HTML con firebug, ho visto che il prezzo viene inserito all’interno del tag HTML “span class=”woocommerce-Price-amount amount“, quindi ho fatto una ricerca della stessa stringa all’interno della cartella di WooCommerce.

      Quello che ho trovato è che il prezzo dovrebbe essere calcolato (se il tuo tema non sovrascrive il codice originale di WooCommerce) all’interno del file “plugin/woocommerce/includes/wc-formatting-functions.php”, dentro la funzione wc_price.

      Ovviamente ti consiglio di non modificare direttamente il file originale di WooCommerce, ma potresti fare qualche prova utilizzando i filtri “raw_woocommerce_price”, “formatted_woocommerce_price” e “wc_price” che si trovano all’interno della funzione wc_price, in modo simile a come indico nell’articolo per gli altri filtri.

      Fammi sapere come va! In bocca al lupo e buon lavoro!

      Rispondi
  2. Matteo

    Salve,
    Io ho un problma similare. Se nel mio ecommerce creato con woocommerce volessi mostrare un prezzo differente a seconda che l’utente sia un professionista oppure un privato, c’è una soluzione?

    Grazie in anticipo

    Rispondi
    • Massimiliano
      Massimiliano dice:

      Salve Matteo,

      Il tuo caso secondo me è un po’ più complesso, ma a tutto c’è una soluzione.

      Non ti so dare direttamente il codice per aggiungere la funzionalità di cui hai bisogno perché non mi è mai capitato di doverla implementare e non ce l’ho pronto, dovrei lavorarci un po’, ma posso darti alcune indicazioni e dirti come procederei io se dovessi soddisfare questo requisito per un mio cliente.

      Innanzitutto installerei un plugin che permette di creare dei ruoli personalizzati, come ad esempio WPFront User Role Editor, per creare appunto un profilo utente “privato” e un profilo utente “professionista”.
      Dopodiché partirei dal codice e dagli hook presenti in questo articolo aggiungendo negli IF le condizioni di cui hai bisogno.

      Se i due prezzi differenti sono legati da un coefficiente fisso dovrebbe essere molto semplice. Se, ad esempio, per i professionisti prevedi uno sconto fisso del 20%, potresti mettere in uno dei due rami dell’IF qualcosa come:

      return $price*0.8;

      quando l’utente è, appunto, un professionista. Occhio però che la stessa cosa la devi aggiungere in tutti gli hook relativi al processamento vero e proprio dell’ordine, quindi anche nel carrello, nel pagamento, nel gateway di pagamento che utilizzerai (es: Paypal), ecc.

      Se invece ogni prodotto deve avere due prezzi differenti e le differenze tra i prezzi non hanno un rapporto fisso, la cosa si complica un po’. Immagino che dovrai creare un nuovo campo custom per ogni prodotto con la variazione di prezzo, e poi in fase sia di visualizzazione che di acquisto scegliere il prezzo giusto per l’utente giusto.

      In quest’ultimo caso partirei leggendomi questi articoli:
      https://gerhardpotgieter.com/2013/09/17/woocommerce-custom-product-fields/
      http://stackoverflow.com/questions/21742630/woocommerce-custom-price-based-on-user-input
      http://stackoverflow.com/questions/21742630/woocommerce-custom-price-based-on-user-input

      Spero di esserti stato utile! Se ti va fammi sapere come procede e se ti fa piacere e ti sono stato utile condividi questo articolo! :)

      Rispondi
  3. Jennifer

    Buongiorno,
    Anche per me stessa esigenza:
    devo realizzare un sito wp con woo-commerce con prezzi visibili solo per gli utenti regolarmente registrati.
    Inoltre ci saranno diversi gruppi di utenti, che vedranno prezzi differenti.

    Non vorrei andare a toccare il codice, ma preferirei utilizzare plugin, quali mi consiglieresti in base alle mie esigenze?

    grazie mille,
    Jennifer

    Rispondi
    • Massimiliano
      Massimiliano dice:

      Ciao Jennifer,

      Alla fine dell’articolo c’è un link alla lista di plugin che ho trovato su Themeforest e che dovrebbero fare più o meno la stessa cosa, tuttavia non li ho mai provati personalmente. Invece per alcuni miei clienti mi è capitato di utilizzare dei temi, tra l’altro molto eleganti e versatili, che potrebbero fare al caso tuo, perché danno proprio la possibilità di attivare e disattivare la modalità “catalogo”. I temi in questione sono Porto e Shoopkeper, ma credo che come questi ce ne siano molti altri.

      Altrimenti facendo una rapida ricerca ho trovato anche questo plugin che è gratuito:
      https://it.wordpress.org/plugins/hide-price-until-login/
      ma anche questo mai provato personalmente.

      Ciao,
      Massimiliano

      Rispondi
      • Jennifer

        Grazie Massimiliano, sei stato molto gentile.
        Credo che utilizzerò questo plugin https://codecanyon.net/item/woocommerce-prices-by-user-role/8562616.
        Avrei anche un’altra esigenza, a cui però non saprei come dare risposta.
        In base ai gruppi di utente i miei prodotti avranno un rincaro del prezzo iniziale.. per essere più esplicita faccio un esempio: il gruppo utenti A vedrà i prodotti ad un prezzo X, mentre il gruppo utenti B vedrà tutti i prodotti inseriti nello shop con il prezzo iniziale X + 10%.
        Come posso gestire questa cosa, senza intervenire manualmente sul singolo prodotto, ma con un’unica azione? Esiste qualche plugin?
        Grazie

        Jennifer

      • Massimiliano
        Massimiliano dice:

        Facendo una rapida ricerca in rete ho trovato un plugin gratuito (WC Role Based Price) e un plugin a pagamento (quello che hai postato tu, WooCommerce Prices by User Role, mi sembra che faccia anche quello che serve a te), ma non li ho mai usati quindi dovrai fare qualche test.

        In alternativa, potresti provare a vedere se un workaround accettabile può essere quello di lavorare con i codici sconto, fissando un prezzo base e fornendo un codice sconto diverso ad ogni gruppo di utenti (il sistema di codici sconto di WooCommerce è molto flessibile e permette di fare un sacco di cose). Se vuoi approfondire questo discorso scrivimi pure tramite il contact form della pagina contatti oppure direttamente via email.

  4. Sergio

    Ciao, ottima guida…funziona tutto. L’unica cosa è che se un utente non registrato procede con l’ordine anche se non visualizza i prezzi il processo acquisto si conclude comunque…mentre io vorrei bloccarlo. Cioè nel senso bisognerebbe far apparire un errore se l’utente dovesse proseguire. Come posso fare? Grazie mille in anticipo

    Rispondi
      • Massimiliano
        Massimiliano dice:

        Ciao Sergio,

        Giustissima osservazione, grazie per il tuo contributo.
        Colgo lo spunto e inserisco anche questo ultimo passaggio alla fine dell’articolo. Tu hai trovato subito l’impostazione che attiva e disattiva il checkout per gli ospiti, ma magari non è scontato per tutti.

        Ciao, grazie
        Massimiliano

  5. Claudio

    Ciao, io ho un’esagenza un po’ diversa. Nel mio caso la procedura di acquisto deve essere aperta agli utenti non loggati, però alcuni prodotti (inseriti in una determinata categoria) devono poter essere aggiunti al carrello solo dagli utenti loggati. Possono anche vedere il prezzo, ma il pulsante aggiungi al carrello deve essere disabilitato. Penso che potrei anche usare la soluzione da te proposta, se trovassi l’hook che gestisce il pulsante. Sai come fare?

    Rispondi
    • Massimiliano
      Massimiliano dice:

      Ciao Claudio,

      I files che gestiscono la logica relativa all’aggiunta al carrello si trovano nella cartella:
      /wp-content/plugins/woocommerce/templates/single-product/add-to-cart/

      C’è un template file per ogni tipo di prodotto. Potresti provare aprendo uno di quei file (cominciando da simple.php che è per i prodotti semplici) e lavorare sugli hook in modo che quando il prodotto appartiene ad una determinata categoria il tasto venga disabilitato. All’interno della logica condizionale potresti sfruttare il template tag is_category().

      In alternativa, per rimuovere il pulsante usando direttamente gli hook, potresti provare ad usare un codice tipo questo:

      function blogwp_remove_add_to_cart_by_category() {
          if ( is_category('inserire numero categoria desiderata') ) {
              remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10);
              remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
          }
      }
      add_action('init', 'blogwp_remove_add_to_cart_by_category');

      Non l’ho testato, sono sicuro che non serve dirtelo ma meglio specificare per chiunque legga… fai qualche prova su un sito di test prima di andare sull’eventuale sito in produzione.

      Fammi sapere come va! ;)

      Ciao,
      Massimiliano

      Rispondi
      • Claudio

        Ciao Massimiliano, grazie per la risposta. Il codice che mi hai fornito non va, ma ho un dubbio su quale sia il numero da inserire per richiamare la categoria: è quello che compare nella barra dell’indirizzo accanto a “ID…” quando si va in modifica categoria? Ho notato comunque un paio di cose, ma probabilmente sono io a non capire come funziona :-) : non hai inserito prima add_filter(‘woocommerce_after_shop_loop_item’ come nel codice dell’articolo; non c’è la condizione se l’utente è loggato oppure no.

        In sostanza i casi sono questi:
        1. se la categoria è “xxx” e se l’utente è loggato deve comparire il pulsante aggiungi al carrello
        2. Se la categoria è “xxx” ma l’utente non è loggato allora compare la frase “devi prima loggarti”
        3. Se invece la categoria non è “xxx” allora deve esserci sempre il pulsante indipendentemente dall’essere loggato o no.

        Capisco che non è semplice quello che chiedo, ti ringrazio comunque per la disponibilità.

      • Massimiliano
        Massimiliano dice:

        Ciao Claudio,

        Si, il numero della categoria dovrebbe essere quello presente nella barra dell’indirizzo che hai identificato tu.

        Se vuoi un modo più comodo per identificare l’ID non solo delle categorie, ma anche dei post, degli utenti e più o meno di tutto ciò che ha una ID all’interno di WordPress, ti consiglio di installare il plugin Reveal IDs.

        Il template tag per il controllo dell’utente non l’ho messo nel codice perché è già presente all’interno dell’articolo, è is_user_logged_in(), lo devi inserire nelle parentesi con un AND. Ho pensato di poterti dare uno spunto iniziale su cui lavorare per darti modo di ragionarci su anche un po’ da solo, che è un po’ la filosofia di questo blog :)

        Se invece preferisci che te lo risolvo direttamente io da remoto sarò ben felice di aiutarti. Contattami attraverso il form contatti e possiamo metterci d’accordo sui tempi e i costi di una eventuale consulenza.

        Ciao, buona giornata!
        Massimiliano

      • Claudio

        Ciao Massimiliano,
        certo sono partito proprio dal tuo esempio per fare diverse prove, ma volevo solo essere sicuro di essere sulla strada giusta. Ho continuato a provare e ho scoperto che il problema è la funzione is_category(), dato che questo stesso codice se abbinato a is_user_logged_in() funziona perfettamente (mi nasconde il pulsante aggiungi al carrello se si è loggati). Ho anche installato il plugin Reveal IDs e l’id della categoria è corretto.

        Grazie di tutto!

      • Massimiliano
        Massimiliano dice:

        Ciao Claudio,

        Perfetto, sono contento di averti potuto dare una mano! E grazie dell’aggiornamento…

        Sulla categoria hai ragione, is_category() forse funziona solo per i normali post.

        Ho trovato questo articolo sul sito ufficiale di WooCommerce, dove utilizzano la funzione has_term() per rimuovere le immagini solo dai prodotti appartenenti ad una categoria specifica. Credo che sia proprio quello di cui hai bisogno!

        Spero che anche questo ti possa essere utile.

        Ti ricordo, se ti fa piacere, di mettere un like alla pagina facebook di BLOGWP.IT e magari anche una recensione! :)

        Ciao, grazie
        Massimiliano

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *