{"id":233765,"date":"2023-02-22T12:31:00","date_gmt":"2023-02-22T09:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233765"},"modified":"2022-11-11T12:16:17","modified_gmt":"2022-11-11T09:16:17","slug":"como-agregar-campos-y-pestanas-personalizados-en-el-metabox-de-datos-de-productos-de-woocommerce-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-campos-y-pestanas-personalizados-en-el-metabox-de-datos-de-productos-de-woocommerce-por-codigo\/","title":{"rendered":"C\u00f3mo agregar campos y pesta\u00f1as personalizados en el Metabox de datos de productos de WooCommerce por c\u00f3digo"},"content":{"rendered":"\n<p>En esta publicaci\u00f3n, aprenderemos c\u00f3mo agregar sus metacampos personalizados en el metabox de datos del producto de WooCommerce; c\u00f3mo agregar campos y tambi\u00e9n c\u00f3mo agregar su propia pesta\u00f1a personalizada. Entraremos en detalles sobre c\u00f3mo agregar sus campos, d\u00f3nde agregarlos, c\u00f3mo guardarlos y, finalmente, c\u00f3mo mostrarlos en la interfaz.<\/p>\n<h2>Adici\u00f3n de campos personalizados a paneles existentes<\/h2>\n<p>Primero, veremos c\u00f3mo agregar un campo a los paneles existentes. Necesitamos enganchar en dos ganchos; uno para generar el campo y otro para guardar el valor del mismo. El primer enlace depende de la pesta\u00f1a en la que desea mostrar su 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=\"C\u00f3mo agregar campos y pesta\u00f1as personalizados en el Metabox de datos de productos de WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>El metabox de datos del producto<\/p>\n<p>Tenga en cuenta que la visibilidad de la pesta\u00f1a difiere seg\u00fan el tipo de producto. Por ejemplo, la pesta\u00f1a &quot;General&quot; se elimina cuando cambia a un tipo de producto agrupado. Por lo tanto, no solo debe considerar d\u00f3nde encajan l\u00f3gicamente sus campos personalizados, sino que debe considerar un panel que sea visible para todos los tipos de productos deseados. Esto es una lista de los ganchos disponibles m\u00e1s generales:<\/p>\n<ul>\n<li><code>woocommerce_product_options_general_product_data<\/code>(&quot;General&quot;)<\/li>\n<li><code>woocommerce_product_options_inventory_product_data<\/code>(&quot;Inventario&quot;)<\/li>\n<li><code>woocommerce_product_options_shipping<\/code>(&quot;Transporte&quot;)<\/li>\n<li><code>woocommerce_product_options_related<\/code>(&quot;Productos vinculados&quot;)<\/li>\n<li><code>woocommerce_product_options_attributes<\/code>(&quot;Atributos&quot;)<\/li>\n<li><code>woocommerce_product_options_advanced<\/code>(&quot;Avanzado&quot;)<\/li>\n<\/ul>\n<h3>Agregar una entrada de formulario<\/h3>\n<p>En cuanto a la salida de una entrada de formulario, puede generar manualmente la entrada de formulario HTML (por ejemplo <code>&lt;input type=\"text\"...&gt;<\/code>), pero WooCommerce ofrece funciones simples para agregar f\u00e1cilmente campos de cualquier tipo. Recomiendo usar esos. <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-woocommerce_wp_text_input.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Consulte la descripci\u00f3n general<\/a> de WooCommerce de todos los tipos de entrada posibles aqu\u00ed y qu\u00e9 argumentos puede pasar para controlar la salida.<\/p>\n<p>En cuanto a este tutorial, agregar\u00e9 una entrada de texto simple dentro de la pesta\u00f1a de inventario para escribir la cantidad de art\u00edculos en cada paquete. En cuanto a la clave en la que se guarda su valor personalizado, siempre agregue un gui\u00f3n bajo &quot;_&quot; antes, en mi caso ser\u00e1 &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>Guardar y editar un producto. Deber\u00eda ver aparecer su campo personalizado en la parte inferior de la pesta\u00f1a Inventario:<\/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=\"C\u00f3mo agregar campos y pesta\u00f1as personalizados en el Metabox de datos de productos de WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>El campo personalizado &quot;N\u00famero en el paquete&quot; agregado en la parte inferior<\/p>\n<h3>Una nota sobre la visibilidad del campo seg\u00fan el tipo de producto<\/h3>\n<p>El metabox de datos de productos de WooCommerce viene con una gran cantidad de Javascript que oculta y muestra campos y pesta\u00f1as\/paneles. Puede utilizar esto f\u00e1cilmente si desea que su campo sea visible solo para tipos de productos espec\u00edficos, proporcionando nombres de clase espec\u00edficos a su campo.<\/p>\n<p>Digamos que desea que su campo solo se muestre si el producto es de tipo producto simple, o desea que se oculte si el producto es un producto variable. WooCommerce escucha nombres de clases espec\u00edficos, como <code>show_if_&lt;producttype&gt;<\/code>y <code>hide_if_&lt;producttype&gt;<\/code>, y puede combinar varias clases para ajustar cu\u00e1ndo su campo debe estar oculto o visible.<\/p>\n<p>Por ejemplo, si quiero que mi campo solo sea visible para productos simples; Agregar\u00e9 esto en &#8216; <code>wrapper_class<\/code>&#8216; a mi 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>Tambi\u00e9n puede establecer, <code>wrapper_class<\/code>por ejemplo, &#8216; <code>show_if_simple show_if_grouped<\/code>&#8216; para que el campo solo sea visible para productos que son simples o agrupados. \u00a1Pru\u00e9belo usted mismo!<\/p>\n<h3>Guardando tu campo personalizado<\/h3>\n<p>A partir de ahora, todo lo que ingrese en su campo no se guardar\u00e1. Hagamos eso a continuaci\u00f3n. Nos enganchamos <code>woocommerce_process_product_meta<\/code>y guardamos el valor de PHP global <code>$_POST<\/code>(env\u00edo de formulario).<\/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>Perm\u00edtanme explicar r\u00e1pidamente el c\u00f3digo anterior. Simplemente puede guardar el campo usando <code>update_post_meta()<\/code>, pero en las versiones m\u00e1s recientes de WooCommerce, el manejo de la meta del producto se ha mejorado mucho. Siempre que tenga el objeto del producto (que obtenemos al llamar <code>wc_get_product()<\/code>con la ID de la publicaci\u00f3n), puede manipular f\u00e1cilmente cualquier informaci\u00f3n del producto en el objeto y, finalmente, llamar <code>save()<\/code>una vez para actualizar cualquier cambio. Esto es muy beneficioso, especialmente si desea guardar varios campos, en cuyo caso no necesita ejecutar operaciones de base de datos para cada campo, solo esa \u00faltima vez cuando llama a <code>save()<\/code>.<\/p>\n<p>\u00daselo <code>update_meta_data()<\/code>en el objeto para cada metadato que desee guardar.<\/p>\n<p>\u00a1Con la funci\u00f3n anterior, su campo ahora deber\u00eda guardarse cuando lo actualice en editar producto! Tambi\u00e9n tenga en cuenta que al usar las funciones de WooCommerce para generar el campo, no tiene que obtener manualmente el valor de su campo antes de generar el campo; es completamente autom\u00e1tico.<\/p>\n<h3>Salida de su campo personalizado en la interfaz<\/h3>\n<p>El primer paso es averiguar qu\u00e9 enlace desea usar para generar su campo personalizado. WooCommerce ofrece muchos ganchos disponibles para controlar espec\u00edficamente d\u00f3nde desea la salida. Si no est\u00e1 seguro, eche un vistazo <code>plugins\/woocommerce\/templates\/<\/code>y dentro de estos archivos puede encontrar f\u00e1cilmente un gancho apropiado. Tambi\u00e9n puede anular la plantilla y agregar la salida en la plantilla, pero siempre recomiendo usar ganchos en su lugar.<\/p>\n<p>En cuanto a m\u00ed, quiero que mi campo personalizado se genere en un solo producto, dentro del metadiv, junto con WooCommerce que genera el SKU y la categor\u00eda. Para esto usar\u00e9 el gancho <code>woocommerce_product_meta_start<\/code>. Dentro de los ganchos (como con casi todos los ganchos de plantilla) puede acceder al objeto de publicaci\u00f3n global. Seguir\u00e9 la misma regla general que al guardar mi campo; usar <code>get_meta()<\/code>en el objeto del producto para obtener mi 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>Agregar una pesta\u00f1a y un panel personalizados al metabox de datos del producto<\/h2>\n<p>Si desea agregar una colecci\u00f3n de campos personalizados que l\u00f3gicamente pertenecen juntos, podr\u00eda ser una buena idea agruparlos dentro de una pesta\u00f1a personalizada. Para agregar una pesta\u00f1a personalizada al metabox de datos del producto, debemos conectarnos a un filtro para agregar la pesta\u00f1a en s\u00ed y un enlace para mostrar el contenido del panel. Finalmente, todav\u00eda necesitamos agregar el mismo gancho que arriba para guardar nuestros campos.<\/p>\n<p>Por ejemplo, voy a agregar un panel personalizado llamado &quot;Informaci\u00f3n adicional&quot; donde quiero agregar una entrada de texto, una casilla de verificaci\u00f3n y una entrada de n\u00famero.<\/p>\n<p>Primero, filtramos <code>woocommerce_product_data_tabs<\/code>y agregamos nuestra pesta\u00f1a a su 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>Hay algunos argumentos \u00fatiles que podemos proporcionar aqu\u00ed. Por ejemplo, puede usar &#8216; <code>class<\/code>&#8216; para controlar la visibilidad de la pesta\u00f1a seg\u00fan el tipo de producto. Si te lo perdiste, consulta la secci\u00f3n sobre visibilidad de campo <a href=\"#field-visibility\">mencionada anteriormente<\/a>. Pero tenga en cuenta que en las pesta\u00f1as debe proporcionar las clases como una matriz, no como una cadena. Tambi\u00e9n puede proporcionar &#8216; <code>priority<\/code>&#8216; para decidir d\u00f3nde debe aparecer su pesta\u00f1a. El uso de, por ejemplo, 25 colocar\u00e1 la pesta\u00f1a justo despu\u00e9s de &quot;Inventario&quot;.<\/p>\n<p>Por defecto, su pesta\u00f1a aparecer\u00e1 con una llave inglesa como icono. Desafortunadamente, no hay (a partir de ahora) forma de controlarlo a trav\u00e9s del filtro. Si esto es importante para usted, puede agregar CSS de administrador y proporcionar una clase diferente a su pesta\u00f1a. <a href=\"https:\/\/github.com\/woocommerce\/woocommerce-icons\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Aqu\u00ed hay una descripci\u00f3n general<\/a> de los \u00edconos disponibles en WooCommerce.<\/p>\n<h3>Salida de panel<\/h3>\n<p>El siguiente paso es conectar <code>woocommerce_product_data_panels<\/code>y generar el contenido de su panel. Una nota importante aqu\u00ed es comenzar la salida con <code>div<\/code>un <code>id<\/code>atributo del mismo nombre que proporcion\u00f3 como clave en las pesta\u00f1as (en mi caso &#8216; <code>additional_info<\/code>&#8216;). En cuanto al contenido, depende de usted: puede agregar cualquier HTML que desee, pero le recomiendo usar las funciones de WooCommerce para generar campos de formulario. Los mismos beneficios para ocultar o mostrar campos tambi\u00e9n funcionar\u00e1n aqu\u00ed.<\/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>Despu\u00e9s de guardar, ahora deber\u00eda ver la pesta\u00f1a y su contenido en el metabox de datos del producto (a menos que el producto sea un producto externo, por supuesto).<\/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=\"C\u00f3mo agregar campos y pesta\u00f1as personalizados en el Metabox de datos de productos de WooCommerce por c\u00f3digo\" ><\/a><\/p>\n<p>Todo lo que queda es guardar los datos ingresados \u200b\u200ben sus campos personalizados, y para esto usamos el mismo proceso que el anterior:<\/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: en WooCommerce hay una regla general en la que todas las casillas de verificaci\u00f3n se guardan como &quot; <code>yes<\/code>&quot; si est\u00e1n marcadas, o como cadenas vac\u00edas si no est\u00e1n marcadas. Al seguir la regla de WooCommerce y guardar mi casilla de verificaci\u00f3n marcada como &#8216; <code>yes<\/code>&#8216;, esto asegura que <code>woocommerce_wp_checkbox()<\/code>funcione seg\u00fan lo previsto cuando obtenga el valor actual de mi campo.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>En esta publicaci\u00f3n, mostrar\u00e9 c\u00f3mo agregar sus campos personalizados al metabox de datos de productos de WooCommerce, c\u00f3mo guardarlos, c\u00f3mo controlar su visibilidad y un ejemplo simple de salida de su campo en la interfaz. Tambi\u00e9n mostr\u00e9 c\u00f3mo agregar una pesta\u00f1a personalizada al metabox y agregar sus campos all\u00ed. \u00a1Espero que esto te haya ayudado a personalizar WooCommerce t\u00fa mismo!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta publicaci\u00f3n, aprenderemos c\u00f3mo agregar sus metacampos y pesta\u00f1as personalizados en el metabox de datos del producto de WordPress WooCommerce con 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":[892,892,810,716,716,1110,810,840,840,851,851,861,861],"tags":[1172],"class_list":["post-233765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-n-a","category-tutoriales","category-woocommerce-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233765"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233765\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}