Je WooCommerce kortingsbonnen opruimen en dat zomaar helemaal automatisch? Zo doe je dat!
Wanneer je al wat langer een WooCommerce webshop hebt, dan kan het gebeuren, dat je behoorlijk wat verlopen kortingsbonnen in je bestand hebt staan. Helemaal wanneer je de één of andere plugin gebruikt die persoonlijke kortingscodes aanmaakt voor je klanten.
In mijn nieuwe cursus ‘Bouw Zelf je Webshop met Elementor Pro’ laat ik onder meer zien hoe je eigenlijk heel eenvoudig met MailPoet unieke kortingscodes naar degenen die zich inschrijven voor je nieuwsbrief kan laten sturen. Het nadeel van zo’n kortingscode is echter, dat wanneer dit een succes blijkt te zijn, je binnen no time honderden kortingscodes hebt die je lijst aardig vervuilen. Je kan die WooCommerce kortingsbonnen natuurlijk met de hand opruimen, maar dat is niet te doen.
Dus dat moeten we op een andere manier oplossen.
Ik ging op zoek naar een geschikte plugin, maar kon deze niet vinden. Dus dan gaan we voor de alternatieve mogelijkheid: Zelf een stukje PHP code plaatsen in de ‘functions.php’ file.
De code die je hier vindt is een code die werkt, maar mogelijk niet precies doet wat je wilt. Maar hierover vertel ik je later meer.
Je WooCommerce kortingsbonnen opruimen kan helemaal automatisch!
In het verleden heb ik je het één en ander over WP Cron verteld. En hoe WP Cron gebruikt wordt om taken in de achtergrond te verrichten. En dat is dus precies wat we in dit codevoorbeeld gaan implementeren.
Eenmaal per dag zal de code controleren of er kortingsbonnen zijn, waarvan de einddatum is verstreken en deze kortingsbonnen zullen naar de prullenbak worden verplaatst.
Waarom naar de prullenbak, en niet direct verwijderd? Ik ga ervan uit, dat je in ieder geval nog enige controle wilt hebben over wat je weggooit.
Een belangrijk punt om rekening mee te houden is de tijdinstelling voor WordPress. Ga je gebruik maken van de code in dit artikel, dan zal je in ieder geval bij de ‘Instellingen -> Algemeen’ willen controleren of de tijdinstelling ook klopt. Het zou vervelend zijn indien bonnen enkele uren te vroeg verwijderd worden… te laat is natuurlijk minder erg, omdat ze toch al verlopen zijn.
Ben je creatief met PHP, dan zie je mogelijk zelf ook, hoe je de code zo aan kan passen, dat er bijvoorbeeld alleen coupons verwijderd zullen worden, die minimaal 24 uur zijn verlopen.
Heel voorzichtig!
Op een moment dat je ook maar iets fout doet, ligt direct je website eruit. Dat kan je natuurlijk niet hebben. Wanneer je deze code gaat gebruiken, begin je natuurlijk in een staging omgeving. En je zorgt, dat je niet in de ‘functions.php’ van je thema gaat zitten tikken, maar je zorgt ervoor, dat je een child theme gebruikt.
Heb je al deze voorzorgsmaatregelen op zijn plaats? Laten we dan beginnen!
Praten met WP Cron
Persoonlijk vind ik het altijd belangrijk, dat je de code begrijpt, ook al zal je er wellicht nooit iets in willen veranderen, dus we bouwen de code stap voor stap op.
function wxp_schedule_delete_expired_coupons() {
if ( ! wp_next_scheduled( 'wxp_delete_expired_coupons' ) ) {
wp_schedule_event( time(), 'daily', 'wxp_delete_expired_coupons' );
}
}
add_action( 'init', 'wxp_schedule_delete_expired_coupons' );
Wat doe ik hier?
In de laatste regel vertel ik tegen WordPress, dat tijdens de ‘init’ actie van WordPress, het moment dat WordPress wordt geladen, een functie uitgevoerd moet worden die ‘wxp_schedule_delete_expired_coupons’ heet.
Dat ‘wxp_ is mijn eigen ‘prefix’ om te voorkomen dat functies dezelfde namen krijgen.
Die functie ‘wxp_schedule_delete_expired_coupons’ zal vervolgens tegen WP Cron vertellen, dat wanneer er nog geen event wxp_delete_expired_coupons bestaat, dit event in de WP Cron beplaatst moet worden en dagelijks moet worden uitgevoerd.
Helaas is dat event nog helemaal niet bekend. Daar hebben we nog een stukje extra code voor nodig…
De handen uit de digitale mouwen steken
Het is dus tijd om de handen uit de digitale mouwen te steken en te kijken, wat er bij WooCommerce kortingsbonnen opruimen allemaal komt kijken.
Dan moeten we dus eerst even nadenken, hoe we eigenlijk die verlopen kortingsbonnen op willen vragen. Gelukkig biedt WordPress hier zelf de middelen voor aan door middel van een interface, die de ‘WP_Query interface’ wordt genoemd. Opnieuw, je hoeft het niet allemaal in detail te begrijpen, maar het is goed om te weten wat je doet.
Wat ik tegen WP_Query wil zeggen is ‘laat mij alle kortingsbonnen zien waarvan de vervaldatum in het verleden ligt en waarvan ook nog eens geldt, dat de datum niet leeg mag zijn (een ‘lege’ datum ligt volgens WP_Query namelijk ook in het verleden. Terwijl in ons geval een lege vervaldatum wil zeggen, dat de bon niet vervalt!)
Dat kunnen we natuurlijk proberen in het Nederlands of Engels aan WordPress proberen te vertellen, maar het is veel nuttiger om dit in de taal PHP te vragen…
$args = array(
'posts_per_page' => -1,
'post_type' => 'shop_coupon',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'date_expires',
'value' => current_time( 'timestamp' ),
'compare' => '<='
),
array(
'key' => 'date_expires',
'value' => '',
'compare' => '!='
)
)
);
$coupons = get_posts( $args );
Coupons zijn een zogenaamde ‘custom post type’. Een gegevenstype wat eigen is aan WordPress. Daarom vertel ik, dat ik op zoek ben naar het post_type ‘shop_coupon’. En omdat ik ze allemaal wil hebben, en niet een beperkt aantal, geef ik ook nog eens aan, dat ‘post_per_page’ de waarde -1 moet krijgen, wat zoveel wil zeggen als ‘geef me alles wat je kan vinden’.
De ‘meta_query’ die geeft de preciese selectie aan. En hoewel je het wellicht niet zelf had kunnen bedenken, begrijp je waarschijnlijk met mijn inleiding wel, wat ik precies vraag.
Die hele ingewikkelde vraagstelling stoppen we in een pakketje (een variabele) die we $args noemen en we vragen via de functie get_posts() of het resultaat in een ander pakketje gestopt mag worden. $coupons.
Omdat we echter deze code ook aan willen kunnen roepen vanuit onze cron scheduler die we in het vorige codeblok hadden geschreven, verpakken we deze code in een functie.
Netjes ingepakt komt het er als volgt uit te zien
function wxp_delete_expired_coupons() {
$args = array(
'posts_per_page' => -1,
'post_type' => 'shop_coupon',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'date_expires',
'value' => current_time( 'timestamp' ),
'compare' => '<='
),
array(
'key' => 'date_expires',
'value' => '',
'compare' => '!='
)
)
);
$coupons = get_posts( $args );
if ( ! empty( $coupons ) ) {
foreach ( $coupons as $coupon ) {
wp_trash_post( $coupon->ID );
}
}
}
Nu hebben we hier echter één probleem. Hierboven vertelde ik je dat WP Cron een event aanroept, niet een functie. Wat we nog moeten doen is de functie hierboven ‘koppelen’ aan een zogenaamde ‘action’. Waarom dit zo ingewikkeld moet, zal ik je niet uitleggen, maar in ieder geval, doordat het zo ingewikkeld is, is WordPress eigenlijk zo flexibel.
We hebben nog één regeltje code nodig, om die koppeling aan te brengen.
add_action( 'wxp_delete_expired_coupons', 'wxp_delete_expired_coupons' );
Nu krijgt ‘add_action’ twee parameters mee met dezelfde naam. Toch zijn het twee verschillende parameters. De eerste is namelijk de actie / het event en de tweede is de functie die moet worden aangeroepen.
Voor het gemak geef ik die graag identieke namen. Maar dat hoeft beslist niet.
Nu hebben we alle stukjes van de code te pakken en is het tijd om eens een blik op het geheel te werpen. Onderstaande code moet je dus in je functions.php opnemen, de code hierboven is slechts bedoeld om je stap voor stap uit te leggen wat ik doe.
Ik heb in de code direct ook commentaar opgenomen aan het begin en het einde, zodat je straks in je functions.php precies kan zien, welke code allemaal te maken heeft met het verwijderen van je verlopen kortingsbonnen.
/**
* Begin opruimen verlopen coupons
*/
function wxp_schedule_delete_expired_coupons() {
if ( ! wp_next_scheduled( 'wxp_delete_expired_coupons' ) ) {
wp_schedule_event( time(), 'daily', 'wxp_delete_expired_coupons' );
}
}
add_action( 'init', 'schedule_delete_expired_coupons' );
/**
* Trash all expired coupons when the event is triggered.
*/
function wxp_delete_expired_coupons() {
$args = array(
'posts_per_page' => -1,
'post_type' => 'shop_coupon',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'date_expires',
'value' => current_time( 'timestamp' ),
'compare' => '<='
),
array(
'key' => 'date_expires',
'value' => '',
'compare' => '!='
)
)
);
$coupons = get_posts( $args );
if ( ! empty( $coupons ) ) {
foreach ( $coupons as $coupon ) {
wp_trash_post( $coupon->ID );
}
}
}
add_action( 'wxp_delete_expired_coupons', 'wxp_delete_expired_coupons' );
/**
* Einde opruimen verlopen coupons
*/
De uitgebreide versie
De code hierboven is de ‘light’ versie van de code. In de cursus ‘Bouw Zelf je WebShop met Elementor Pro‘ krijg je diverse codefragmenten waarmee je WooCommerce ver naar eigen hand kan zetten. Bovenstaande code -met enkele tweaks om deze flexibeler te maken- is daar ook een onderdeel van.
Wil jij een snelle webshop met een minimum aan plugins en een maximum aan performance? Dan is wellicht die cursus precies iets voor jou!
Maatwerk voor WooCommerce?
Sommige dingen kan je in WooCommerce doen door middel van plugins. Andere dingen beter niet. Een plugin kost altijd wat extra laadtijd en heeft extra overhead. Wil jij aanpassingen aan de functionaliteit van je WordPress website, maar wil je niet, dat dit ten koste gaat van je performance? Maak dan eens een belafspraak met mij, zodat we kunnen kijken of jouw wensen met maatwerk code zijn op te lossen!