{"id":233827,"date":"2023-02-22T12:47:00","date_gmt":"2023-02-22T09:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233827"},"modified":"2022-11-11T12:39:35","modified_gmt":"2022-11-11T09:39:35","slug":"como-adicionar-campos-e-guias-personalizados-na-metabox-de-dados-do-produto-woocommerce-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-campos-e-guias-personalizados-na-metabox-de-dados-do-produto-woocommerce-por-codigo\/","title":{"rendered":"Como adicionar campos e guias personalizados na metabox de dados do produto WooCommerce por c\u00f3digo"},"content":{"rendered":"\n<p>Neste post, aprenderemos como adicionar seus metacampos personalizados na metabox de dados do produto do WooCommerce; como adicionar campos e tamb\u00e9m como adicionar sua pr\u00f3pria guia personalizada. Entraremos em detalhes sobre como adicionar seus campos, onde adicion\u00e1-los, como salv\u00e1-los e, finalmente, como exibi-los no frontend.<\/p>\n<h2>Adicionando campos personalizados a pain\u00e9is existentes<\/h2>\n<p>Primeiro, veremos como adicionar um campo a pain\u00e9is existentes. Precisamos enganchar em dois ganchos; um para sa\u00edda do campo e outro para salvar o valor dele. O primeiro gancho depende de qual guia voc\u00ea deseja exibir seu campo.<\/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=\"Como adicionar campos e guias personalizados na metabox de dados do produto WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>A metabox de dados do produto<\/p>\n<p>Lembre-se de que a visibilidade da guia difere dependendo do tipo de produto. Por exemplo, a guia &quot;Geral&quot; \u00e9 removida quando voc\u00ea alterna para um tipo de produto agrupado. Portanto, voc\u00ea deve considerar n\u00e3o apenas onde seus campos personalizados se encaixam logicamente, mas tamb\u00e9m considerar um painel vis\u00edvel para todos os tipos de produto desejados. Isso \u00e9 uma lista dos ganchos mais gerais dispon\u00edveis:<\/p>\n<ul>\n<li><code>woocommerce_product_options_general_product_data<\/code>(&quot;Em geral&quot;)<\/li>\n<li><code>woocommerce_product_options_inventory_product_data<\/code>(&quot;Invent\u00e1rio&quot;)<\/li>\n<li><code>woocommerce_product_options_shipping<\/code>(&quot;Envio&quot;)<\/li>\n<li><code>woocommerce_product_options_related<\/code>(&#8220;Produtos Vinculados&quot;)<\/li>\n<li><code>woocommerce_product_options_attributes<\/code>(&quot;Atributos&quot;)<\/li>\n<li><code>woocommerce_product_options_advanced<\/code>(&#8220;Avan\u00e7ado&#8221;)<\/li>\n<\/ul>\n<h3>Adicionando uma entrada de formul\u00e1rio<\/h3>\n<p>Quanto \u00e0 sa\u00edda de uma entrada de formul\u00e1rio, voc\u00ea pode enviar manualmente o HTML de entrada de formul\u00e1rio (por exemplo <code>&lt;input type=\"text\"...&gt;<\/code>, ), mas o WooCommerce oferece fun\u00e7\u00f5es simples para adicionar facilmente campos de qualquer tipo. Eu recomendo usar aqueles. Confira a <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-woocommerce_wp_text_input.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vis\u00e3o geral<\/a> do WooCommerce de todos os tipos de entrada poss\u00edveis aqui e quais argumentos voc\u00ea pode passar para controlar a sa\u00edda.<\/p>\n<p>Quanto a este tutorial, adicionarei uma entrada de texto simples dentro da guia de invent\u00e1rio para escrever o n\u00famero de itens em cada pacote. Quanto \u00e0 chave como seu valor personalizado \u00e9 salvo, sempre adicione um sublinhado &#8220;_&#8221; antes dele, no meu caso ser\u00e1 &#8220;_number_in_package&#8221;:<\/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>Salvar e editar um produto. Voc\u00ea deve ver seu campo personalizado aparecer na parte inferior da guia Invent\u00e1rio:<\/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=\"Como adicionar campos e guias personalizados na metabox de dados do produto WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>O campo personalizado &#8220;N\u00famero no pacote&#8221; adicionado na parte inferior<\/p>\n<h3>Uma nota sobre a visibilidade do campo dependendo do tipo de produto<\/h3>\n<p>A metabox de dados do produto do WooCommerce vem com uma grande quantidade de Javascript que oculta e mostra campos e guias\/pain\u00e9is. Voc\u00ea pode utilizar isso facilmente se quiser que seu campo fique vis\u00edvel apenas para tipos de produtos espec\u00edficos, fornecendo nomes de classe espec\u00edficos para seu campo.<\/p>\n<p>Digamos que voc\u00ea queira que seu campo seja exibido apenas se o produto for do tipo produto simples, ou que ele fique oculto se o produto for um produto vari\u00e1vel. O WooCommerce ouve nomes de classes espec\u00edficos, como <code>show_if_&lt;producttype&gt;<\/code>e, <code>hide_if_&lt;producttype&gt;<\/code>e voc\u00ea pode combinar v\u00e1rias classes para ajustar quando seu campo deve estar oculto ou vis\u00edvel.<\/p>\n<p>Por exemplo, se eu quiser que meu campo fique vis\u00edvel apenas para produtos simples; Vou adicionar isso em &#8216; <code>wrapper_class<\/code>&#8216; \u00e0 minha entrada de campo:<\/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>Voc\u00ea tamb\u00e9m pode definir <code>wrapper_class<\/code>, por exemplo, &#8216; <code>show_if_simple show_if_grouped<\/code>&#8216; para ter o campo vis\u00edvel apenas para produtos simples ou agrupados. Experimente voc\u00ea mesmo!<\/p>\n<h3>Salvando seu campo personalizado<\/h3>\n<p>A partir de agora, qualquer coisa que voc\u00ea inserir em seu campo n\u00e3o ser\u00e1 salva. Vamos fazer isso a seguir. N\u00f3s conectamos <code>woocommerce_process_product_meta<\/code>e salvamos o valor do PHP global <code>$_POST<\/code>(submiss\u00e3o de formul\u00e1rio).<\/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>Deixe-me explicar rapidamente o c\u00f3digo acima. Voc\u00ea pode simplesmente salvar o campo usando <code>update_post_meta()<\/code>, mas nas vers\u00f5es mais recentes do WooCommerce, o manuseio do meta do produto foi bastante aprimorado. Contanto que voc\u00ea tenha o objeto do produto (que obtemos chamando <code>wc_get_product()<\/code>com o ID do post), voc\u00ea pode manipular facilmente qualquer informa\u00e7\u00e3o do produto no objeto e, finalmente, chamar <code>save()<\/code>uma vez para atualizar quaisquer altera\u00e7\u00f5es. Isso \u00e9 muito ben\u00e9fico, especialmente se voc\u00ea deseja salvar v\u00e1rios campos &#8211; nesse caso, voc\u00ea n\u00e3o precisa executar opera\u00e7\u00f5es de banco de dados para cada campo, apenas uma \u00faltima vez ao chamar <code>save()<\/code>.<\/p>\n<p>Use <code>update_meta_data()<\/code>no objeto para cada metadados que voc\u00ea deseja salvar.<\/p>\n<p>Com a fun\u00e7\u00e3o acima, seu campo agora deve ser salvo quando voc\u00ea o atualizar no produto de edi\u00e7\u00e3o! Observe tamb\u00e9m que, usando as fun\u00e7\u00f5es do WooCommerce para gerar o campo, voc\u00ea n\u00e3o precisa obter manualmente o valor do seu campo antes de enviar o campo &#8211; \u00e9 totalmente autom\u00e1tico.<\/p>\n<h3>Emitindo seu campo personalizado no frontend<\/h3>\n<p>O primeiro passo \u00e9 descobrir qual gancho voc\u00ea deseja usar para gerar seu campo personalizado. O WooCommerce oferece muitos ganchos dispon\u00edveis para controlar especificamente onde voc\u00ea deseja a sa\u00edda. Se voc\u00ea n\u00e3o tiver certeza, d\u00ea uma olhada <code>plugins\/woocommerce\/templates\/<\/code>e dentro desses arquivos voc\u00ea pode facilmente encontrar um gancho apropriado. Voc\u00ea tamb\u00e9m pode substituir o modelo e adicionar a sa\u00edda no modelo, mas sempre recomendo usar ganchos.<\/p>\n<p>Quanto a mim, quero que meu campo personalizado seja gerado em um \u00fanico produto, dentro do meta div \u2013 junto com o qual o WooCommerce gera SKU e categoria. Para isso vou usar o gancho <code>woocommerce_product_meta_start<\/code>. Dentro dos ganchos (como em quase todos os ganchos de modelo) voc\u00ea pode acessar o objeto global post. Eu seguirei a mesma regra de ouro para salvar meu campo; use <code>get_meta()<\/code>no objeto do produto para obter meu campo personalizado:<\/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>Adicionando uma guia e um painel personalizados \u00e0 metabox de dados do produto<\/h2>\n<p>Se voc\u00ea deseja adicionar uma cole\u00e7\u00e3o de campos personalizados que pertencem logicamente juntos, pode ser uma boa ideia agrup\u00e1-los dentro de uma guia personalizada. Para adicionar uma guia personalizada \u00e0 metabox de dados do produto, precisamos conectar um filtro para adicionar a pr\u00f3pria guia e um gancho para enviar o conte\u00fado do painel. Finalmente, ainda precisamos adicionar o mesmo gancho acima para salvar nossos campos.<\/p>\n<p>Por exemplo, vou adicionar um painel personalizado chamado &#8220;Informa\u00e7\u00f5es adicionais&#8221; onde quero adicionar uma entrada de texto, uma caixa de sele\u00e7\u00e3o e uma entrada de n\u00famero.<\/p>\n<p>Primeiro, filtramos <code>woocommerce_product_data_tabs<\/code>e adicionamos nossa guia \u00e0 sua matriz.<\/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>H\u00e1 alguns argumentos \u00fateis que podemos fornecer aqui. Voc\u00ea pode, por exemplo, usar &#8216; <code>class<\/code>&#8216; para controlar a visibilidade da guia dependendo do tipo de produto. Se voc\u00ea perdeu, confira a se\u00e7\u00e3o sobre visibilidade de campo <a href=\"#field-visibility\">mencionada acima<\/a>. Mas lembre-se de que nas guias voc\u00ea precisa fornecer as classes como um array, n\u00e3o como uma string. Voc\u00ea tamb\u00e9m pode fornecer &#8216; <code>priority<\/code>&#8216; para decidir onde sua guia deve aparecer. Usando, por exemplo, 25 ir\u00e1 posicionar a guia logo ap\u00f3s &#8220;Invent\u00e1rio&#8221;.<\/p>\n<p>Como padr\u00e3o, sua guia aparecer\u00e1 com uma chave inglesa como \u00edcone. Infelizmente n\u00e3o h\u00e1 (a partir de agora) nenhuma maneira de control\u00e1-lo atrav\u00e9s do filtro. Se isso for importante para voc\u00ea, voc\u00ea pode adicionar CSS de administrador e fornecer uma classe diferente \u00e0 sua guia. <a href=\"https:\/\/github.com\/woocommerce\/woocommerce-icons\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Aqui est\u00e1 uma vis\u00e3o geral<\/a> dos \u00edcones dispon\u00edveis no WooCommerce.<\/p>\n<h3>Sa\u00edda do painel<\/h3>\n<p>O pr\u00f3ximo passo \u00e9 conectar <code>woocommerce_product_data_panels<\/code>e produzir o conte\u00fado do seu painel. Uma observa\u00e7\u00e3o importante aqui \u00e9 iniciar a sa\u00edda com <code>div<\/code>um <code>id<\/code>atributo com o mesmo nome que voc\u00ea forneceu como chave nas guias (no meu caso &#8216; <code>additional_info<\/code>&#8216;). Quanto ao conte\u00fado, depende de voc\u00ea \u2013 voc\u00ea pode adicionar o HTML que quiser, mas recomendo usar as fun\u00e7\u00f5es do WooCommerce para gerar campos de formul\u00e1rio. Os mesmos benef\u00edcios para ocultar ou mostrar campos tamb\u00e9m funcionar\u00e3o aqui.<\/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>Depois de salvar, voc\u00ea deve ver a guia e seu conte\u00fado na metabox de dados do produto (a menos que o produto seja um produto externo, \u00e9 claro).<\/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=\"Como adicionar campos e guias personalizados na metabox de dados do produto WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>Tudo o que resta \u00e9 salvar os dados inseridos em seus campos personalizados, e para isso usamos o mesmo processo acima:<\/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>Nota: No WooCommerce existe uma regra geral em que todas as caixas de sele\u00e7\u00e3o s\u00e3o salvas como &#8216; <code>yes<\/code>&#8216; se estiverem marcadas, ou como string vazia se n\u00e3o estiverem marcadas. Ao seguir a regra do WooCommerce e salvar minha caixa de sele\u00e7\u00e3o marcada como &#8216; <code>yes<\/code>&#8216;, isso garante que meu <code>woocommerce_wp_checkbox()<\/code>trabalho funcione conforme o esperado quando busca o valor atual do meu campo.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Neste post, mostrarei como adicionar seus campos personalizados \u00e0 metabox de dados de produtos do WooCommerce, como salv\u00e1-los, como controlar sua visibilidade e um exemplo simples de sa\u00edda de seu campo no frontend. Tamb\u00e9m mostrei como adicionar uma guia personalizada \u00e0 metabox e adicionar seus campos l\u00e1. Espero que isso tenha ajudado voc\u00ea a personalizar o WooCommerce!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste post, aprenderemos como adicionar seus metacampos e guias personalizados na metabox de dados do produto do WordPress WooCommerce com c\u00f3digo.<\/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":[898,898,722,722,1110,816,816,846,846,857,857,867,867],"tags":[1170],"class_list":["post-233827","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-n-a","category-plug-ins","category-tutoriais","category-woocommerce-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233827","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233827"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233827\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}