Ajouter les prix de revient des produits Woocommerce, calculer les marges nettes sans plugin

Woocommerce est l’extension de référence pour créer une boutique E-commerce sur un site WordPress. Cependant, Woocommerce ne permet pas tout. Par défaut, il n’est pas prévu de pouvoir saisir les prix d’achat (ou prix de revient ) des produits pour connaître les marges nettes réalisées.

Découvrons ensemble comment ajouter cette fonctionnalité à Woocommerce.

Première étape, ajouter ces champs au back-office

La première chose à faire pour mettre en place cette fonctionnalité est très logiquement d’ajouter un champ permettant de saisir notre prix de revient dans le back-office de la fiche produit.

Il y a cependant une subtilité à prendre en compte : Pour les produits variables, il faudra que ce champ apparaisse au niveau des variations.

Il va donc falloir créer deux fonctions différentes qui vont venir s’accrocher à deux hooks différente. Voici le code :

Pour les produits simples

				
					function MSW_add_input_prix_revient_fiche_produit() 
{
	global $post;
	
	woocommerce_wp_text_input( array(
		'id' => 'prix_revient',
		'label' => __( 'Prix de revient', 'woocommerce' ),
		'value' => get_post_meta( $post->ID, '_prix_revient', true ),
		'desc_tip'    => 'true',
		'description' => __('Saisissez le prix de revient de votre produit', 'woocommerce'),
		)
	);
}
add_action( 'woocommerce_product_options_pricing', 'MSW_add_input_prix_revient_fiche_produit' );
				
			

Pour les produits variables

				
					function MSW_add_input_prix_revient_variation_fiche_produit( $loop, $variation_data, $variation ) 
{
	woocommerce_wp_text_input( array(
		'id' => 'prix_revient[' . $loop . ']',
		'wrapper_class' => 'form-row form-row-first',
		'label' => __( 'Prix de revient', 'woocommerce' ),
		'value' => get_post_meta( $variation->ID, '_prix_revient', true ),
		'description' => __('Saisissez le prix de revient de votre produit', 'woocommerce'),
		)
	);
}
add_action( 'woocommerce_variation_options_pricing', 'MSW_add_input_prix_revient_variation_fiche_produit', 10, 3 );
				
			

Ou ajouter ces fonctions ?
Ces fonctions sont à ajouter dans le fichier functions.php de votre thème enfant.

Comme vous pouvez le constater, nous avons ajouté deux champs de type texte au back-office. 
En l’état, ces fonctions n’exécutent aucune vérification du contenu.
Une amélioration possible serait de vérifier la valeur des champs avec un langage côté client comme Javascript ou Jquery pour empêcher toute saisie erronée.

Une fois ces fonctions ajoutées à votre thème enfant, vous avez désormais deux nouveaux champs dans votre back-office WordPress.
La prochaine étape est de sauvegarder ces champs lorsque la fiche produit est créée ou mise à jour.

Seconde étape, sauvegarder ces champs

Tout comme l’ajout des champs, il va falloir utiliser deux hooks différents pour sauvegarder les valeurs contenus dans ces champs.
Comme la plupart des informations additionnelles de la fiche produit, nous allons les stocker en tant que post meta pour pouvoir les retrouver facilement lorsque nous en aurons besoin, à l’aide de la fonction get_post_meta().

Pour les produits simples

				
					function MSW_save_input_prix_revient_fiche_produit($post_id)
{
	if ( isset( $_POST['prix_revient'] ) ) update_post_meta( $post_id, '_prix_revient', esc_attr( $_POST['prix_revient'] ) );
}
add_action( 'woocommerce_process_product_meta', 'MSW_save_input_prix_revient_fiche_produit' );
				
			

Pour les produits variables

				
					function MSW_save_input_prix_revient_variation_fiche_produit( $variation_id, $i )
{
	if ( isset( $_POST['prix_revient'][$i] ) ) update_post_meta( $variation_id, '_prix_revient', esc_attr( $_POST['prix_revient'][$i] ) );
}
add_action( 'woocommerce_save_product_variation', 'MSW_save_input_prix_revient_variation_fiche_produit', 10, 2 );
				
			

Ou ajouter ces fonctions ?
Ces fonctions sont à ajouter dans le fichier functions.php de votre thème enfant.

