Comment masquer des produits sur WooCommerce ?

MAÏLIS AMALRIC, SITES INTERNET ET
DÉVELOPPEMENT WEB À TOULOUSE

Comment masquer des produits sur WooCommerce ?

Résumé de l'article

L'affichage et le masquage de produits pour certains utilisateurs d'un site WooCommerce peuvent être gérés par un plugin ou par quelques lignes de code.

Informations de publication

1. Contexte / besoin

Une association souhaite proposer des services, aussi bien à ses adhérents qu’au grand public.
En échange de leur contribution mensuelle (ou trimestrielle, semestrielle, annuelle), les adhérents reçoivent des crédits avec lesquels ils peuvent payer les services consommés, le taux de change étant de 1 crédit pour 1 €.
L’association propose aux adhérents ayant utilisé leurs crédits d’acquérir des packs à prix avantageux (45 € les 50 crédits par exemple), là où les non adhérents ne peuvent régler que par carte bancaire.

Problématique : Les packs de crédits doivent être complètement inaccessibles pour les internautes non connectés au site et les non adhérents tout en restant à portée des adhérents qui souhaitent les acquérir.

2. Solutions envisageables

La solution dépend en grande partie de la modélisation de la distinction entre adhérents et non adhérents de l’association.

  • S’il s’agit d’un rôle différent au sens WordPress du terme, il existe des extensions qui peuvent répondre à la problématique.
  • S’il s’agit d’une information annexe (user_meta), il faut alors gérer une solution ad’hoc, pas si complexe qu’il pourrait sembler.

3. Mise en place

Dans WooCommerce, un produit peut avoir différents degrés de visibilité :

  • Catalogue et recherche (visible) – par défaut – : Le produit est accessible par tous, à la fois sur les pages de la boutique mais également par le moteur de recherche interne au site (s’il y en a un).
  • Catalogue (catalog) : Le produit est accessible sur les pages de la boutique / catégories de produits mais pas par le moteur de recherche interne. Ce paramétrage peut être utile par exemple lorsque l’on souhaite que seuls les contenus textuels (articles et pages) du site soient listés dans les résultats d’une recherche.
  • Recherche (search) : Le produit est masqué sur les pages de la boutique mais peut être trouvé par une recherche.
  • Caché (hidden) : Le produit n’est accessible ni sur les pages de la boutique ni par une recherche. Pour autant, le produit restera en ligne et donc accessible en saisissant directement son URL ou grâce au référencement de la fiche produit.

En considérant que les packs de crédits sont inaccessibles pour tous les utilisateurs du site sauf les adhérents, le paramètre « caché » semble le plus adapté à ce cas.
Et pour afficher les produits aux utilisateurs autorisés, il suffit de 3 fonctions et quelques lignes de code, à ajouter dans le fichier functions.php du thème enfant.

La première fonction à mettre en place est celle qui permet de distinguer les adhérents des autres types de visiteurs.

function AMA_est_adherent(&$uid=-1) {
    $est_acteur = 'non';
    $current_user = wp_get_current_user();

    if(!empty( $current_user )) {
        $est_acteur = get_user_meta($current_user->ID, 'ama_est_adherent', true);
        $uid = $current_user->ID;
    }

    return $est_adherent;
}

Ensuite, pour que seuls les adhérents puissent accéder aux produits avec leurs URL directes, il faut ajouter une fonction au hook template_redirect qui dans mon cas renvoie vers la page d’accueil de la boutique.
Dans la même fonction, la deuxième partie de la boucle permet de remettre en place la requête complète pour que les adhérents visualisent tous les produits.

add_action('template_redirect', 'AMA_verifier_droits'); 

if(!function_exists('AMA_verifier_droits')) {
    function AMA_verifier_droits() {
        global $post, $wp_query;
        $est_adherent = AMA_est_adherent();
        
        if(is_product()) { 
            
            $product = wc_get_product($post->ID);
            
            if($product->get_catalog_visibility() == 'hidden' && $est_adherent != 'oui') {
                wp_redirect(get_home_url(null, 'boutique')); 
                exit;
            }
            
        } else if(is_shop()) {
            
            $args = array( 'post_type' => 'product', 'wc_query' => 'product_query' );
            if($est_adherent == 'oui') $wp_query = new WP_Query($args);
            
        }
    }
}

Et enfin, pour que les adhérents puissent voir les packs de crédits qu’ils peuvent acheter, il suffira d’ajouter un filtre sur le hook woocommerce_product_is_visible.

add_filter( 'woocommerce_product_is_visible', 'AMA_product_is_visible', 120, 2 ); 

if(!function_exists('AMA_product_is_visible')) {
    function AMA_product_is_visible( $visible, $productid ) {
        $product = wc_get_product($productid);
        
        $est_adherent = AMA_est_adherent(); // Gestion en fonction du statut du user
        
        if($product->get_catalog_visibility() == 'hidden' && $est_adherent == 'oui') $visible = true;

        return $visible; 
    }
}
Partager la publication