Koopsuggesties op basis van eerdere orders toevoegen

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!

Het codefragment in deze snippet maakt onderdeel uit van een wat groter project. In het blogartikel ‘Flexibel tonen van product suggesties’ worden de ‘dynamic loops’ van Unlimited Elements besproken en zoals in het artikel belooft, volgt hier één van de codevoorbeelden die je kan gebruiken om deze product suggesties te gebruiken.

Wat je hier namelijk laat zien is hoe je op basis van de laatste x bestellingen, je de klant een suggestie kan doen, welke producten mogelijk ook interessant voor hem zouden kunnen zijn.

Voor het strategisch gebruik van deze functie verwijs ik je graag naar het blogartikel zelf. Hier bespreken we de code snippen en hoe je deze kan gebruiken.

We bepalen de mogelijke interesse op basis van de laatste drie orders!

In dit codevoorbeeld bepalen we de interesse op de basis van de laatste drie orders die iemand heeft geplaats. Heeft de persoon helemaal geen orders geplaatst, dan geeft de functie een lege string terug. Zijn er wel orders geplaatst, dan worden de cross sell suggesties bij de producten gebruikt om andere producten te tonen.

Dit veronderstelt natuurlijk wel dat de cross sells goed zijn ingericht.

Maar laten we eens aan de slag gaan met de code.

<?php 
function get_wxp_product_ids_for_customer() {
    // Get the current user object
    $current_user = wp_get_current_user(); 

    //Valid user? 
    if (0== $current_user->ID) return;

  
}

We beginnen met het ophalen van de gebruikers ID. Want wat we willen hebben zijn alle bestellingen, die door de ingelogde gebruiker ooit zijn gedaan. En daarvoor moeten we natuurlijk eerst weten welke gebruiker is ingelogd.

Dat doen we met de functie ‘wp_get_current_user’. Is er geen ‘current user’ -is er niemand ingelogd-, dan geeft deze functie geen waarde terug. Wat hij teruggeeft als er wel een ingelogde gebruiker is, zien we wat verderop in de code.

<?php
function get_wxp_product_ids_for_customer() {
    // Get the current user object
    $current_user = wp_get_current_user(); 

    //Valid user? 
    if (0== $current_user->ID) return;

    //args array... reusable to loop through the orders.
    $args = array(
        'numberposts'=> 3,
        'meta_key' => 'customer_user',
        'meta_value' => $current_user->ID,
        'post_type' => wc_get_order_types(),
        'post_status' => array_keys(wc_get_is_paid_statuses())
    );

    $customer_orders = get_posts($args);

 
    
}

De volgende stap is het ophalen van de bestellingen die behoren bij die klant. Dat doen we met de functie ‘get_posts’. Deze haalt de meest recente posts op van een specifiek post type. Geef je geen post type op, dan worden de blogposts (‘post’) getoond.

We kunnen op een heel gedetailleerde manier aangeven welke posts we willen hebben. Dat doen we in een gegevensstructuur die we een ‘array’ noemen. Hier geven we voor een aantal opties aan, welke waarde we hieraan toe willen kennen.

Het enige wat hier voor jou van belang is, is ‘numberposts’, die hier de waarde ‘3’ krijgt. Wil je jouw adviezen baseren op een groter aantal bestellingen, dan kies je hier -vanzelfsprekend- een hogere waarde.

Behalve wat tijd verspillen doet de functie echter nog niets. Dus laten we kijken, wat we verder nog moeten doen.

De inhoud van de bestellingen ophalen

<?php 
function get_wxp_product_ids_for_customer() {
    // Get the current user object
    $current_user = wp_get_current_user(); 

    //Valid user? 
    if (0== $current_user->ID) return;

    //args array... reusable to loop through the orders.
    $args = array(
        'numberposts'=> -1,
        'meta_key' => 'customer_user',
        'meta_value' => $current_user->ID,
        'post_type' => wc_get_order_types(),
        'post_status' => array_keys(wc_get_is_paid_statuses())
    );

    $customer_orders = get_posts($args);

    //We lopen door de orders heen. 

    if (!$customer_orders) return;
    $product_ids = array();
    foreach($customer_orders as $customer_order) {
        $order = wc_get_order($customer_order->ID);
        $items = $order->get_items();
        foreach ($items as $idem) {
            product_id = $item->get_product_id();
            if ($product_id) $product_ids[] = $product_id;
        }
    }

    $unique_product_ids = array_unique($product_ids);
}

