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.