Attribuer une récompense à un parrain après un achat WooCommerce

Suite de notre série de tutoriels orientés WooCommerce : abordons maintenant le versement d’une commission au parrain qui a proposé un produit à la vente dans notre boutique.

Si vous avez manqué le début de cette série de tutoriels, rendez-vous dans la première partie d’introduction pour en savoir plus 😉 Sachez aussi que ce plugin est téléchargeable gratuitement et  que vous pouvez découvrir son code sur GitHub.

Dans notre dernier article, nous avons développé un shortcode permettant l’affichage d’un formulaire sur notre site WordPress, formulaire qui permet à tout utilisateur (identifié sur notre site e-commerce) de proposer un produit à la vente. Nous avons également analysé la logique propre au traitement de ce formulaire WordPress afin d’exécuter chaque action « séparément » dans sa propre fonction hookée sur un filtre commun.

Objectif : augmenter la cagnotte d’un parrain

Maintenant que des produits peuvent être indiqués par des « prescripteurs » dans notre boutique et validés par l’administrateur afin d’être disponibles à la vente, jetons un œil à une fonctionnalité très importante de notre extension WooCommerce : le versement d’une commission au parrain du produit, après l’achat d’un produit par un client.

Chaque commande peut évidemment contenir plusieurs produits achetés : plusieurs parrains sont donc peut-être concernés par des nouveaux gains d’une ou plusieurs commission(s). Et chaque parrain recevra une commission pour chacun des produits qu’il a proposé et qui vient d’être acheté : notre objectif est d’enregistrer, à chaque commande, une commission par produit et non pas une commission unique par parrain.

Cela va nous permettre en fin de tutoriel d’afficher au parrain des informations détaillées des commissions versées en indiquant quel produit a été acheté lors d’une commande et combien ce produit aura rapporté de points au parrain au moment de la commande.

Tableau récapitulatif des points gagnés et utilisés par un parrain
Tableau récapitulatif des points gagnés et utilisés par un parrain

Comment verser une commission WooCommerce à un utilisateur ?

D’abord, le code…

<?php

function msk_save_commissions_gains_from_order_items($order_id, $old_status, $new_status) {
	global $wpdb;
	$commissions_table_name = $wpdb->prefix . 'commissions';
	// On récupère la commande concernée et les valeurs importantes
	$order = wc_get_order($order_id);
	$order_items = $order->get_items();
	$order_customer_id = $order->get_customer_id();
	$type = 'gain';
	$order_status = $new_status;
	// Si la commande était "terminée" et change de statut, on supprime toute trace de commission concernant cette commande
	if ($old_status == 'completed') {
		$wpdb->delete(
			$commissions_table_name,
			array('order_id' => $order_id, 'type' => $type),
			array('%d', '%s')
		);
	}
	// Si la commande devient "terminée"
	if ($new_status == 'completed') {
		// On analyse chaque ligne (produit) de la commande
		foreach ($order_items as $order_item) {
			// On récupère le produit
			$line_product_id = $order_item->get_product_id();
			$line_product = wc_get_product($line_product_id);
			// On récupère les infos de commissions du produit
			$line_product_start_date = $line_product->get_meta('commission_date_start', true);
			$line_product_end_date = $line_product->get_meta('commission_date_end', true);
			// Si la date de commission est définie...
			if ($line_product_start_date != '' && !empty($line_product_start_date) && $line_product_end_date != '' && !empty($line_product_end_date)) {
				$order_timestamp = $order->get_date_created()->getOffsetTimestamp();
				$commission_start_timestamp = strtotime($line_product_start_date);
				$commission_end_timestamp = strtotime($line_product_end_date);
				// Si si la date de la commande est comprise entre la date de début et de fin de validité de commission...
				if ($order_timestamp > $commission_start_timestamp && $order_timestamp < $commission_end_timestamp) {
					// On récupère l'ID du parrain, le taux de commission
					$user_id = $line_product->get_meta('commission_user_id', true);
					$line_product_rate = $line_product->get_meta('commission_rate', true);
					// On récupère la quantité de produits achetés
					$line_product_quantity = $order_item->get_quantity();
					// On récupère le total de la ligne
					$line_subtotal = $order_item->get_subtotal();
					// Si la ligne de cette commande a un coût supérieur à 0, et si un taux de commission est défini sur ce produit...
					if ($line_product_rate > 0 && $line_subtotal > 0) {
						// On calcule la commission à reverser
						$amount = round((msk_price_to_float($line_product_rate) * $line_subtotal) / 100, 2);
						// Et si l'acheteur est le parrain, on double sa récompense
						if ($order_customer_id == $user_id) {
							$amount = $amount * 2;
						}
					}
					// Enfin, on enregistre toutes ces données dans notre table SQL
					if ($user_id != '' && !empty($user_id) && $amount > 0) {
						$data = array(
							'type' => $type,
							'amount' => $amount,
							'user_id' => $user_id,
							'order_id' => $order_id,
							'line_product_id' => $line_product_id,
							'line_product_rate' => $line_product_rate,
							'line_product_quantity' => $line_product_quantity,
							'line_subtotal' => $line_subtotal,
							'user_notified' => 'no',
							'time' => current_time('mysql')
						);
						$wpdb->insert(
							$commissions_table_name,
							$data
						);
					}
				}
			}
		}
	}
}
add_action('woocommerce_order_status_changed', 'msk_save_commissions_gains_from_order_items', 10, 3);