Natuurlijk is het altijd mogelijk, dat er helemaal nog geen bestellingen zijn geplaatst. In dat geval zijn we ook klaar en in de regel

if (!$customer_orders) return;

zeggen we eigenlijk dat de code kan stoppen, wanneer er geen bestellingen voor die klant zijn gevonden.

Zijn er wel bestellingen voor de klant gevonden, dan lopen we één voor één door de orders heen, en binnen die orders door alle bestelregels. Bij iedere bestelregel halen we de product ID op van het product waarop die regel betrekking heeft.

Het is echter mogelijk, dat er geen product gekoppeld is aan een bestelregel. Dat is bijvoorbeeld mogelijk, wanneer je een order met de hand invoert vanuit het WooCommerce Dashboard en hier een kostenpost die niet direct gerelateerd is aan een product toevoegt.

Voor de meeste mensen zal dit nooit het geval zijn, maar om de code zo robuust mogelijk te maken, controleren we dat toch maar even in de regel

if ($product_id) $product_ids[] = $product_id;

Hier zeggen we dus in feite: ‘Als er een product ID is, voeg dat product dan toe aan een lijst met product ID’s.

De lijst ontdubbelen.

Nu is het natuurlijk heel goed mogelijk, dat je in je laatste drie bestellingen hetzelfde product meerdere malen hebt gekocht. Om te voorkomen, dat hierdoor ook de bijbehorende aanbevelingen in veelvoud voorkomen, gaan we deze ontdubbelen. En dat doen we met het volgende codefragment.

$unique_product_ids = array_unique($product_ids);

Maar we zijn er nog steeds niet. Want we hebben nu wel alle product ID’s opgehaald, maar daar ging het ons niet om. Het gaat om de product ID’s die aan onze producten zijn gerelateerd.

We moeten de code dus nog iets verder uitbreiden.

function get_wxp_product_ids_for_customer() {
    // Get the current user object
    $current_user = wp_get_current_user(); 

    //Valid user? 
    if (0== $current_user->ID) return;

    //args array... reusable to loop through the orders.
    $args = array(
        'numberposts'=> -1,
        'meta_key' => 'customer_user',
        'meta_value' => $current_user->ID,
        'post_type' => wc_get_order_types(),
        'post_status' => array_keys(wc_get_is_paid_statuses())
    );

    $customer_orders = get_posts($args);

    //We lopen door de orders heen. 

    if (!$customer_orders) return;
    $product_ids = array();
    foreach($customer_orders as $customer_order) {
        $order = wc_get_order($customer_order->ID);
        $items = $order->get_items();
        foreach ($items as $idem) {
            product_id = $item->get_product_id();
            if ($product_id) $product_ids[] = $product_id;
        }
    }

    $unique_product_ids = array_unique($product_ids);
    
    $related_products = array()  
    foreach($unique_product_ids as $unique_product_id) {
       $product = wc_get_product($unique_product_id);
       $xsells = $product->get_cross_sell_ids('view');
       foreach($xsells as $xsell) {
           $related_products[$xsell];
       }
    }
    return array_unique($related_products);
}

Deze functie geeft nu een serie ID’s terug, die betrekking hebben op producten die gekoppeld zijn als ‘cross sell’. Wil je liever de upsell ID’s gebruiken voor dit overzicht, dan kan dit ook, dan vervang je de functie ‘get_cross_sell_ids’ door ‘get_upsell_ids’.

Voor meer suggesties, houd het eerder genoemde blogartikel in de gaten.

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

Hoe kom ik aan WooCommerce productgegevens voor mijn snippets?
Een overzicht hoe je het best het $product object kan benaderen in verschillende situaties.
De webwinkel is op zondag gesloten
Het voordeel van een webshop is dat hij 24/7 open is. Maar wat nu, wanneer je op zon- en feestdagen principieel...
Een WooCommerce externe link in een nieuw tabblad openen
Wanneer je in je WooCommerce webshop (ook) affiliate producten aanbiedt, dan wil je eigenlijk niet dat...
Een shortcode om de winkelwagen inhoud te tonen
Soms wil je de inhoud van een winkelwagen laten zien. Met behulp van deze shortcode kan je de inhoud...
Hoe maak ik zelf een shortcode?
Bij het live gaan van de snippet base vroeg ik in mijn nieuwsbrief aan mijn lezers, of ze suggesties...
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...

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