{"id":234211,"date":"2023-02-13T15:08:00","date_gmt":"2023-02-13T12:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234211"},"modified":"2022-11-12T00:28:09","modified_gmt":"2022-11-11T21:28:09","slug":"guide-modifier-les-prix-dans-woocommerce-par-code","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/guide-modifier-les-prix-dans-woocommerce-par-code\/","title":{"rendered":"Guide : modifier les prix dans WooCommerce par code"},"content":{"rendered":"\n<p>Cet article est pour vous qui souhaitez ajouter du code qui ajuste les prix dans votre boutique en ligne WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Vous pouvez soit augmenter les prix, soit les r\u00e9duire. Et comment et d&rsquo;o\u00f9 viennent les ajustements, cela d\u00e9pend enti\u00e8rement de votre cas. Votre boutique en ligne peut fonctionner avec des remises en pourcentage d\u00e9finies sur chaque utilisateur enregistr\u00e9, un param\u00e8tre global personnalis\u00e9 dans les param\u00e8tres WooCommerce, une somme fixe cod\u00e9e en dur ou quelque chose d\u00e9fini sur chaque produit ou cat\u00e9gorie de produits.<\/p>\n<p>J&rsquo;ai essay\u00e9 de rendre le code aussi g\u00e9n\u00e9ral que possible afin que vous puissiez l&rsquo;adapter \u00e0 votre cas. Dans mon cas, les ajustements de prix proviennent d&rsquo;un pourcentage de remise ajout\u00e9 en tant que m\u00e9ta utilisateur.<\/p>\n<p>Le code est mis \u00e0 jour pour fonctionner avec WooCommerce 3.x et sup\u00e9rieur. Je ne peux pas garantir que cela fonctionnera pour les versions inf\u00e9rieures.<\/p>\n<h2>\u00c9tape\u00a01\u00a0: Cr\u00e9er un emplacement pour votre code<\/h2>\n<p>La premi\u00e8re \u00e9tape est facile; vous avez besoin d&rsquo;un endroit pour ajouter votre code. Cela d\u00e9pend enti\u00e8rement de vous. Vous pouvez l&rsquo;ajouter directement dans les fichiers de votre th\u00e8me <code>functions.php<\/code>ou quelque part dans vos fichiers de plug-in. J&rsquo;aime travailler avec des classes qui garderont tout bien ensemble au m\u00eame endroit. Par souci de simplicit\u00e9, je vais mettre la classe dans un sous-r\u00e9pertoire <code>\/src\/<\/code>de mon th\u00e8me, et l&rsquo;inclure et l&rsquo;instancier dans <code>functions.php<\/code>.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    public function __construct() {\n    }\n}<\/code><\/pre>\n<pre><code>require_once(get_stylesheet_directory().'\/src\/ChangePrices.php');\nnew ChangePrices();<\/code><\/pre>\n<p>Modifiez cette \u00e9tape en fonction de votre cas.<\/p>\n<h2>\u00c9tape 2\u00a0: D\u00e9cidez comment les ajustements de prix doivent fonctionner<\/h2>\n<p>Cette \u00e9tape est peut-\u00eatre d\u00e9j\u00e0 claire pour vous &#8211; c&rsquo;est l\u00e0 que vous devez savoir comment et o\u00f9 obtenir l&rsquo;ajustement de prix. L&rsquo;objectif final doit \u00eatre un nombre avec lequel vous additionnez, soustrayez, multipliez ou divisez les prix.<\/p>\n<p>Dans mon cas, j&rsquo;ai une m\u00e9ta utilisateur sur chaque utilisateur qui contient un pourcentage de r\u00e9duction\u00a0; un nombre compris entre 0 et 99. L&rsquo;administrateur du site peut d\u00e9finir une remise sur chaque utilisateur. Je ne montrerai pas le code pour ajouter le champ m\u00e9ta utilisateur, car cela pourrait ne pas \u00eatre pour vous et cela se fait facilement avec, par exemple, <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a>.<\/p>\n<p>Dans ma classe, je garde une variable de classe qui, dans le constructeur, sera d\u00e9finie sur un multiplicateur. Selon qu&rsquo;un utilisateur est connect\u00e9 ou non, je vais r\u00e9cup\u00e9rer la remise enregistr\u00e9e aupr\u00e8s de l&rsquo;utilisateur et cr\u00e9er un multiplicateur \u00e0 partir de celui-ci. Par d\u00e9faut, le multiplicateur doit \u00eatre 1. Prix 1 = m\u00eame prix qu&rsquo;avant. Mais pour une remise de 10 % par exemple, le multiplicateur serait de 0,9. Prix \u200b\u200b0,9 = prix r\u00e9duit de 10 %.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n    }\n\u00a0\n    public function getUserDiscount() {\n        if ((is_admin() &amp;&amp; !defined('DOING_AJAX')) || (!is_user_logged_in())) {\n            return 1;\n        }\n\u00a0\n        $user = wp_get_current_user();\n        $discount = (int)get_user_meta($user-&gt;ID, 'webshop_discount_percentage', true);\n\u00a0\n        return ($discount &lt; 1 || $discount &gt; 99)? 1: abs(($discount\/100)-1);\n    }\n}<\/code><\/pre>\n<p>Maintenant que j&rsquo;ai un multiplicateur pr\u00eat \u00e0 l&#8217;emploi, il est temps de se pencher sur l&rsquo;ajustement des prix dans WooCommerce.<\/p>\n<h2>\u00c9tape 3: Filtres de prix dans WooCommerce<\/h2>\n<p>Dans WooCommerce, il existe un filtre pour les types de produits simples, group\u00e9s et externes, et un autre pour les types de produits variables. Je vous recommande d&rsquo;ajouter les deux filtres pour couvrir tous les types de produits. En plus de cela, WooCommerce fonctionne avec trois filtres de prix suppl\u00e9mentaires :<\/p>\n<ul>\n<li>Prix \u200b\u200br\u00e9guliers (<code>woocommerce_product_get_regular_price<\/code>et <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Prix \u200b\u200bde vente (<code>woocommerce_product_get_sale_price<\/code>et <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>Le prix actif actuel (<code>woocommerce_product_get_price<\/code>et <code>woocommerce_product_variation_get_price<\/code>). Le prix actif actuel sera extrait du prix normal ou du prix de vente.<\/li>\n<\/ul>\n<p>Maintenant, vous pouvez simplement filtrer le prix actif actuel et l&rsquo;appeler un jour, mais cela d\u00e9pend de la fa\u00e7on dont vous souhaitez g\u00e9rer l&rsquo;affichage des prix dans votre boutique en ligne. N&rsquo;oubliez pas que les produits en solde affichent par d\u00e9faut l&rsquo;ancien prix (prix normal) barr\u00e9 et le prix sold\u00e9 (prix actif) \u00e0 c\u00f4t\u00e9. Si vous filtrez uniquement <code>x_get_price<\/code>et qu&rsquo;un produit est en solde, l&rsquo;ancien prix sera affich\u00e9 sans remise.<\/p>\n<p>Pour cette raison, j&rsquo;ai choisi de filtrer \u00e0 la fois le prix actuel actif (<code>x_get_price<\/code>) et le prix normal (<code>x_get_regular_price<\/code>), car je ne veux pas confondre les utilisateurs de ma boutique en ligne.<\/p>\n<h3>R\u00e9daction du filtre de prix<\/h3>\n<p>Les quatre filtres feront r\u00e9f\u00e9rence \u00e0 la m\u00eame fonction. Dans la fonction, nous multiplions simplement le prix fourni avec la variable de classe. N&rsquo;oubliez pas que si aucune remise n&rsquo;est d\u00e9finie, le multiplicateur est de 1, ce qui n&rsquo;entra\u00eene aucun changement de prix.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function getUserDiscount() {\n        ....<\/code><\/pre>\n<p>Notez que tous les filtres fournissent l&rsquo;objet produit comme deuxi\u00e8me param\u00e8tre. Si vous souhaitez ajuster les prix en fonction des produits, vous pouvez ajuster le code pour le faire.<\/p>\n<p>Si vous consultez votre boutique en ligne tout en \u00e9tant connect\u00e9 en tant qu&rsquo;utilisateur b\u00e9n\u00e9ficiant d&rsquo;une r\u00e9duction, vous devriez maintenant voir des prix r\u00e9duits\u00a0! Cependant, nous n&rsquo;avons pas encore tout \u00e0 fait termin\u00e9. WooCommerce a apport\u00e9 quelques modifications \u00e0 la version 2.4.7 (en <a href=\"https:\/\/woocommerce.wordpress.com\/2015\/09\/14\/caching-and-dynamic-pricing-upcoming-changes-to-the-get_variation_prices-method\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">savoir plus ici<\/a>) qui affectent la tarification dynamique des produits variables.<\/p>\n<h3>Gestion des prix variables des produits<\/h3>\n<p>Pour que la tarification dynamique fonctionne sur des produits variables, vous devez ajouter les filtres mentionn\u00e9s dans le billet de blog li\u00e9 ci-dessus\u00a0; <code>woocommerce_variation_prices_price<\/code>(et le filtre de prix r\u00e9gulier correspondant <code>woocommerce_variation_prices_regular_price<\/code>) <strong>et<\/strong> le filtre <code>woocommerce_get_variation_prices_hash<\/code>. Le filtre de hachage g\u00e8re le cache interne de WooCommerce &#8211; et nous devons dire \u00e0 WooCommerce de l&rsquo;effacer correctement lorsque nous modifions les prix par code.<\/p>\n<p>Les deux premiers filtres de prix suivent la m\u00eame proc\u00e9dure que <code>adjustPrice()<\/code>, cependant je leur attribue une fonction diff\u00e9rente car les param\u00e8tres sont diff\u00e9rents. En ce qui concerne la fonction de filtre de hachage, nous devons ajouter au tableau de hachage pour identifier quand le cache doit \u00eatre effac\u00e9. L&rsquo;ajout de l&rsquo;ID utilisateur est une bonne id\u00e9e car le multiplicateur est unique pour chaque utilisateur.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n\u00a0\n        add_filter('woocommerce_variation_prices_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_variation_prices_regular_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_get_variation_prices_hash', [$this, 'variationPricesHash']);\n    }\n\u00a0\n    public function variationPricesHash($hash) {\n        $hash[] = get_current_user_id();\n        return $hash;\n    }\n    public function adjustVariablePrice($price, $variation, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        ...<\/code><\/pre>\n<p>Enfin, \u00e7a devrait \u00eatre \u00e7a !<\/p>\n<p>Notez que vous avez acc\u00e8s \u00e0 l&rsquo;objet produit complet dans tous les filtres (m\u00eame objet variation dans les deux derniers). Ceci est utile dans les cas o\u00f9 vous souhaitez ajuster les prix en fonction des informations sur le produit\u00a0; comme exclure certains produits de la r\u00e9duction ou appliquer une r\u00e9duction en fonction des cat\u00e9gories de produits. Il devrait \u00eatre assez simple pour vous d&rsquo;ajuster le code \u00e0 ce dont vous avez besoin pour votre cas.<\/p>\n<h2>Le code final complet<\/h2>\n<p>Comme d&rsquo;habitude, j&rsquo;esp\u00e8re que vous avez appris quelque chose en suivant ce post \u00e9tape par \u00e9tape, mais je vais fournir la classe compl\u00e8te \u00e0 titre de r\u00e9f\u00e9rence\u00a0:<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n\u00a0\n    var $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n\u00a0\n        add_filter('woocommerce_variation_prices_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_variation_prices_regular_price', [$this, 'adjustVariablePrice'], 99, 3);\n\u00a0\n        add_filter('woocommerce_get_variation_prices_hash', [$this, 'variationPricesHash']);\n    }\n\u00a0\n    public function variationPricesHash($hash) {\n        $hash[] = get_current_user_id();\n        return $hash;\n    }\n\u00a0\n    public function adjustVariablePrice($price, $variation, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function getUserDiscount() {\n        if ((is_admin() &amp;&amp; !defined('DOING_AJAX')) || (!is_user_logged_in())) {\n            return 1;\n        }\n\u00a0\n        $user = wp_get_current_user();\n        $discount = (int)get_user_meta($user-&gt;ID, 'webshop_discount_percentage', true);\n\u00a0\n        return ($discount &lt; 1 || $discount &gt; 99)? 1: abs(($discount\/100)-1);\n    }\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce tutoriel explique comment ajuster les prix dans votre boutique en ligne WordPress WooCommerce \u00e0 l&rsquo;aide de code. Les exemples incluent le pourcentage de remise ou la somme fixe.<\/p>\n","protected":false},"author":1,"featured_media":223696,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,1110,811,811,841,841,852,852,862,862],"tags":[1167],"class_list":{"0":"post-234211","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-code-2","9":"category-n-a","10":"category-plugins-2","12":"category-tutoriels","14":"category-woocommerce-3","16":"category-wordpress-3","18":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234211"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234211\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}