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.