{"id":234255,"date":"2023-02-22T13:01:00","date_gmt":"2023-02-22T10:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234255"},"modified":"2022-11-12T02:22:09","modified_gmt":"2022-11-11T23:22:09","slug":"comment-ajouter-des-champs-et-des-onglets-personnalises-dans-la-metabox-de-donnees-de-produit-woocommerce-par-code","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-champs-et-des-onglets-personnalises-dans-la-metabox-de-donnees-de-produit-woocommerce-par-code\/","title":{"rendered":"Comment ajouter des champs et des onglets personnalis\u00e9s dans la m\u00e9tabox de donn\u00e9es de produit WooCommerce par code"},"content":{"rendered":"\n<p>Dans cet article, nous apprendrons comment ajouter vos m\u00e9ta-champs personnalis\u00e9s dans la m\u00e9ta-bo\u00eete de donn\u00e9es produit de WooCommerce\u00a0; comment ajouter des champs et comment ajouter votre propre onglet personnalis\u00e9. Nous verrons en d\u00e9tail comment ajouter vos champs, o\u00f9 les ajouter, comment les enregistrer et enfin comment les afficher en frontend.<\/p>\n<h2>Ajout de champs personnalis\u00e9s aux panneaux existants<\/h2>\n<p>Nous verrons d&rsquo;abord comment ajouter un champ \u00e0 des panneaux existants. Nous devons nous accrocher \u00e0 deux crochets\u00a0; un pour afficher le champ et un pour en enregistrer la valeur. Le premier crochet d\u00e9pend de l&rsquo;onglet dans lequel vous souhaitez afficher votre champ.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f68509c.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f68509c.png\" alt=\"Comment ajouter des champs et des onglets personnalis\u00e9s dans la m\u00e9tabox de donn\u00e9es de produit WooCommerce par code\" ><\/a><\/p>\n<p>La m\u00e9tabox des donn\u00e9es produit<\/p>\n<p>Gardez \u00e0 l&rsquo;esprit que la visibilit\u00e9 des onglets diff\u00e8re selon le type de produit. Par exemple, l&rsquo;onglet &quot;G\u00e9n\u00e9ral&quot; est supprim\u00e9 lorsque vous passez \u00e0 un type de produit group\u00e9. Ainsi, non seulement vous devez consid\u00e9rer o\u00f9 vos champs personnalis\u00e9s s&rsquo;int\u00e8grent logiquement, mais vous devez \u00e9galement envisager un panneau visible pour tous les types de produits souhait\u00e9s. est une liste des crochets disponibles les plus g\u00e9n\u00e9raux\u00a0:<\/p>\n<ul>\n<li><code>woocommerce_product_options_general_product_data<\/code>(&quot;G\u00e9n\u00e9ral&quot;)<\/li>\n<li><code>woocommerce_product_options_inventory_product_data<\/code>(&quot;Inventaire&quot;)<\/li>\n<li><code>woocommerce_product_options_shipping<\/code>(&quot;Exp\u00e9dition&quot;)<\/li>\n<li><code>woocommerce_product_options_related<\/code>(&quot;Produits li\u00e9s&quot;)<\/li>\n<li><code>woocommerce_product_options_attributes<\/code>(&quot;Les attributs&quot;)<\/li>\n<li><code>woocommerce_product_options_advanced<\/code>(&quot;Avanc\u00e9&quot;)<\/li>\n<\/ul>\n<h3>Ajout d&rsquo;une entr\u00e9e de formulaire<\/h3>\n<p>En ce qui concerne la sortie d&rsquo;une entr\u00e9e de formulaire, vous pouvez sortir manuellement l&rsquo;entr\u00e9e de formulaire HTML (par exemple <code>&lt;input type=\"text\"...&gt;<\/code>), mais WooCommerce offre des fonctions simples pour ajouter facilement des champs de tous types. Je recommande de les utiliser. <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-woocommerce_wp_text_input.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Consultez l&rsquo; aper\u00e7u<\/a> de WooCommerce de tous les types d&rsquo;entr\u00e9e possibles ici et des arguments que vous pouvez transmettre pour contr\u00f4ler la sortie.<\/p>\n<p>En ce qui concerne ce didacticiel, je vais ajouter une simple saisie de texte dans l&rsquo;onglet Inventaire pour \u00e9crire le nombre d&rsquo;articles dans chaque package. En ce qui concerne la cl\u00e9 sous laquelle votre valeur personnalis\u00e9e est enregistr\u00e9e, ajoutez toujours un trait de soulignement &quot;_&quot; avant, dans mon cas, ce sera &quot;_number_in_package&quot;:<\/p>\n<pre><code>add_action('woocommerce_product_options_inventory_product_data', function() {\n    woocommerce_wp_text_input([\n            'id' =&gt; '_number_in_package',\n            'label' =&gt; __('Number in package', 'txtdomain'),\n    ]);\n});<\/code><\/pre>\n<p>Enregistrer et modifier un produit. Vous devriez voir votre champ personnalis\u00e9 appara\u00eetre en bas de l&rsquo;onglet Inventaire\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f74b757.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f74b757.png\" alt=\"Comment ajouter des champs et des onglets personnalis\u00e9s dans la m\u00e9tabox de donn\u00e9es de produit WooCommerce par code\" ><\/a><\/p>\n<p>Le champ personnalis\u00e9 &quot;Num\u00e9ro dans le colis&quot; ajout\u00e9 en bas<\/p>\n<h3>Une note sur la visibilit\u00e9 du champ selon le type de produit<\/h3>\n<p>La m\u00e9tabox de donn\u00e9es produit de WooCommerce contient une grande quantit\u00e9 de Javascript qui masque et affiche \u00e0 la fois les champs et les onglets\/panneaux. Vous pouvez facilement l&rsquo;utiliser si vous souhaitez que votre champ ne soit visible que pour des types de produits sp\u00e9cifiques, en fournissant des noms de classe sp\u00e9cifiques \u00e0 votre champ.<\/p>\n<p>Supposons que vous souhaitiez que votre champ ne s&rsquo;affiche que si le produit est de type produit simple, ou que vous souhaitiez qu&rsquo;il soit masqu\u00e9 si le produit est un produit variable. WooCommerce \u00e9coute des noms de classe sp\u00e9cifiques tels que <code>show_if_&lt;producttype&gt;<\/code>et <code>hide_if_&lt;producttype&gt;<\/code>et vous pouvez combiner plusieurs classes pour affiner le moment o\u00f9 votre champ doit \u00eatre masqu\u00e9 ou visible.<\/p>\n<p>Par exemple, si je souhaite que mon champ ne soit visible que pour des produits simples ; Je vais ajouter ceci dans &lsquo; <code>wrapper_class<\/code>&lsquo; \u00e0 ma saisie de champ\u00a0:<\/p>\n<pre><code>add_action('woocommerce_product_options_inventory_product_data', function() {\n    woocommerce_wp_text_input([\n        'id' =&gt; '_number_in_package',\n        'label' =&gt; __('Number in package', 'txtdomain'),\n        'wrapper_class' =&gt; 'show_if_simple'\n    ]);\n});<\/code><\/pre>\n<p>Vous pouvez \u00e9galement d\u00e9finir <code>wrapper_class<\/code>par exemple &lsquo; <code>show_if_simple show_if_grouped<\/code>&lsquo; pour que le champ ne soit visible que pour les produits simples ou group\u00e9s. Essayez-le vous-m\u00eame !<\/p>\n<h3>Enregistrement de votre champ personnalis\u00e9<\/h3>\n<p>\u00c0 l&rsquo;heure actuelle, tout ce que vous entrez dans votre champ n&rsquo;est pas enregistr\u00e9. Faisons cela ensuite. Nous nous accrochons <code>woocommerce_process_product_meta<\/code>et enregistrons la valeur du global de PHP <code>$_POST<\/code>(soumission de formulaire).<\/p>\n<pre><code>add_action('woocommerce_process_product_meta', function($post_id) {\n    $product = wc_get_product($post_id);\n    $num_package = isset($_POST['_number_in_package'])? $_POST['_number_in_package']: '';\n    $product-&gt;update_meta_data('_number_in_package', sanitize_text_field($num_package));\n    $product-&gt;save();\n});<\/code><\/pre>\n<p>Permettez-moi d&rsquo;expliquer rapidement le code ci-dessus. Vous pouvez simplement enregistrer le champ en utilisant <code>update_post_meta()<\/code>, mais dans les versions plus r\u00e9centes de WooCommerce, la gestion des m\u00e9ta-produits a \u00e9t\u00e9 consid\u00e9rablement am\u00e9lior\u00e9e. Tant que vous avez l&rsquo;objet produit (que nous obtenons en appelant <code>wc_get_product()<\/code>avec l&rsquo;ID de publication), vous pouvez facilement manipuler toutes les informations sur le produit dans l&rsquo;objet, et enfin appeler <code>save()<\/code>une fois pour mettre \u00e0 jour les modifications. Ceci est tr\u00e8s avantageux, surtout si vous souhaitez enregistrer plusieurs champs &#8211; auquel cas vous n&rsquo;avez pas besoin d&rsquo;ex\u00e9cuter des op\u00e9rations de base de donn\u00e9es pour chaque champ, juste une derni\u00e8re fois lorsque vous appelez <code>save()<\/code>.<\/p>\n<p>Utilisez <code>update_meta_data()<\/code>sur l&rsquo;objet pour chaque m\u00e9ta-donn\u00e9e que vous souhaitez enregistrer.<\/p>\n<p>Avec la fonction ci-dessus, votre champ devrait maintenant \u00eatre enregistr\u00e9 lorsque vous le mettez \u00e0 jour dans le produit d&rsquo;\u00e9dition\u00a0! Notez \u00e9galement qu&rsquo;en utilisant les fonctions de WooCommerce pour g\u00e9n\u00e9rer le champ, vous n&rsquo;avez pas besoin d&rsquo;obtenir manuellement la valeur de votre champ avant de g\u00e9n\u00e9rer le champ &#8211; c&rsquo;est enti\u00e8rement automatique.<\/p>\n<h3>Sortie de votre champ personnalis\u00e9 en frontend<\/h3>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 d\u00e9terminer quel crochet vous souhaitez utiliser pour g\u00e9n\u00e9rer votre champ personnalis\u00e9. WooCommerce propose de nombreux crochets disponibles pour contr\u00f4ler sp\u00e9cifiquement o\u00f9 vous voulez la sortie. Si vous n&rsquo;\u00eates pas s\u00fbr, jetez un \u0153il \u00e0 <code>plugins\/woocommerce\/templates\/<\/code>ces fichiers et vous trouverez facilement un crochet appropri\u00e9. Vous pouvez \u00e9galement remplacer le mod\u00e8le et ajouter la sortie dans le mod\u00e8le, mais je recommande toujours d&rsquo;utiliser des crochets \u00e0 la place.<\/p>\n<p>Quant \u00e0 moi, je souhaite que mon champ personnalis\u00e9 soit g\u00e9n\u00e9r\u00e9 dans un seul produit, \u00e0 l&rsquo;int\u00e9rieur de la m\u00e9ta div &#8211; le long de laquelle WooCommerce g\u00e9n\u00e8re le SKU et la cat\u00e9gorie. Pour cela, je vais utiliser le crochet <code>woocommerce_product_meta_start<\/code>. \u00c0 l&rsquo;int\u00e9rieur des crochets (comme avec presque tous les crochets de mod\u00e8le), vous pouvez acc\u00e9der \u00e0 l&rsquo;objet de publication global. Je suivrai la m\u00eame r\u00e8gle empirique que pour sauver mon champ; utiliser <code>get_meta()<\/code>sur l&rsquo;objet produit pour obtenir mon champ personnalis\u00e9\u00a0:<\/p>\n<pre><code>add_action('woocommerce_product_meta_start', function() {\n    global $post;\n    $product = wc_get_product($post-&gt;ID);\n    $num_package = $product-&gt;get_meta('_number_in_package');\n    if (!empty($num_package)) {\n        printf('&lt;div class=\"custom-sku\"&gt;%s: %s&lt;\/div&gt;', __('Number in package', 'txtdomain'), $num_package);\n    }\n});<\/code><\/pre>\n<h2>Ajout d&rsquo;un onglet et d&rsquo;un panneau personnalis\u00e9s \u00e0 la m\u00e9tabox des donn\u00e9es produit<\/h2>\n<p>Si vous souhaitez ajouter une collection de champs personnalis\u00e9s qui vont logiquement ensemble, il peut \u00eatre judicieux de les regrouper dans un onglet personnalis\u00e9. Pour ajouter un onglet personnalis\u00e9 \u00e0 la m\u00e9tabo\u00eete de donn\u00e9es produit, nous devons nous accrocher \u00e0 un filtre pour ajouter l&rsquo;onglet lui-m\u00eame et \u00e0 un crochet pour afficher le contenu du panneau. Enfin, nous devons encore ajouter le m\u00eame crochet que ci-dessus pour enregistrer nos champs.<\/p>\n<p>Par exemple, je vais ajouter un panneau personnalis\u00e9 appel\u00e9 &quot;Informations suppl\u00e9mentaires&quot; o\u00f9 je veux ajouter une entr\u00e9e de texte, une case \u00e0 cocher et une entr\u00e9e num\u00e9rique.<\/p>\n<p>Tout d&rsquo;abord, nous filtrons <code>woocommerce_product_data_tabs<\/code>et ajoutons notre onglet \u00e0 son tableau.<\/p>\n<pre><code>add_filter('woocommerce_product_data_tabs', function($tabs) {\n    $tabs['additional_info'] = [\n        'label' =&gt; __('Additional info', 'txtdomain'),\n        'target' =&gt; 'additional_product_data',\n        'class' =&gt; ['hide_if_external'],\n        'priority' =&gt; 25\n    ];\n    return $tabs;\n});<\/code><\/pre>\n<p>Il y a quelques arguments utiles que nous pouvons fournir ici. Vous pouvez par exemple utiliser &lsquo; <code>class<\/code>&lsquo; pour contr\u00f4ler la visibilit\u00e9 de l&rsquo;onglet en fonction du type de produit. Si vous l&rsquo;avez manqu\u00e9, consultez la section sur la visibilit\u00e9 des champs <a href=\"#field-visibility\">mentionn\u00e9e ci-dessus<\/a>. Mais gardez \u00e0 l&rsquo;esprit que dans les onglets, vous devez fournir les classes sous forme de tableau et non de cha\u00eene. Vous pouvez \u00e9galement fournir &lsquo; <code>priority<\/code>&lsquo; pour d\u00e9cider o\u00f9 votre onglet doit appara\u00eetre. Utiliser par exemple 25 positionnera l&rsquo;onglet juste apr\u00e8s &quot;Inventaire&quot;.<\/p>\n<p>Par d\u00e9faut, votre onglet appara\u00eetra avec une cl\u00e9 \u00e0 molette comme ic\u00f4ne. Malheureusement, il n&rsquo;y a (pour l&rsquo;instant) aucun moyen de le contr\u00f4ler via le filtre. Si cela est important pour vous, vous pouvez ajouter un CSS d&rsquo;administration et fournir une classe diff\u00e9rente \u00e0 votre onglet. <a href=\"https:\/\/github.com\/woocommerce\/woocommerce-icons\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Voici un aper\u00e7u<\/a> des ic\u00f4nes disponibles dans WooCommerce.<\/p>\n<h3>Sortie panneau<\/h3>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 accrocher <code>woocommerce_product_data_panels<\/code>et \u00e0 afficher le contenu de votre panneau. Une note importante ici est de commencer la sortie avec <code>div<\/code>un <code>id<\/code>attribut du m\u00eame nom que celui que vous avez fourni comme cl\u00e9 dans les onglets (dans mon cas &lsquo; <code>additional_info<\/code>&lsquo;). En ce qui concerne le contenu, c&rsquo;est \u00e0 vous de d\u00e9cider &#8211; vous pouvez ajouter le code HTML de votre choix, mais je vous recommande d&rsquo;utiliser les fonctions de WooCommerce pour la sortie des champs de formulaire. Les m\u00eames avantages pour masquer ou afficher des champs fonctionneront \u00e9galement ici.<\/p>\n<pre><code>add_action('woocommerce_product_data_panels', function() {\n    ?&gt;&lt;div id=\"additional_product_data\" class=\"panel woocommerce_options_panel hidden\"&gt;&lt;?php\n\u00a0\n    woocommerce_wp_text_input([\n        'id' =&gt; '_dummy_text_input',\n        'label' =&gt; __('Dummy text input', 'txtdomain'),\n        'wrapper_class' =&gt; 'show_if_simple',\n    ]);\n    woocommerce_wp_checkbox([\n        'id' =&gt; '_dummy_checkbox',\n        'label' =&gt; __('Dummy checkbox', 'txtdomain'),\n        'wrapper_class' =&gt; 'hide_if_grouped',\n    ]);\n    woocommerce_wp_text_input([\n        'id' =&gt; '_dummy_number_input',\n        'label' =&gt; __('Dummy number input', 'txtdomain'),\n        'type' =&gt; 'number',\n        'custom_attributes' =&gt; [\n            'step' =&gt; '1',\n            'min' =&gt; '0'\n        ]\n    ]);\n    ?&gt;&lt;\/div&gt;&lt;?php\n});<\/code><\/pre>\n<p>Apr\u00e8s l&rsquo;enregistrement, vous devriez maintenant voir l&rsquo;onglet et son contenu dans la m\u00e9tabox des donn\u00e9es du produit (sauf si le produit est un produit externe bien s\u00fbr).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f80e5c5.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152172-61e4d3f80e5c5.png\" alt=\"Comment ajouter des champs et des onglets personnalis\u00e9s dans la m\u00e9tabox de donn\u00e9es de produit WooCommerce par code\" ><\/a><\/p>\n<p>Il ne reste plus qu&rsquo;\u00e0 enregistrer les donn\u00e9es saisies dans vos champs personnalis\u00e9s, et pour cela nous utilisons le m\u00eame proc\u00e9d\u00e9 que ci-dessus :<\/p>\n<pre><code>add_action('woocommerce_process_product_meta', function($post_id) {\n    $product = wc_get_product($post_id);\n    $product-&gt;update_meta_data('_dummy_text_input', sanitize_text_field($_POST['_dummy_text_input']));\n\u00a0\n    $dummy_checkbox = isset($_POST['_dummy_checkbox'])? 'yes': '';\n    $product-&gt;update_meta_data('_dummy_checkbox', $dummy_checkbox);\n\u00a0\n    $product-&gt;update_meta_data('_dummy_number_input', sanitize_text_field($_POST['_dummy_number_input']));\n    $product-&gt;save();\n});<\/code><\/pre>\n<p>Remarque: Dans WooCommerce, il existe une r\u00e8gle g\u00e9n\u00e9rale selon laquelle toutes les cases \u00e0 cocher sont enregistr\u00e9es sous la forme &quot; <code>yes<\/code>&quot; si elles sont coch\u00e9es, ou sous forme de cha\u00eene vide si elles ne sont pas coch\u00e9es. En suivant la r\u00e8gle de WooCommerce et en enregistrant ma case \u00e0 cocher coch\u00e9e en tant que &quot; <code>yes<\/code>&quot;, cela garantit que mon <code>woocommerce_wp_checkbox()<\/code>travail fonctionne comme pr\u00e9vu lorsqu&rsquo;il r\u00e9cup\u00e8re la valeur actuelle de mon champ.<\/p>\n<h2>Conclusion<\/h2>\n<p>Dans cet article, je montrerai comment ajouter vos champs personnalis\u00e9s \u00e0 la m\u00e9tabox de donn\u00e9es produit de WooCommerce, comment les enregistrer, comment contr\u00f4ler leur visibilit\u00e9 et un exemple simple de sortie de votre champ en frontend. J&rsquo;ai \u00e9galement montr\u00e9 comment ajouter un onglet personnalis\u00e9 \u00e0 la m\u00e9tabox et y ajouter vos champs. J&rsquo;esp\u00e8re que cela vous a aid\u00e9 \u00e0 personnaliser vous-m\u00eame WooCommerce\u00a0!<\/p>\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>Dans cet article, nous apprendrons comment ajouter vos m\u00e9ta-champs et onglets personnalis\u00e9s dans la m\u00e9ta-bo\u00eete de donn\u00e9es produit de WordPress WooCommerce avec code.<\/p>\n","protected":false},"author":1,"featured_media":224911,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,717,717,1110,811,811,841,841,852,852,862,862],"tags":[1167],"class_list":{"0":"post-234255","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-code-2","9":"category-developpeur","11":"category-n-a","12":"category-plugins-2","14":"category-tutoriels","16":"category-woocommerce-3","18":"category-wordpress-3","20":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234255","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=234255"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234255\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}