On ne change pas une équipe qui gagne : pour pouvoir inclure de nouvelles logiques dans le fonctionnement de WooCommerce, on va encore utiliser une action ! Cette fois, on se hooke sur l’action woocommerce_order_status_changedCette action s’exécute à chaque fois que le statut d’une commande WooCommerce change : on va donc vérifier le nouveau statut de la commande et si elle est bel et bien définie comme étant terminée, nous allons calculer et attribuer une ou plusieurs commissions aux parrains des produits achetés.

Notez qu’elle reçoit 3 paramètres de WooCommerce : l’identifiant de la commande ($order_id) et les noms machines de l’ancien et du nouveau statut de la commande ($old_status et $new_status). Ces 3 valeurs sont primordiales pour en savoir plus sur la commande, et connaître l’état (statut) de cette dernière.

Analysons un peu cette fonction histoire de comprendre ce qu’elle fait :

  • ligne 15 à 20 : on récupère des informations de la commande (avec wc_get_order()) et les articles de cette commande (avec $order->get_items()) puis on définit quelques variables initiales
  • ligne 23 à 29 : si l’ancien statut de la commande était « terminée », on a probablement enregistré des commissions sur cette commande. On va donc supprimer les lignes de commissions de notre table wp_commissions dont la colonne order_id a comme valeur l’identifiant de la commande qui est traitée (valeur stockée dans la variable $order_id). En d’autres termes : on oublie les gains de commissions enregistrés dans notre base de données car la commande n’est plus « terminée ». Elle a peut-être été annulée ou remboursée.
  • à partir de la ligne 32, on va faire l’inverse : si la commande passe en statut « terminée », on va devoir assigner des commissions. On va donc analyser chaque article acheté dans la commande, en bouclant sur la variable $order_items (ligne 34).
    • ligne 36 et 37, on va chercher via wc_get_product() le produit acheté
    • ligne 40 et 41 : on va récupérer les dates de début et de fin de commission qui sont stockées dans des meta-données (définies lors de la soumission du formulaire, ou par l’administrateur de la boutique)
    • ligne 50 : on s’assure que la date de la commande est bien comprise dans la période de validité de commission
    • ligne 51 à 57 : on récupère l’identifiant de l’utilisateur parrain à créditer (ligne 52), le taux de commission du produit (ligne 53), la quantité de produits achetés (ligne 55) et le sous-total de la commande pour cette ligne d’articles (ligne 57)
    • ligne 60 à 68 : on va calculer le montant de la commission à reverser au parrain. De plus, on en profite pour doubler la valeur du montant reversé si l’acheteur est en fait également le parrain (ligne 65 et 66)
    • enfin, de la ligne 72 à 88 : on enregistre dans notre table SQL wp_commissions une nouvelle ligne contenant les informations que l’on vient de calculer. Remarquez que la valeur de la colonne user_notified est définie sur « no » : plus tard, nous enverrons un e-mail à l’utilisateur pour l’informer des nouveaux gains qu’il a reçus (une fois prévenu de ce nouveau gain, on remplacera cette valeur « no » par la date d’envoi de l’e-mail de notification). C’est donc cette colonne qui va permettre à notre plugin WooCommerce de savoir quelles commissions récentes n’ont pas encore été communiquées au parrain par e-mail.
Colonne de notre table SQL WordPress des commissions
Colonne de notre table SQL WordPress des commissions

Et voila ! Avec cette bonne grosse fonction hookée sur la bonne action WooCommerce, notre code va intercepter tout changement de statut de commande WooCommerce et : soit supprimer les commissions, soit créer un nouvel enregistrement d’un gain-récompense pour un parrain.

Mais enregistrer ces données de gains des parrains n’a aucune utilité si les utilisateurs ne peuvent utiliser leur cagnotte. C’est notre prochaine étape : permettre au client WooCommerce d’utiliser sa cagnotte comme réduction !


Vous avez aimé cet article ?

Partagez-le sur vos réseaux sociaux en guise de remerciement :)


3 commentaires

Bonsoir, svp avez vous une variante de plugin qui permettrait de verser une commission au parain à chaque fois qu’un utilisateur filleul achète !?
Merci

Laisser un commentaire