{"id":233763,"date":"2023-02-22T12:38:00","date_gmt":"2023-02-22T09:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233763"},"modified":"2022-11-11T12:15:58","modified_gmt":"2022-11-11T09:15:58","slug":"hur-man-laegger-till-anpassade-faelt-och-flikar-i-woocommerce-product-data-metabox-efter-kod","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-anpassade-faelt-och-flikar-i-woocommerce-product-data-metabox-efter-kod\/","title":{"rendered":"Hur man l\u00e4gger till anpassade f\u00e4lt och flikar i WooCommerce Product Data Metabox efter kod"},"content":{"rendered":"\n<p>I det h\u00e4r inl\u00e4gget kommer vi att l\u00e4ra oss hur du l\u00e4gger till dina anpassade metaf\u00e4lt i WooCommerces produktdatametabox; hur man l\u00e4gger till f\u00e4lt och \u00e4ven hur man l\u00e4gger till en egen anpassad flik. Vi kommer att g\u00e5 in i detalj om hur du l\u00e4gger till dina f\u00e4lt, var du l\u00e4gger till dem, hur du sparar dem och slutligen hur du visar dem i frontend.<\/p>\n<h2>L\u00e4gga till anpassade f\u00e4lt till befintliga paneler<\/h2>\n<p>F\u00f6rst ska vi titta p\u00e5 hur man l\u00e4gger till ett f\u00e4lt till befintliga paneler. Vi m\u00e5ste haka i tv\u00e5 krokar; en f\u00f6r att mata ut f\u00e4ltet och en f\u00f6r att spara v\u00e4rdet p\u00e5 det. Den f\u00f6rsta kroken beror p\u00e5 vilken flik du vill visa ditt f\u00e4lt i.<\/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=\"Hur man l\u00e4gger till anpassade f\u00e4lt och flikar i WooCommerce Product Data Metabox efter kod\" ><\/a><\/p>\n<p>Metaboxen Produktdata<\/p>\n<p>T\u00e4nk p\u00e5 att flikarnas synlighet varierar beroende p\u00e5 produkttyp. Fliken &quot;Allm\u00e4nt&quot; tas till exempel bort n\u00e4r du byter till en grupperad produkttyp. S\u00e5 du b\u00f6r inte bara t\u00e4nka p\u00e5 var dina anpassade f\u00e4lt logiskt passar in, utan du m\u00e5ste \u00f6verv\u00e4ga en panel som \u00e4r synlig f\u00f6r alla dina \u00f6nskade produkttyper. \u00e4r en lista \u00f6ver de mest allm\u00e4nna tillg\u00e4ngliga krokarna:<\/p>\n<ul>\n<li><code>woocommerce_product_options_general_product_data<\/code>(&quot;Allm\u00e4n&quot;)<\/li>\n<li><code>woocommerce_product_options_inventory_product_data<\/code>(&quot;Lager&quot;)<\/li>\n<li><code>woocommerce_product_options_shipping<\/code>(&quot;Frakt&quot;)<\/li>\n<li><code>woocommerce_product_options_related<\/code>(&quot;L\u00e4nkade produkter&quot;)<\/li>\n<li><code>woocommerce_product_options_attributes<\/code>(&quot;Attribut&quot;)<\/li>\n<li><code>woocommerce_product_options_advanced<\/code>(&quot;Avancerad&quot;)<\/li>\n<\/ul>\n<h3>L\u00e4gga till en formul\u00e4rinmatning<\/h3>\n<p>N\u00e4r det g\u00e4ller att mata ut en formul\u00e4rinmatning kan du manuellt mata ut formul\u00e4rinmatningen HTML (t.ex. <code>&lt;input type=\"text\"...&gt;<\/code>), men WooCommerce erbjuder enkla funktioner f\u00f6r att enkelt l\u00e4gga till f\u00e4lt av alla typer. Jag rekommenderar att du anv\u00e4nder dem. Kolla in WooCommerces <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-woocommerce_wp_text_input.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00f6versikt<\/a> \u00f6ver alla m\u00f6jliga indatatyper h\u00e4r, och vilka argument du kan skicka f\u00f6r att styra utdata.<\/p>\n<p>N\u00e4r det g\u00e4ller denna handledning kommer jag att l\u00e4gga till en enkel textinmatning p\u00e5 inventeringsfliken f\u00f6r att skriva antalet artiklar i varje paket. N\u00e4r det g\u00e4ller nyckeln som ditt anpassade v\u00e4rde sparas som, l\u00e4gg alltid till ett understreck &quot;_&quot; f\u00f6re det, i mitt fall blir det &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>Spara och redigera en produkt. Du b\u00f6r se ditt anpassade f\u00e4lt visas l\u00e4ngst ned p\u00e5 fliken Inventering:<\/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=\"Hur man l\u00e4gger till anpassade f\u00e4lt och flikar i WooCommerce Product Data Metabox efter kod\" ><\/a><\/p>\n<p>Det anpassade f\u00e4ltet &quot;Nummer i paket&quot; l\u00e4ggs till l\u00e4ngst ner<\/p>\n<h3>En notering om f\u00e4ltsynlighet beroende p\u00e5 produkttyp<\/h3>\n<p>WooCommerces produktdatametabox kommer med en hel del Javascript som d\u00f6ljer och visar b\u00e5de f\u00e4lt och flikar\/paneler. Du kan enkelt anv\u00e4nda detta om du vill att ditt f\u00e4lt ska vara synligt endast f\u00f6r specifika produkttyper, genom att ange specifika klassnamn till ditt f\u00e4lt.<\/p>\n<p>L\u00e5t oss s\u00e4ga att du vill att ditt f\u00e4lt endast ska visas om produkten \u00e4r av typen enkel produkt, eller du vill att den ska d\u00f6ljas om produkten \u00e4r en variabel produkt. WooCommerce lyssnar p\u00e5 specifika klassnamn som <code>show_if_&lt;producttype&gt;<\/code>och <code>hide_if_&lt;producttype&gt;<\/code>och du kan kombinera flera klasser f\u00f6r att finjustera n\u00e4r ditt f\u00e4lt ska vara dolt eller synligt.<\/p>\n<p>Till exempel, om jag vill att mitt omr\u00e5de endast ska vara synligt f\u00f6r enkla produkter; Jag l\u00e4gger till detta i &#8217; <code>wrapper_class<\/code>&#8217; till min f\u00e4ltinmatning:<\/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>Du kan ocks\u00e5 st\u00e4lla <code>wrapper_class<\/code>in p\u00e5 t.ex. &#8217; <code>show_if_simple show_if_grouped<\/code>&#8217; f\u00f6r att f\u00e4ltet endast ska vara synligt f\u00f6r produkter som antingen \u00e4r enkla eller grupperade. Prova sj\u00e4lv!<\/p>\n<h3>Sparar ditt anpassade f\u00e4lt<\/h3>\n<p>Fr\u00e5n och med just nu sparas inte allt du anger i ditt f\u00e4lt. L\u00e5t oss g\u00f6ra det h\u00e4rn\u00e4st. Vi hakar p\u00e5 <code>woocommerce_process_product_meta<\/code>och sparar v\u00e4rdet fr\u00e5n PHPs globala <code>$_POST<\/code>(formul\u00e4rinl\u00e4mning).<\/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>L\u00e5t mig snabbt f\u00f6rklara ovanst\u00e5ende kod. Du kan helt enkelt spara f\u00e4ltet genom att anv\u00e4nda <code>update_post_meta()<\/code>, men i nyare versioner av WooCommerce har hanteringen av produktmeta f\u00f6rb\u00e4ttrats avsev\u00e4rt. S\u00e5 l\u00e4nge du har produktobjektet (som vi f\u00e5r genom att ringa <code>wc_get_product()<\/code>med post-ID) kan du enkelt manipulera eventuell produktinformation i objektet, och slutligen ringa <code>save()<\/code>en g\u00e5ng f\u00f6r att uppdatera eventuella \u00e4ndringar. Detta \u00e4r mycket f\u00f6rdelaktigt, s\u00e4rskilt om du vill spara flera f\u00e4lt \u2013 i s\u00e5 fall beh\u00f6ver du inte k\u00f6ra databasoperationer f\u00f6r varje f\u00e4lt, bara den sista g\u00e5ngen du anropar <code>save()<\/code>.<\/p>\n<p>Anv\u00e4nd <code>update_meta_data()<\/code>p\u00e5 objektet f\u00f6r varje metadata du vill spara.<\/p>\n<p>Med ovanst\u00e5ende funktion b\u00f6r ditt f\u00e4lt nu sparas n\u00e4r du uppdaterar det i redigera produkt! Observera ocks\u00e5 att genom att anv\u00e4nda WooCommerces funktioner f\u00f6r att mata ut f\u00e4ltet, beh\u00f6ver du inte manuellt f\u00e5 v\u00e4rdet p\u00e5 ditt f\u00e4lt innan du matar ut f\u00e4ltet \u2013 det \u00e4r helt automatiskt.<\/p>\n<h3>Mata ut ditt anpassade f\u00e4lt i frontend<\/h3>\n<p>F\u00f6rsta steget \u00e4r att ta reda p\u00e5 vilken krok du vill anv\u00e4nda f\u00f6r att mata ut ditt anpassade f\u00e4lt. WooCommerce erbjuder massor av tillg\u00e4ngliga krokar f\u00f6r att styra specifikt var du vill ha utdata. Om du \u00e4r os\u00e4ker, ta en titt p\u00e5 <code>plugins\/woocommerce\/templates\/<\/code>och inuti dessa filer kan du enkelt hitta en l\u00e4mplig krok. Du kan ocks\u00e5 \u00e5sidos\u00e4tta mallen och l\u00e4gga till utdata i mallen, men jag rekommenderar alltid att anv\u00e4nda krokar ist\u00e4llet.<\/p>\n<p>N\u00e4r det g\u00e4ller mig vill jag att mitt anpassade f\u00e4lt ska matas ut i en enda produkt, inuti meta div \u2013 l\u00e4ngs d\u00e4r WooCommerce matar ut SKU och kategori. F\u00f6r detta ska jag anv\u00e4nda kroken <code>woocommerce_product_meta_start<\/code>. Inuti krokarna (som med n\u00e4stan alla mallkrokar) kan du komma \u00e5t det globala postobjektet. Jag f\u00f6ljer samma tumregel som n\u00e4r jag sparar mitt f\u00e4lt; anv\u00e4nd <code>get_meta()<\/code>p\u00e5 produktobjektet f\u00f6r att f\u00e5 mitt anpassade f\u00e4lt:<\/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>L\u00e4gga till en anpassad flik och panel till produktdatametabox<\/h2>\n<p>Om du vill l\u00e4gga till en samling anpassade f\u00e4lt som logiskt h\u00f6r ihop, kan det vara en bra id\u00e9 att gruppera dem p\u00e5 en anpassad flik. F\u00f6r att l\u00e4gga till en anpassad flik till produktdatametaboxen m\u00e5ste vi ansluta till ett filter f\u00f6r att l\u00e4gga till sj\u00e4lva fliken och en krok f\u00f6r att mata ut panelens inneh\u00e5ll. Slutligen beh\u00f6ver vi fortfarande l\u00e4gga till samma krok som ovan f\u00f6r att spara v\u00e5ra f\u00e4lt.<\/p>\n<p>F\u00f6r till exempel kommer jag att l\u00e4gga till en anpassad panel som heter &quot;Ytterligare info&quot; d\u00e4r jag vill l\u00e4gga till en textinmatning, en kryssruta och en nummerinmatning.<\/p>\n<p>F\u00f6rst filtrerar vi <code>woocommerce_product_data_tabs<\/code>och l\u00e4gger till v\u00e5r flik till dess array.<\/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>Det finns n\u00e5gra anv\u00e4ndbara argument vi kan ge h\u00e4r. Du kan till exempel anv\u00e4nda &#8217; <code>class<\/code>&#8217; f\u00f6r att kontrollera flikens synlighet beroende p\u00e5 produkttyp. Om du missade det, kolla in avsnittet om f\u00e4ltsynlighet <a href=\"#field-visibility\">som n\u00e4mns ovan<\/a>. Men kom ih\u00e5g att i flikar m\u00e5ste du tillhandah\u00e5lla klasserna som en array, inte en str\u00e4ng. Du kan ocks\u00e5 ange &#8217; <code>priority<\/code>&#8217; f\u00f6r att best\u00e4mma var din flik ska visas. Anv\u00e4nd t.ex. 25 f\u00f6r att placera fliken direkt efter &quot;Inventering&quot;.<\/p>\n<p>Som standard visas din flik med en skiftnyckel som ikon. Tyv\u00e4rr finns det (f\u00f6r n\u00e4rvarande) inget s\u00e4tt att styra det via filtret. Om detta \u00e4r viktigt f\u00f6r dig kan du l\u00e4gga till admin CSS och tillhandah\u00e5lla en annan klass p\u00e5 din flik. <a href=\"https:\/\/github.com\/woocommerce\/woocommerce-icons\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">H\u00e4r \u00e4r en \u00f6versikt<\/a> \u00f6ver tillg\u00e4ngliga ikoner i WooCommerce.<\/p>\n<h3>Panelutg\u00e5ng<\/h3>\n<p>N\u00e4sta steg \u00e4r att koppla in <code>woocommerce_product_data_panels<\/code>och mata ut inneh\u00e5llet p\u00e5 din panel. En viktig anm\u00e4rkning h\u00e4r \u00e4r att starta utg\u00e5ngen med en <code>div<\/code>med ett <code>id<\/code>attribut med samma namn som du angav som nyckel i tabbar (i mitt fall &#8217; <code>additional_info<\/code>&#8217;). N\u00e4r det g\u00e4ller inneh\u00e5llet \u00e4r det upp till dig \u2013 du kan l\u00e4gga till vilken HTML du vill, men jag rekommenderar att du anv\u00e4nder WooCommerces funktioner f\u00f6r att mata ut formul\u00e4rf\u00e4lt. Samma f\u00f6rdelar f\u00f6r att g\u00f6mma eller visa f\u00e4lt kommer att fungera h\u00e4r ocks\u00e5.<\/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>Efter att du har sparat ska du nu se fliken och dess inneh\u00e5ll i Product data metabox (om inte produkten \u00e4r en extern produkt f\u00f6rst\u00e5s).<\/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=\"Hur man l\u00e4gger till anpassade f\u00e4lt och flikar i WooCommerce Product Data Metabox efter kod\" ><\/a><\/p>\n<p>Allt som \u00e5terst\u00e5r \u00e4r att spara de uppgifter som anges i dina anpassade f\u00e4lt, och f\u00f6r detta anv\u00e4nder vi samma process som ovan:<\/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>Obs: I WooCommerce finns det en allm\u00e4n regel d\u00e4r alla kryssrutor sparas som &#8217; <code>yes<\/code>&#8217; om de \u00e4r markerade, eller som tom str\u00e4ng om de \u00e4r avmarkerade. Genom att f\u00f6lja WooCommerces regel och spara min kryssruta som &#8217; <code>yes<\/code>&#8217;, s\u00e4kerst\u00e4ller detta att mitt <code>woocommerce_wp_checkbox()<\/code>fungerar som det \u00e4r t\u00e4nkt n\u00e4r det h\u00e4mtar det aktuella v\u00e4rdet f\u00f6r mitt f\u00e4lt.<\/p>\n<h2>Slutsats<\/h2>\n<p>I det h\u00e4r inl\u00e4gget kommer jag att visa hur du l\u00e4gger till dina anpassade f\u00e4lt till WooCommerces produktdatametabox, hur du sparar dem, hur du kontrollerar deras synlighet och ett enkelt exempel p\u00e5 att mata ut ditt f\u00e4lt i frontend. Jag visade ocks\u00e5 hur man l\u00e4gger till en anpassad flik i metaboxen och l\u00e4gger till dina f\u00e4lt d\u00e4r. Jag hoppas att detta hj\u00e4lpte dig att anpassa WooCommerce sj\u00e4lv!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I det h\u00e4r inl\u00e4gget kommer vi att l\u00e4ra oss hur du l\u00e4gger till dina anpassade metaf\u00e4lt och flikar i WordPress WooCommerces produktdatametabox med kod.<\/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":[901,724,848,901,1110,818,818,848,724,858,858,868,868],"tags":[1173],"class_list":{"0":"post-233763","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koda","8":"category-utvecklaren","9":"category-handledningar","11":"category-n-a","12":"category-plugins-3","16":"category-woocommerce-9","18":"category-wordpress-9","20":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233763"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233763\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}