Promoties in je webshop kunnen de conversie aardig een handje helpen. WooCommerce biedt daarom standaard de mogelijkheid om per product ook een promotieprijs in te stellen. Maar in sommige scenario’s wil je promoties gaan koppelen aan een bepaalde gebruiker.

Denk bijvoorbeeld aan een B2B klant die je de mogelijkheid wil geven om jouw producten te kopen met een standaardkorting van 10%. Je zou dit kunnen opvangen door voor die klant een kortingscode aan te maken, maar dat is wat omslachtig aangezien de klant bij iedere prijs op de webshop dan zelf de omrekening moet maken om te weten hoeveel hij of zij op het einde van de rit zal moeten betalen.

Hieronder leg ik je uit hoe je via een custom stukje code per gebruiker in je webshop een bepaalde procentuele korting kan activeren. Vanaf deze klant dan is ingelogd zal hij of zij automatisch de prijzen zien waarbij er bijvoorbeeld al 10% korting is op toegepast.

Stap 1 – Kortingsveld aanmaken

Voor deze use-case dienen we een veld aan te maken waarmee je op gebruikersniveau een bepaald percentage (korting) kan ingeven. Download en activeer hiervoor Advanced Custom Fields. Persoonlijk gebruik ik altijd de Pro-versie, maar met de gratis versie zal dit ook lukken.

Ik probeer altijd zo zuinig mogelijk om te springen met het gebruik van externe plugins, maar ACF is er zo eentje die je op elke website van mij zal terugvinden. In no-time maak je speciale inputvelden en formulieren aan om te gaan gebruiken in de backoffice.

Eens geactiveerd ga je via je dashboard naar “Custom Fields” > “Field Groups”. Daar klik je op “Add new”. Geef de groep een naam (bvb. Gebruikerskorting), en maak in de groep een nieuw veld aan.

  • Label: Procentuele korting
  • Naam: discount_percentage
  • Type: Nummer

Stap 2 – De prijs dynamisch aanpassen volgende de korting van de ingelogde gebruiker

add_filter('woocommerce_product_get_price', 'tpt_apply_user_discount_to_price'], 99, 2);
add_filter('woocommerce_product_variation_get_price', 'tpt_apply_user_discount_to_price', 99, 2);
add_filter('woocommerce_product_get_sale_price', 'tpt_apply_user_discount_to_price', 99, 2);

function tpt_apply_user_discount_to_price($price, $product = null)
{
    // Retrieve the current user ID
    $user_id = get_current_user_id();

    // Bail if we don't have a user ID
    // (the user isn't logged in yet)
    if (!$user_id) {
        return $price;
    }

    // Bail if we are in the backoffice
    if (is_admin()) {
        return $price;
    }

    // Bail if we are on the cart page
    if (is_cart()) {
        return $price;
    }

    // Bail if we are checking out
    if (is_checkout()) {
        return $price;
    }

    // Retrieve the discount percentage from the database
    $discount = get_field('discount_percentage', 'user_' . $user_id);

    // Bail if there is no discount percentage set for the current user
    if (empty($discount) || empty($price)) {
        return $price;
    }

    // Return the discounted price
    return $price - ($price * ($discount / 100));
}

In bovenstaande code checken we ook of we momenteel in het winkelmandje of op de afrekenpagina zitten. En daar is een reden voor.

Eens de product met de dynamische prijs toegevoegd is aan het winkelmandje wordt de verlaagde prijs mee opgeslagen. Mochten we de dynamische prijsfilter ook in het winkelmandje en tijdens het afrekenen actief laten zouden we 2 keer de korting toepassen.

Stap 3 – Kolom aanmaken gebruikersoverzicht

Het kan handig zijn dat je als eigenaar van de webshop een mooi overzicht hebt van de korting per gebruiker. We kunnen hiervoor een extra kolom aanmaken in het overzicht van de gebruikers.

Een extra kolom met data in het overzicht van de gebruikers of een bepaald een post type dient altijd in twee stappen te gebeuren:

  • De kolom aanmaken
  • De kolom per record (post, user) opvullen met data

Met de filter manage_users_columns kunnen we een extra kolom injecteren.

add_filter('manage_users_columns', 'tpt_add_users_column', 10, 1);

function tpt_add_users_column($columns)
{
    $result = [];
    foreach($columns as $key => $column) {
        $result[$key] = $column;
        if ($key == 'role') {
            $result['discount'] = __('Discount');
        }
    }
    return $result;
}

Mocht je nu het gebruikersoverzicht bekijken zou je al een kolom zien, maar deze zal nog leeg zijn. Daarvoor hebben we de filter manage_users_custom_column nodig. Deze wordt elke rij (en elke cel) aangeroepen.

add_filter('manage_users_custom_column', 'tpt_fill_users_column', 10, 3);

function tpt_fill_users_column($value, $column_name, $user_id)
{
    // Bail if this isn't the 'discount' column
    if ($column_name != 'discount') {
        return $value;
    }

    // Retrieve the discount percentage for that user
    $discount = get_user_meta($user_id, 'discount_percentage', true);

    // Print '-' if the user hasn't been assigned a discount yet
    if (!$discount) {
        return '-';
    }

    // Return the discount
    return $discount . '%';
}