{"id":358932,"date":"2026-09-03T07:51:48","date_gmt":"2026-09-03T07:51:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/food-products-for-woocommerce\/"},"modified":"2026-09-03T15:17:12","modified_gmt":"2026-09-03T15:17:12","slug":"mfood-products-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mfood-products-for-woocommerce\/","author":23547000,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1","requires":"6.8","requires_php":"8.1","requires_plugins":null,"header_name":"Food Products for WooCommerce","header_author":"Magnus V.","header_description":"Adds Food Simple Product and Food Variable Product WooCommerce product types, with nutrient tables, batch\/expiry tracking, an expiry dashboard, expiry emails and automatic category switching.","assets_banners_color":"8e8684","last_updated":"2026-09-03 15:17:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/mfood-products-for-woocommerce\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"macvej","date":"2026-09-03 07:51:29","revision":3679253},"1.1.1":{"tag":"1.1.1","author":"macvej","date":"2026-09-03 15:17:12","revision":3679962}},"upgrade_notice":{"1.1.1":"<p>Every short-dated batch is now offered, not only the closest one; sortable Expiry Dashboard; theme-neutral product page styling. Nothing you have set up changes.<\/p>","1.1.0":"<p>Automatic Markdown, ingredient lists, expired-batch write-off and two new reporting screens, plus\na new Products settings tab. Everything already saved on your products is kept.<\/p>","1.0.2":"<p>Plugin display name now matches the assigned slug. Nothing you have set up changes.<\/p>","1.0.15":"<p>New plugin slug and text domain from the plugin review. Nothing you have set up changes.<\/p>","1.0.1":"<p>Naming, escaping and reliability fixes from the plugin review. No settings change.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3679253,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3679253,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3679253,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3679253,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3679253,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3679393,"resolution":"1","location":"assets","locale":"","width":3783,"height":1741},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3679393,"resolution":"2","location":"assets","locale":"","width":3801,"height":1818},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3679393,"resolution":"3","location":"assets","locale":"","width":3792,"height":1818},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3679393,"resolution":"4","location":"assets","locale":"","width":3801,"height":1834},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3679393,"resolution":"5","location":"assets","locale":"","width":3788,"height":1802},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3679393,"resolution":"6","location":"assets","locale":"","width":3823,"height":1821},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3679393,"resolution":"7","location":"assets","locale":"","width":3823,"height":1802}},"screenshots":{"1":"A Food Simple Product on the shop front end, with the nutrition declaration table, the\ningredient list with allergens in bold, and the expiry date shown to the shopper.","2":"The Nutrition tab in the product editor: the label\/amount\/unit table declared per 100 g or\n100 ml, pre-filled with the EU-mandatory rows and reorderable by drag.","3":"The Ingredients tab: ingredients in declaration order, each with an optional percentage,\nsub-ingredients and one of the 14 EU-declarable allergens.","4":"The Expiry &amp; Tracking tab: the batch table with expiry date, quantity, batch number and\nsupplier, which doubles as the product's stock.","5":"The Automatic Markdown settings, where you set the discount steps that reduce a batch as its\nexpiry date gets closer.","6":"The Markdown Earnings dashboard, showing what marked-down stock sold for against what it\nwould otherwise have been written off for.","7":"The Expiry Dashboard: every batch row from every food product in one list, closest expiry\nfirst, filterable by date range and exportable as CSV."}},"plugin_section":[],"plugin_tags":[278981,56513,12446,13467,286],"plugin_category":[39,45],"plugin_contributors":[277115],"plugin_business_model":[],"class_list":["post-358932","plugin","type-plugin","status-publish","hentry","plugin_tags-batch-tracking","plugin_tags-expiry-date","plugin_tags-food","plugin_tags-nutrition","plugin_tags-woocommerce","plugin_category-business","plugin_category-ecommerce","plugin_contributors-macvej","plugin_committers-macvej"],"banners":{"banner":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/banner-772x250.png?rev=3679253","banner_2x":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/banner-1544x500.png?rev=3679253","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/icon.svg?rev=3679253","icon":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/icon.svg?rev=3679253","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-1.png?rev=3679393","caption":"A Food Simple Product on the shop front end, with the nutrition declaration table, the\ningredient list with allergens in bold, and the expiry date shown to the shopper."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-2.png?rev=3679393","caption":"The Nutrition tab in the product editor: the label\/amount\/unit table declared per 100 g or\n100 ml, pre-filled with the EU-mandatory rows and reorderable by drag."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-3.png?rev=3679393","caption":"The Ingredients tab: ingredients in declaration order, each with an optional percentage,\nsub-ingredients and one of the 14 EU-declarable allergens."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-4.png?rev=3679393","caption":"The Expiry &amp; Tracking tab: the batch table with expiry date, quantity, batch number and\nsupplier, which doubles as the product's stock."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-5.png?rev=3679393","caption":"The Automatic Markdown settings, where you set the discount steps that reduce a batch as its\nexpiry date gets closer."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-6.png?rev=3679393","caption":"The Markdown Earnings dashboard, showing what marked-down stock sold for against what it\nwould otherwise have been written off for."},{"src":"https:\/\/ps.w.org\/mfood-products-for-woocommerce\/assets\/screenshot-7.png?rev=3679393","caption":"The Expiry Dashboard: every batch row from every food product in one list, closest expiry\nfirst, filterable by date range and exportable as CSV."}],"raw_content":"<!--section=description-->\n<p><strong>Food Products for WooCommerce<\/strong> turns your WooCommerce shop into a food shop. It adds two\nnew product types - <strong>Food Simple Product<\/strong> and <strong>Food Variable Product<\/strong> - that work exactly\nlike WooCommerce's own Simple and Variable products, with everything a food or grocery shop\nneeds on top: a nutrition declaration table, expiry dates, batch and supplier tracking, and\nautomatic handling of stock that is about to go off.<\/p>\n\n<p>Nothing is replaced or overridden: your existing products, themes and payment gateways carry\non untouched. You choose the new product type only on the products that need it.<\/p>\n\n<h4>Nutrition declaration table<\/h4>\n\n<p>Every food product gets a <strong>Nutrition<\/strong> tab: a label\/amount\/unit table declared per 100 g or\nper 100 ml (pre-filled with the EU-mandatory energy \/ fat \/ carbohydrate \/ protein \/ salt rows,\nall editable) that is shown to shoppers as its own tab on the product page. Rows can be\nreordered, renamed, indented as sub-nutrients, added and removed. Food Variable Products can\nshare one table across every variation, or let a single variation override it with its own.<\/p>\n\n<h4>Ingredient list<\/h4>\n\n<p>An <strong>Ingredients<\/strong> tab holding the ingredients in declaration order, each with an optional\npercentage, sub-ingredients and one of the 14 EU-declarable allergens. The product page prints\nthe list as one sentence with allergens in bold, plus a \"may contain\" line. Per-variation\noverrides work the same way as for nutrition.<\/p>\n\n<h4>Expiry dates and batch tracking<\/h4>\n\n<p>The <strong>Expiry &amp; Tracking<\/strong> tab stores one row per batch, each with an expiry date, quantity,\nbatch number, batch date and supplier - so you always know which delivery a unit of stock came\nfrom and when it goes off. Food Variable Products track batches per variation, matching how\nWooCommerce already tracks stock. Every sale takes a unit off the batch closest to its date,\nand a refund puts it back, so the table reads as what is still on the shelf.<\/p>\n\n<p>Optionally, the closest upcoming expiry date is shown to shoppers on the product page - always,\nor only once it falls within a number of days you choose.<\/p>\n\n<h4>Expiry Dashboard and write-off<\/h4>\n\n<p>An admin screen listing every batch row across every food product in one place, sorted by\nclosest expiry date first, colour-coded by urgency, filterable by date range and exportable as\na CSV file for your stock takes and audits. A batch that has expired can be written off from\nthere or from the product itself, taking what is left of it out of the sellable stock - or you\ncan have that happen automatically every night at an hour you choose.<\/p>\n\n<h4>The batch table is the stock<\/h4>\n\n<p>Once a product tracks batches, its batch table <em>is<\/em> its stock. WooCommerce's own stock\nmanagement is switched off for it and stays off; the product is in stock while a batch in date\nhas units left, \"N in stock\" on the product page is the batch total, and a shopper cannot buy\nmore than the batches hold. Every sale comes off a batch - a full-price sale off the freshest\nbatch first, so the batch nearest its date is kept for the reduced offer - and a refund puts the\nunits back. Stock past its best-before date is not sold at all unless you say so (see below).<\/p>\n\n<h4>Automatic Markdown<\/h4>\n\n<p>Offer a discount on the batch closest to its date, on a ladder of steps you set (for example\n15% a week out, 30% three days out, 50% on the last day). The product's own price is never\nchanged: the shopper opts into the reduced batch on the product page, the discount applies to\nthat cart line only, and the offer withdraws itself once the batch is sold out or expired. A cap\non units per batch, a price floor, a catalogue badge and a choice of whether a product with\nnothing left to sell stays listed or is hidden are all yours to set, and any product can opt out.\nWhere the law allows it, you can also choose to keep selling batches past their best-before\ndate: that adds a fixed last step to the ladder with its own discount and wording, and those\nunits count as sellable stock. A <strong>Markdown Earnings<\/strong>\nscreen reports what each marked-down batch sold, what it brought in, what the discount cost, and\nhow much expired unsold anyway.<\/p>\n\n<h4>Email when expired<\/h4>\n\n<p>A scheduled digest email listing every batch that has reached its expiry date - or is about to,\nwithin a window you choose - sent to the shop users you pick, daily, weekly, every 2 weeks or\nevery 3 weeks. Each batch is only ever mailed once, every send is recorded in an Email Log, and\na \"Send Notification Email Now\" button lets you run it on demand. Individual products can opt\nout.<\/p>\n\n<h4>Automatic category switching<\/h4>\n\n<p>Have WooCommerce move stock for you: categories you choose (for example \"Clearance\" or \"Last\nchance\") are added to a product as it nears its closest expiry date, and categories are removed\n- or every category stripped - once that date has passed. If a fresh, later-dated batch pushes\nthe expiry date back out, both changes are reversed automatically, and categories you assigned\nby hand are never touched. An optional <strong>Switching Log<\/strong> screen records every move the nightly\nrun makes, with the product, the direction and the batch that caused it.<\/p>\n\n<h4>Built for real shops<\/h4>\n\n<ul>\n<li>Fully translation-ready, with a choice of date formats for the dates it prints.<\/li>\n<li>WooCommerce <strong>HPOS<\/strong> (High-Performance Order Storage) and <strong>Cart &amp; Checkout Blocks<\/strong>\ncompatible.<\/li>\n<li>No account, no subscription, no external service: the plugin never contacts a remote server\nand sends no analytics or telemetry of any kind. Everything runs on your own site.<\/li>\n<li>No bundled third-party libraries - it uses the copies of jQuery and Select2 that WordPress\nand WooCommerce already ship.<\/li>\n<li>Every file shipped is unminified, human-readable source. There is no build step.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<p>WooCommerce must be installed and active. The plugin will not activate without it, and\ndeactivates itself with an explanatory notice if WooCommerce is later disabled.<\/p>\n\n<!--section=installation-->\n<ol>\n<li><strong>Install and activate WooCommerce<\/strong>, if it isn't already. This plugin adds product types to\nWooCommerce and will refuse to activate without it.<\/li>\n<li><strong>Install this plugin.<\/strong> Either upload the plugin's zip file under <strong>Plugins &gt; Add New &gt;\nUpload Plugin<\/strong>, or upload the extracted folder to <code>\/wp-content\/plugins\/<\/code> over FTP\/SFTP,\nthen activate it.<\/li>\n<li><strong>Create a product<\/strong> the normal WooCommerce way (<strong>Products &gt; Add New<\/strong>), and choose <strong>Food\nSimple Product<\/strong> or <strong>Food Variable Product<\/strong> from the <strong>Product data<\/strong> type dropdown.<\/li>\n<li><strong>Open Food Products &gt; Settings<\/strong> in the wp-admin menu to configure the date format, expiry\nemail notifications, the Expiry Dashboard and automatic category switching.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20woocommerce%3F\"><h3>Does this require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. The plugin adds WooCommerce product types and will not activate without it.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20existing%20products%3F\"><h3>Does it work with my existing products?<\/h3><\/dt>\n<dd><p>Yes. Existing Simple and Variable products are left exactly as they are. The food features\nappear only on products you switch to Food Simple Product or Food Variable Product, and you can\nswitch a product back at any time.<\/p><\/dd>\n<dt id=\"can%20i%20track%20expiry%20dates%20per%20variation%3F\"><h3>Can I track expiry dates per variation?<\/h3><\/dt>\n<dd><p>Yes. Food Variable Products keep their own batch table per variation, since expiry dates and\nquantities are physical stock facts and WooCommerce already tracks stock per variation.\nNutrients work the other way round: one shared table for the whole product, which any single\nvariation can override.<\/p><\/dd>\n<dt id=\"what%20is%20the%20expiry%20dashboard%3F\"><h3>What is the Expiry Dashboard?<\/h3><\/dt>\n<dd><p>An admin screen listing every batch row from every food product's Expiry &amp; Tracking table in\none place, sorted by closest expiry date first, filterable by date range and exportable as CSV.\nIt can be turned off on the Settings page.<\/p><\/dd>\n<dt id=\"can%20i%20get%20emailed%20when%20a%20product%20expires%3F\"><h3>Can I get emailed when a product expires?<\/h3><\/dt>\n<dd><p>Yes. Turn on \"Email when expired\" on the Notification Email tab and choose recipients and a\nfrequency (daily, weekly, every 2 weeks or every 3 weeks). Each expiring batch row is emailed\nonce and logged. Set an \"upcoming expiry window\" to be warned a few days ahead instead of only\nafter the fact.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20call%20any%20external%20service%3F\"><h3>Does the plugin call any external service?<\/h3><\/dt>\n<dd><p>No. It makes no remote requests, requires no account or API key, and collects no analytics or\ntelemetry.<\/p><\/dd>\n<dt id=\"does%20automatic%20markdown%20work%20with%20the%20block-based%20product%20page%3F\"><h3>Does Automatic Markdown work with the block-based product page?<\/h3><\/dt>\n<dd><p>The reduced-batch choice is a field in WooCommerce's classic add-to-cart form, so it appears on\nthe classic single product template and in the Add to Cart form block that renders that form.\nThe Cart, Mini Cart and Checkout blocks all show the batch and offer a reduced line was bought\nunder.<\/p><\/dd>\n<dt id=\"will%20automatic%20category%20switching%20mess%20up%20my%20categories%3F\"><h3>Will automatic category switching mess up my categories?<\/h3><\/dt>\n<dd><p>No. It records exactly what it added or removed on each product and reverses only that. Any\ncategory you assigned by hand is left alone, and individual products can opt out of category\nswitching entirely on their Expiry &amp; Tracking tab.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes only its own settings (<code>fpwc_generel_settings_options<\/code>), the email\nlog and the category switching log. Nutrition, ingredient and Expiry &amp; Tracking data saved on\nyour products, and the batch a marked-down order line was bought from, are left untouched, so\nreinstalling picks up exactly where you left off.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>The plugin is now called \"Food Products for WooCommerce\" wherever its name is shown.<\/li>\n<li>Automatic Markdown now offers every batch that is close enough to its date, each at its own\nstep, instead of only the one closest to expiry. The shopper picks the date they want.<\/li>\n<li>The Expiry Dashboard's columns can be sorted by clicking their headings, and the CSV export\nfollows the same order.<\/li>\n<li>The product page stylesheets now inherit the theme's font, size and colours, so the nutrition\ntable, ingredient list, best-before line and batch picker read correctly on dark and light\nthemes alike without custom CSS.<\/li>\n<li>Stylesheets and scripts are only loaded on the pages that use them: a non-food product page\nloads none of them, and the markdown stylesheet no longer loads on every page of the site.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>The batch table is now a tracked product's stock. Switching \"Track expiry dates and batches\" on\nturns WooCommerce's own stock management off for that product or variation (and for the parent\nof a variable product) and hides the option; the product is in stock while a batch in date has\nunits left, the product page shows the batch total as \"N in stock\", and a shopper cannot buy\nmore than the batches hold. A product that was managing stock shows what WooCommerce held, so\nthose units can be entered as batches.<\/li>\n<li>A full-price sale now comes off the freshest batch first, keeping the batch nearest its date for\nthe reduced offer. A reduced sale still comes off the batch the shopper picked.<\/li>\n<li>Stock past its best-before date is no longer sold at any price unless \"When a batch passes its\nbest-before date\" under Products is set to keeping it on sale, which adds a fixed last step to the\nAutomatic Markdown ladder for it with its own discount and wording. The ladder's own steps now\nstart at one day out.<\/li>\n<li>\"When every batch has expired\" is now \"When nothing is left to sell\", with two choices: show the\nproduct as out of stock, or hide it. The old \"keep selling at full price\" choice no longer\napplies and falls back to out of stock.<\/li>\n<li>What happens to a batch past its date is now one choice under Products - write it off by hand,\nwrite it off nightly, or keep it on sale at a discount - rather than two toggles on two tabs that\nruled each other out.<\/li>\n<li>New <strong>Automatic Markdown<\/strong>: discount a batch automatically as its best-before date approaches,\non a ladder of steps you set, with a live preview of what a shopper would be offered, a cap on\nhow many units go on offer, a price floor, and a choice of what happens once every batch has\nexpired.<\/li>\n<li>New <strong>Markdown Earnings<\/strong> screen: what each marked-down batch sold, what it brought in, what\nthe discount cost, and how much expired unsold anyway.<\/li>\n<li>New <strong>Switching Log<\/strong> screen: every category move the nightly run makes, with the product, the\ndirection and the batch that caused it.<\/li>\n<li>New <strong>Ingredient list<\/strong>, with allergens picked out in bold, shown as its own tab on the\nproduct page.<\/li>\n<li>New nightly write-off, and a write-off button on each batch, taking what is left of an expired\nbatch off WooCommerce stock so the shop stops selling it. Pick the hour it runs at, on your\nshop's own clock; it starts at midnight. It never takes stock below zero.<\/li>\n<li>Batch quantities now follow every sale, not only the reduced ones: a sold unit comes off the\nbatch closest to its best-before date, the way the shelf is emptied, and a refund puts it back\non the batch it came off. Stock you have not put a date on is sold last. The Expiry Dashboard\nand the batch table therefore read as what is still on the shelf rather than what was put there,\nand an expiring batch is no longer written off stock that was already sold.<\/li>\n<li>Split the settings into a General tab and a new Products tab. Each dashboard is switched on\ndirectly under the feature it reports on, and is only offered while that feature is on: Expiry\nDashboard and Switching Log on the Products tab, Markdown Earnings on the Automatic Markdown\ntab. The General tab is left with the date format.<\/li>\n<li>The Markdown Earnings and Switching Log screens now open on the last year, and their date filters\nare labelled From and To.<\/li>\n<li>The markdown plumbing an order line carries - the batch it came from and the amount saved - is no\nlonger listed on the order screen. The Best before date and the Offer it was sold under still are,\nand the money is on the Markdown Earnings screen.<\/li>\n<li>Rewrote the option names, labels, tooltips and messages across every screen in plain English,\nwith one term per thing throughout.<\/li>\n<li>The write-off and delete buttons on the Expiry Dashboard now name themselves on hover, so an\nicon-only action says what it does before it is clicked.<\/li>\n<li>Every switch in the Expiry &amp; Tracking tab now carries a help tip saying what it does, on both a\nSimple Food Product and each variation of a Variable Food Product.<\/li>\n<li>The Best before date and the Offer a reduced line was bought under now sit on a line each in the\nbasket, mini-basket and checkout, instead of running together into one sentence.<\/li>\n<li>Fixed a Variable Food Product adding its parent to the cart instead of the variation the shopper\npicked. WooCommerce chooses how to handle an add-to-cart by product type and only knows its own,\nso the chosen variation was being dropped - which also made a marked-down variation come back as\n\"the reduced units have just sold out\", the batch having been looked for on the parent.<\/li>\n<li>Nutrient table rows can be dragged by their grip again - jQuery UI was cancelling every drag\nbecause the grip is a button.<\/li>\n<li>Fixed the \"Declared per\" choices stacking on top of each other in the product-level Nutrient\ntab, so 100 g and 100 ml can be picked again.<\/li>\n<li>Dropped \"Serving\" as a declaration basis. EU FIC 1169\/2011 wants the declaration itself per\n100 g or per 100 ml, so a serving size is now simply printed alongside whichever of those is\nchosen, on both the product page and per variation. Products that had saved \"Serving\" fall\nback to per 100 g and keep showing their serving size.<\/li>\n<li>Fixed the Unit select being taller than the fields beside it, in both the product tab and the\nvariation panels.<\/li>\n<li>Fixed the nutrient row buttons sitting top-left instead of centred inside variation panels.<\/li>\n<li>Removed the nutrient row counter and the customer preview from the editor.<\/li>\n<li>Nutrient tables inside variation panels are drag-sortable again. The handler that set them up\nlistened on the wrong element for WooCommerce's \"variations loaded\" event, so it never ran.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Renamed the plugin display name to \"MFood Products for WooCommerce\" so it matches the\nassigned plugin slug, as asked for in the plugin review. Nothing you have set up changes.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Renamed the plugin slug and text domain from <code>food-products-for-woocommerce<\/code> to\n  mfood-products-for-woocommerce, as asked for in the plugin review. The plugin name, its\nsettings and all data saved on your products are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Prefixed every remaining global name (options, meta, hooks, cron schedule keys, script\nhandles, page slugs, CSS classes) and removed the dynamic prefix concatenation.<\/li>\n<li>Fixed an unbalanced closing tag on the settings screens.<\/li>\n<li>Guarded product category lookups against an error result.<\/li>\n<li>Guarded a missing quantity value when building the notification email.<\/li>\n<li>Batched the email log writes into a single option update.<\/li>\n<li>Passed fputcsv() its delimiter, enclosure and escape explicitly, for PHP 8.4.<\/li>\n<li>Removed unused code and corrected documentation.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Sell food in WooCommerce: nutrition tables, expiry dates, batch tracking, an expiry dashboard, expiry emails and automatic category switching.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358932"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/macvej"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358932"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358932"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358932"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358932"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358932"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}