Een unieke coupon code genereren in WooCommerce

Zo genereer je een unieke coupon code in WooCommerce

Wil je direct een mail ontvangen wanneer nieuwe snippets zijn toegevoegd?

Vul dan onderstaand formulier in en je krijgt direct na het toevoegen van nieuwe snippets een email. Zo blijf je altijd bij!

Deze code snippet hoort bij mijn blogartikel over een Intelligente Abandoned Cart pop-up voor WooCommerce, maar de code zelf is veel breder inzetbaar dan alleen voor die toepassing.

Wat is de reden geweest om de code te schrijven?

Om het ‘delen’ van kortingscodes tegen te gaan in bepaalde situaties wilde ik een unieke kortingscode genereren, wanneer bezoekers van een webshop iets in hun winkelwagen laten staan en hier door een pop-up van verwittigd worden. Bovendien moesten die kortingsbonnen ‘dynamisch’ kunnen verlopen.

Het is dus de bedoeling, dat er een shortcode ‘ergens’ in een pagina geplaatst worden, en iedere keer dat deze pagina getoond wordt, de shortcode niet alleen een couponcode toont, maar ook die onderliggende couponcode aanmaakt.

Nu is dit niet iets wat je direct op je homepage zal willen plaatsen, want dan wordt iedere keer dat je pagina geladen wordt, een coupon code aangemaakt. Dan heb je -als je site goed bezocht wordt- in no time geen overzicht meer met betrekking tot je codes.

In het artikel zelf, worden de codes uitsluitend aangemaakt, wanneer de bezoeker aan een groot aantal voorwaarden voldoet. Maar zelfs dan ga je te maken krijgen met een groot aantal ‘ongebruikte coupons’, die verlopen en het is dus goed om ook regelmatig je ongebruikte kortingscodes netjes op te ruimen.

Omdat in het voorbeeld dezelfde pop-up verschillende soorten coupons moet kunnen genereren, moeten we er bovendien voor zorgen, dat de te genereren coupons flexibel kunnen worden ingesteld.

We willen dus een shortcode genereren met de volgende mogelijke parameters

  • template: De naam van de template die als voorbeeld gebruikt moet worden. Moet voorkomen als geldige coupon zonder verloopdatum.
  • expiry: Het aantal dagen dat de coupon geldig is na de dag van activering
  • length: Lengte van de couponcode, standaard 12
  • special: Of er wel of geen ‘special chars’ in de coupon code voor mogen komen.
  • prefix: Eventuele prefix voor de code, om makkelijk te kunnen groeperen naar gebruik.

Hieronder zie je de code. Omdat hier eigenlijk niet veel nieuws gebeurd, anders dan

function wxp_generate_random_coupon($atts) {
    // Extract the shortcode attributes
    $atts = shortcode_atts(
        array(
            'template' => '', // Default value for the template coupon code
            'length'   => '12',
            'expiry'   => '30',
            'special'  => 'false', 
            'prefix'   => '',
        ),
        $atts
    );

    $expiry = strtotime(date('Y-m-d'),"+ {$atts['expiry']} days");

    $template_coupon_code = $atts['template'];

    // Check if the template coupon code is provided
    if (empty($template_coupon_code)) {
        return "No template coupon code provided.";
    }

    // Fetch the template coupon
    $template_coupon = new WC_Coupon($template_coupon_code);

    if (!$template_coupon->get_id()) {
        return "Template coupon not found.";
    }

    // Generate a random, unique coupon code
    $new_coupon_code = $attr['prefix']  . strtoupper(wp_generate_password($attr[ 'length'], $attr['special'], false));

    // Create a new coupon
    $new_coupon = new WC_Coupon();

    // Copy settings from template coupon
    $new_coupon->set_code($new_coupon_code);
    $new_coupon->set_discount_type($template_coupon->get_discount_type());
    $new_coupon->set_amount($template_coupon->get_amount());
    $new_coupon->set_individual_use($template_coupon->get_individual_use());
    $new_coupon->set_product_ids($template_coupon->get_product_ids());
    $new_coupon->set_excluded_product_ids($template_coupon->get_excluded_product_ids());
    $new_coupon->set_usage_limit($template_coupon->get_usage_limit());
    $new_coupon->set_usage_limit_per_user($template_coupon->get_usage_limit_per_user());
    $new_coupon->set_expiry_date($expiry);
    $new_coupon->set_free_shipping($template_coupon->get_free_shipping());
    $new_coupon->set_product_categories($template_coupon->get_product_categories());
    $new_coupon->set_excluded_product_categories($template_coupon->get_excluded_product_categories());
    $new_coupon->set_minimum_amount($template_coupon->get_minimum_amount());
    $new_coupon->set_maximum_amount($template_coupon->get_maximum_amount());
//    $new_coupon->set_email_restrictions($template_coupon->get_email_restrictions());

    // Save the new coupon
    $new_coupon->save();

    // Return the coupon code for display
    return $new_coupon_code;
}

// Register the shortcode
add_shortcode('randomcoupon', 'wxp_generate_random_coupon');

Laten we nu eens in stappen kijken, wat we hierboven doen. In regel 3-12 stellen we de default attributen in voor alle waarden die in de $atts parameter mee kunnen komen. Zo weten we zeker met welke waarden we te maken krijgen.

