Oggi vediamo una funzione molto utile per WooCommerce, infatti diversi siti ecommerce richiedono la registrazione per visualizzare il prezzo; in questa guida spiego come creare una funzione in PHP che :
- nasconde i prezzi se l’utente non è loggato
- visualizza un link per l’accesso o la registrazione
- nascondo il pulsante acquista / aggiungi al carrello
- nega l’ordine e di conseguenza il checkout se l’utente non è loggato
Per fare ciò vado a lavorare sulle action di WooCommerce, una documentazione molto utile la si trova sul sito ufficiale https://docs.woocommerce.com/wc-apidocs/hook-docs.html.
Passiamo subito al codice.
Come nascondere i prezzi dei prodotti WooCommerce agli utenti che non hanno fatto accesso.
Per prima cosa inizializziamo la funzione che andiamo a scrivere con : add_action(‘init’, ‘woo_hide_action’);
Ora scriviamo la funzione che nasconde il pulsante Acquista e Aggiungi al Carrello
1 2 3 4 5 6 7 8 9 |
function woo_hide_action() { if ( !is_user_logged_in() ) { 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 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); } } |
Come si può notare prima di rimuovere i filtri eseguo un controllo per vedere se l’utente è loggato utilizzando la funzione di WordPress is_user_logged_in(), quindi se non è loggato procedo con la mia funzione.
A questo punto abbiamo quindi eliminato i due pulsanti, ora però per non limitarci solo a nasconderli senza dare un motivo apparente all’utente che naviga, scriviamo un’altra funzione PHP che mostrà il link per accedere o registrarsi.
Nella mia funzione faccio il link punta alla pagina “myaccount”, endpoint nativo di WooCommerce, ma potete inserire il link che volete.
1 2 3 |
function woo_show_login() { echo '<a class="button" style="white-space:pre-wrap;line-height:20px;" href="' . get_permalink(wc_get_page_id('myaccount')) . '">' . __('Accedi per vedere i prezzi e ordinare', 'theme_name') . '</a>'; } |
Ora per visualizzare il link aggiungiamo due action alla funziona di prima, che diventerà quindi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
add_action('init', 'woo_hide_action'); function woo_hide_action() { if ( !is_user_logged_in() ) { 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 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); add_action( 'woocommerce_single_product_summary', 'woo_show_login', 31 ); add_action( 'woocommerce_after_shop_loop_item', 'woo_show_login', 11 ); } } function woo_show_login() { echo '<a class="button" style="white-space:pre-wrap;line-height:20px;" href="' . get_permalink(wc_get_page_id('myaccount')) . '">' . __('Accedi per vedere i prezzi e ordinare', 'theme_name') . '</a>'; } |
Il codice va inserito nel file functions.php del vostra template, oppure ancora meglio potete sviluppare un plugin per WordPress.
Il risultato lo vedete su questo sito a cui ho sviluppato il plugin.
Programmatore WordPress Esperto WooCommerce
Sono l’autore di questo blog con tanti trucchi e guide su WordPress e WooCommerce.
Ho provato ad utilizzare il codice:
1) nella pagina dello shop come giustamente hai detto, appare la scritta, ma se si clicca sull’immagine va al prodotto e quindi si vede il prezzo;
2) Il mio sito è in multilingua e anche traducendo la stringa in WPML mi da sempre e solo l’inglese.
O non hai seguito bene l’articolo, oppure c’è una funzione del tema che va in conflitto
Grazie!
Ho provato il tuo codice e funziona benissimo, almeno in italiano.
Non ho ancora installato WPML ma credo non ci saranno problemi
Ciao Alessio, è passato un pò di tempo da quando hai scritto questo articolo ma lo script funziona bene. Ho notato però che il prezzo rimane visibile nel widget dei prodotto “Visti di recente” c’è modo di aggiungere una riga di “remove action” per il prezzo indicato?
Ultima curiosità: di solito “add_action” viene posto fuori dalle parentesi graffe cosa che in questo caso non vedo, come mai?
Grazie 😉
Ciao Marco,
add_action è all’interno di una condizione PHP, infatti viene eseguito solo se si verifica quella condizione.