En l’état, ces fonctions ne font qu’échapper le code HTML des valeurs saisies dans les champs et récupérées avec la globale $_POST.

Une amélioration possible serait d’ajouter d’analyser la valeur du champ et de retourner une erreur si elle n’est pas conforme.
Tous les utilisateurs n’exécutent pas toujours via leur navigateur les langages client comme Javascript ou Jquery.
Vérifier les champs avant la soumission du formulaire est une chose, mais il faut aussi dans ce cas les vérifier côté serveur lors du traitement :).

Désormais, vous pouvez saisir les prix de revient de vos produits dans le back-office, et ils seront sauvegardés en base de donnée.

Dernière étape, traiter ces champs pour calculer une marge nette

Vos champs sont désormais fonctionnels, mais rien n’est encore calculé dans Woocommerce.
Intéressons nous tout d’abord à la façon dont nous allons récupérer ces champs :

Etant donné qu’ils ont été sauvegardés en tant que post meta, nous allons les récupérer avec la fonction get_post_meta().
Selon si le produit est simple ou variable, il faudra faire attention à utiliser l’ID du produit ou l’ID de la variation. Cela donnera par exemple dans une boucle des items d’une commande :

				
					function MSW_calculer_marge_nette_commande( $order_id )
{
	foreach ( $order->get_items() as $item_id => $item ) 
	{
		if ( $item->get_variation_id() != 0 ) $prix_revient = floatval( get_post_meta( $item->get_variation_id(), '_prix_revient', true ) );
		else $prix_revient = floatval( get_post_meta( $item->get_product_id(), '_prix_revient', true ) );
	}
	
	echo 'Le prix de revient du produit est de ' . prix_revient . '<br />';
}
				
			

Cette fonction nous montre comment récupérer la valeur des prix de revient, mais il n’y a aucun traitement effectué.
Voyons désormais comment cette même fonction peut nous retourner une marge nette de la commande en question :

				
					function MSW_calculer_marge_nette_commande( $order_id )
{
	$order = wc_get_order ( $order_id );
	
	//Récupère le total de la commande
	$marge_nette = $order->get_subtotal();
	
	//Retire les promotions appliquées
	$marge_nette -= $order->get_total_discount();

	foreach ( $order->get_items() as $item_id => $item ) 
	{
		if ( $item->get_variation_id() != 0 ) $prix_revient = floatval( get_post_meta( $item->get_variation_id(), '_prix_revient', true ) );
		else $prix_revient = floatval( get_post_meta( $item->get_product_id(), '_prix_revient', true ) );
		
		//Retire le prix de revient du produit multiplié par la quantité commandée
		$marge_nette -= $item->get_quantity() * $prix_revient;
	}
	
	return $marge_nette;
}
				
			

Cette fonction, plus complète, fonctionne de la manière suivante :

  • Elle récupère l’objet commande et initialise une variable $marge_nette à la valeur du total commande.
  • A ce total de commande, on retire les éventuelles promotions appliquées à la commande.
  • Ensuite, pour chaque produit de la commande, on retire le prix de revient du produit multiplié par la quantité.
  • Pour terminer, on retourne cette valeur de marge nette.

Améliorations possibles
Cette fonction ne prend pas en compte les frais de livraison, ou d'éventuels frais fixes.
Si vous souhaitez ajouter des frais fixes à votre commande, pensez à la table options de votre base de données pour stocker une valeur de frais fixes.

Ajouter la marge nette dans une colonne du
tableau de commande Woocommerce

Notre fonction retourne désormais une valeur, mais à part si on l’appelle dans un script spécifique, elle n’est jamais appelée puisqu’elle n’est accrochée à aucun hook, et elle n’est utilisée dans aucun filtre.

De multiples possibilités s’offrent à nous pour afficher cette valeur, mais nous allons voir ici comment ajouter une nouvelle colonne au tableau de commande Woocommerce.

Cet ajout se fait en deux étapes utilisant encore une fois deux hooks distincts :

Ajouter l'entête du tableau

				
					function MSW_add_entete_marge_net_colonne_commandes( $columns )
{
	$columns['marge_nette'] = 'Marge nette';
    return $columns;
}
add_filter( 'manage_edit-shop_order_columns', 'MSW_add_entete_marge_net_colonne_commandes', 20 );
				
			