In regel 14 maken we een ‘Unix time’ aan, Eén van de mogelijke waarden die we door kunnen geven als einddatum voor een coupon. Omdat we de einddatum op een hele dag, en niet op minuten of seconden willen zetten, gebruiken we een trucje (eerst naar string converteren, dan weer terug naar een ‘Unix time’) om dit snel te doen.

Omdat we de coupon naar aanleiding van een voorbeeld aan willen maken, gaan we eerst zoeken of die coupon ook voorkomt. Wanneer de parameter niet is ingevuld, of de coupon kan niet worden gevonden, geven we een foutmelding. (regel 16-28)

Dan komt het echte werk. Eerst bepalen we de naam voor de coupon. Met de functie wp_generate_password() maken we een nieuw wachtwoord aan. Of eigenlijk, een random string van een bepaalde lengte, die als wachtwoord zou kunnen dienen. De parameters zijn de lengte, of er ‘speciale tekens’ in voor mogen komen en of er ook ‘extra speciale tekens’ in voor mogen komen. ‘extra speciale tekens’ zijn tekens die niet zonder hulp op het toetsenbord te vinden zijn, en dat willen we dus in ieder geval niet. Speciale tekens is een keuze… naar mijn idee niet noodzakelijk voor een kortingscode.

Voor dat ‘password’ plaatsen we nog eventueel een ‘prefix’, zodat de coupons naar gebruikssoort makkelijk te groeperen zijn.

Regels 39-57 maken de nieuwe coupon aan, en geven de code terug en tenslotte wordt in regel 61 de naam ‘randomcoupon’ gekoppeld aan de functie.

Een geldige coupon shortcode zou bijvoorbeeld kunnen zijn

[randomcoupon template='OPTIN' expiry='14' prefix='OPT']

Vergeet niet onder Marketing->Waardebonnen in het Dashboard de coupon codes als template aan te maken.

Codesnippet verbeteren

Het doel van deze code snippet is een probleem op te lossen in een specifieke situatie. Daarom zie je regelmatig voorbeelden waar je specifiek tekst moet aanpassen om te krijgen wat je wilt. 

Wil jij leren hoe je complete plugins zelf kunt programmeren inclusief ‘admin’ schermen voor het instellen en de output in de gewenste taal, dan is misschien de cursus ‘Introductiecursus Plugins Programmeren‘ iets voor jou. 

Wil je als ‘full stack’ WordPress programmeur aan de gang gaan, dan biedt WordXPression ook een compleet traject ‘WordPress Developer‘ aan. Dit is een traject wat deels online, deels klassikaal wordt gegeven.

WordPress Developer worden?

Wil je leren hoe je zelf plugins, thema's, shortcodes, widgets, Gutenberg blocks en meer kan maken?
Schrijf je dan in voor de cursus WordPress Developer.

Meer snippets

In WooCommerce 'gratis verzending' als enige optie tonen.
Wanneer je in WooCommerce 'gratis verzending' als enige optie wilt tonen, moet je toch iets meer doe...
Titel voor reacties aanpassen per CPT
Wil je de titel van je WordPress commentaar sectie aanpassen, dan moet je dit beslist lezen.
JavaScript verbergen wanneer je bent ingelogd
Specifieke JavaScript code verbergen, wanneer je bent ingelogd.
Hoe kom ik aan WooCommerce productgegevens voor mijn snippets?
Een overzicht hoe je het best het $product object kan benaderen in verschillende situaties.
Checkout velden wel of niet verplicht maken
Hoe kan je checkout velden in WooCommerce wel of niet verplicht stellen?
Cache Warmer automatisch starten na Plugin updates
Cache warmer is een dienst om jouw site cache 'warm te houden. Hoe warm je hem opnieuw op, na een update...

Veiligheid voor alles!

Met betrekking tot de code die je hier aantreft een aantal waarschuwingen, voordat je deze code snippets toepast op je eigen website.

  1. Voer de code nooit direct uit op je eigen website, maar probeer deze eerst op een staging omgeving of een locale kopie van je website. 
  2. Voor je de geteste code installeert op je website, maak eerst een back up van je website.
  3. Zorg altijd voor alle zekerheid, dat je voor je een aanpassing live zet, je ook de FTP gegevens van je website bij de hand hebt.  
 
Voel je je onvoldoende vertrouwd met het toepassen van een dergelijke code snippet, bedenk dat je dit ook door een professional kan laten doen. De WordXPression support strippenkaart is een voordelige manier om dit soort aanpassingen te laten doen.
Heeft dit artikel je geholpen je probleem op te lossen?
Deel het met je vrienden via je favoriete social media.

Heb je vragen bij, of opmerkingen over deze code snippet, stel deze bij de commentaren hieronder.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Word je website de baas. Neem vandaag nog contact op!

Contact Information

WordXPression 

Bezoekadres
Eperweg 135 (op afspraak)
8072 PL Nunspeet

Postadres
Aardoliestraat 14-I
7553GT Hengelo

06-10449807 (van 9:00 tot 17:00 van ma-vr)

KVK : 75580152 

Social media
Stuur een bericht

Introductiecursus Plugins Programmeren

wordpress coding Can use php code as background in html

Ontdek de wereld van WordPress Plugin ontwikkeling met WordXPression's introductiecursus