Koopsuggesties op basis van eerdere orders toevoegen

Koopsuggesties op basis van eerdere orders toevoegen

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() {

    $current_user = wp_get_current_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() {

    $current_user = wp_get_current_user(); 


    if (0== $current_user->ID) return;


    $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() {

    $current_user = wp_get_current_user(); 


    if (0== $current_user->ID) return;


    $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);



    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() {

    $current_user = wp_get_current_user(); 


    if (0== $current_user->ID) return;


    $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);



    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.

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

JavaScript verbergen wanneer je bent ingelogd
Specifieke JavaScript code verbergen, wanneer je bent ingelogd.
WooCommerce tabbladen onder elkaar zetten
Heb je wel eens een grote webshop gezien met product tabs? Precies. En daarom willen wij onze WooCommerce...
In WooCommerce 'gratis verzending' als enige optie tonen.
Wanneer je in WooCommerce 'gratis verzending' als enige optie wilt tonen, moet je toch iets meer doen!
De geschatte leestijd voor je content tonen
Laat de geschatte tijd voor een blogposts zien op diverse manieren.
WooCommerce checkout velden verwijderen
Sommige velden in het bestelformulier van WooCommerce heb je absoluut niet nodig. En zo haal je ze weg!
Een 'Niet op voorraad' knop in WooCommerce
Hoe voorkom je teleurstelling bij je klant wanneer hij zijn favoriete product bij jou vindt, zonder dat...

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 antwoord

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

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

Contact Information

WordXPression 
Imkersdreef 525
7328DG Apeldoorn
06-10449807 (van 9:00 tot 17:00 van ma-vr)

KVK : 75580152 

Social media
Stuur een bericht