Ajouter le contenu dans le tableau

				
					function MSW_add_contenu_marge_net_colonne_commandes( $column ) 
{
    global $post;

    if ( $column == 'marge_nette' ) 
	{
		$order = wc_get_order ( $post->ID );

		//Récupère le total de la commande
		$marge_nette = $order->get_subtotal();
		
		//Retire les promotions appliquées
		$marge_nette -= $order->get_total_discount();
		
		$prix_manquant = false;

		foreach ( $order->get_items() as $item_id => $item ) 
		{
			if ( $item->get_variation_id() != 0 ) $prix_revient = floatval( get_post_meta( $item->get_variation_id(), '_prix_revient', true ) );
			else $prix_revient = floatval( get_post_meta( $item->get_product_id(), '_prix_revient', true ) );
			
			if ($prix_revient == 0) $prix_manquant = true;
			
			//Retire le prix de revient du produit multiplié par la quantité commandée
			$marge_nette -= $item->get_quantity() * $prix_revient;
		}
		
		
		if ( $prix_manquant == false ) $marge_nette = wc_price( $marge_nette, array( 'currency' => $order->get_currency() ) );
		else $marge_nette = '—';

		echo $marge_nette;
    }
}
add_action( 'manage_shop_order_posts_custom_column', 'MSW_add_contenu_marge_net_colonne_commandes' );
				
			

Analysons ce que nous avons ajouté :

  • Après avoir récupéré la globale $post, nous récupérons l’objet commande à l’aide de l’ID du post dont on veut calculer la marge nette.
  • Nous initialisons une variable $prix_manquant à false, cette variable nous permettra de vérifier que tous les prix de revient ont été saisis.
  • Pour chaque item de la commande, si le prix de revient est à 0, la variable $prix_manquant prend la valeur true.
  • Si aucun prix n’est manquant, on retourne donc la marge nette après un petit passage par wc_price() pour formater la valeur.
  • Par contre, si un prix est manquant, la fonction considère que le calcul de marge nette ne sera pas bon et renvoit ‘—’.

Le résultat en image :

La conclusion !

Woocommerce est une très bonne extension qui s’est bien améliorée ces dernières années. Ce plugin permet de faire beaucoup de choses dans sa version de base, mais surtout il dispose de beaucoup de filtres et hook que nous pouvons utiliser pour personnaliser au mieux l’expérience du visiteur, mais aussi ici le back-office.

Si vous avez besoin d’aide au paramétrage de votre boutique Woocommerce, nous sommes disponibles pour étudier votre besoin :

Les tags

A bientôt pour de nouvelles astuces ! 🙂

Vous avez aimé cet article ? Vous pouvez

Le partager avec votre communauté

ou
ou

Nous laisser votre commentaire pour nous en dire plus

Articles similaires

Personnaliser le formulaire de validation de commande Woocommerce

Le tunnel de vente d’un site E-commerce est extrêmement important pour que les ventes se convertissent.
Une page de validation de commande trop succincte, peu réfléchie, ou au contraire une page surchargée aura un impact négatif sur vos ventes.
Découvrons ensemble comment personnaliser la page de checkout pour offrir une expérience utilisateur optimale à vos clients.

Lire l'article

Pourquoi nous avons créé notre plugin Monsieur Site Web

WordPress est magique, certes !
Mais pour réaliser un site internet professionnel, WordPress à quelques inconvénients et certaines fonctionnalités nécessaires doivent être ajoutées sur chaque site internet.
C’est pourquoi chez Monsieur Site Web, nous avons créé notre propre plugin qui nous permet d’effectuer des actions de manière automatique sur votre futur site.
Découvrons en détails le fonctionnement de notre plugin.

Lire l'article

Les commentaires

Super explication

Rated 5,0 out of 5
7 mars 2023

Pas mal le tuto pour débutant par contre je sais pas si c est encore d’actualité surtout au niveau du hook pour sauvegarder les champs, ça ne marche pas chez moi

Une solution ?

Et bravo encore pour ce tuto

Nightbringer

Bravo et merci !

Rated 5,0 out of 5
16 août 2022

Un super tuto pour un super plugin super utile !

Renaud

Réponse de Monsieur Site Web

Merci pour votre commentaire 🙂

Laisser un commentaire