BLACK FRIDAY
Save 59% on PageForge Annual $191/year $485/year
Claim 59% Off →
Food Products for WooCommerce icon
Actively maintained Tested with WP 7.1 #1 in batch tracking

Food Products for WooCommerce

Food shop tools for WooCommerce: nutrition tables, ingredients with allergens, best-before dates, batch stock and automatic markdowns.

Active installs<10New
Downloads · 30d189▼ -42.6% vs prev. 30d
Rating—0 reviews
Health score64/100Good
All-time downloads364Since Sep 2026
Support resolved—No recent threads
RequiresWP 6.8PHP 7.4+
Downloads · 7d20▲ +33.3% week over week
Our verdict

Solid choice

Food Products for WooCommerce is a solid plugin choice in 2026, with a few things worth checking first. Was last updated 3 weeks ago, and scores 64/100 on our health check.

  • Actively developed — last update 3 weeks ago
  • Tested with the latest WordPress (7.1)
  • Small user base (<10 active installs)
  • Very few reviews so far

Daily downloads

91929Sep 3Sep 26Oct 19
Yesterday5
Daily average (1y)8
Peak day39Sep 3, 2026
Last 12 months373

Download spikes usually follow a new release — each site that auto-updates counts as a download.

Rankings

Where Food Products for WooCommer… stands today

WordPress.org search rankings

Live position in the plugin search, top 100
KeywordPositionCompeting pluginsCategory
batch tracking >100 891 Best batch tracking plugins →
expiry date >100 984 Best expiry date plugins →
food >100 642 Best food plugins →
nutrition #41 86 Best nutrition plugins →
woocommerce >100 10,000 Best woocommerce plugins →

About Food Products for WooCommerce

From the official readme · v1.4.2

Description

Food Products for WooCommerce turns your WooCommerce shop into a food shop. It adds two
new product types – Food Simple Product and Food Variable Product – that work exactly
like WooCommerce’s own Simple and Variable products, with everything a food or grocery shop
needs on top: a nutrition declaration table, expiry dates, batch and supplier tracking, and
automatic handling of stock that is about to go off.

Nothing is replaced or overridden: your existing products, themes and payment gateways carry
on untouched. You choose the new product type only on the products that need it.

Nutrition declaration table

Every food product gets a Nutrition tab: a label/amount/unit table declared per 100 g or
per 100 ml (pre-filled with the EU-mandatory energy / fat / carbohydrate / protein / salt rows,
all editable) that is shown to shoppers as its own tab on the product page. Rows can be
reordered, renamed, indented as sub-nutrients, added and removed. Food Variable Products can
share one table across every variation, or let a single variation override it with its own.

Ingredient list

An Ingredients tab holding the ingredients in declaration order, each with an optional
percentage, sub-ingredients and one of the 14 EU-declarable allergens. The product page prints
the list as one sentence with allergens in bold, plus a “may contain” line. Per-variation
overrides work the same way as for nutrition.

Expiry dates and batch tracking

The Expiry & Tracking tab stores one row per batch, each with an expiry date, quantity,
batch number, batch date and supplier – so you always know which delivery a unit of stock came
from and when it goes off. Food Variable Products track batches per variation, matching how
WooCommerce already tracks stock. A full-price sale takes units off the freshest batch first, a
reduced sale takes them off the batch the shopper picked, and a restocking refund puts them back,
so the table reads as what is still on the shelf.

Optionally, the closest upcoming expiry date is shown to shoppers on the product page – always,
or only once it falls within a number of days you choose.

Expiry Dashboard and write-off

An admin screen listing every batch row across every food product in one place, sorted by
closest expiry date first, colour-coded by urgency, filterable by date range and exportable as
a CSV file for your stock takes and audits. A batch that has expired can be written off from
there or from the product itself, taking what is left of it out of the sellable stock – or you
can have that happen automatically every night at an hour you choose.

The batch table is the stock

Once a product tracks batches, its batch table is its stock. WooCommerce’s own stock
management is switched off for it while it tracks; the product is in stock while a batch in date
has units left, “N in stock” on the product page is the batch total, and a shopper cannot buy
more than the batches hold. Every sale comes off a batch – a full-price sale off the freshest
batch first, so the batch nearest its date is kept for the reduced offer – and a refund puts the
units back. Stock past its best-before date is not sold at all unless you say so (see below).
Switch tracking off on a product, change it to a non-food type, or turn Expiry & Tracking off
in the settings, and WooCommerce’s stock management comes back as it was before – with the
batch total as its stock quantity, since every sale in between came off the batches.

Automatic Markdown

Offer a discount on the batch closest to its date, on a ladder of steps you set (for example
15% a week out, 30% three days out, 50% on the last day). The product’s own price is never
changed: the shopper opts into the reduced batch on the product page, the discount applies to
that cart line only, and the offer withdraws itself once the batch is sold out or expired. A cap
on units per batch, a price floor, a catalogue badge and a choice of whether a product with
nothing left to sell stays listed or is hidden are all yours to set, and any product can opt out.
Where the law allows it, you can also choose to keep selling batches past their best-before
date: that adds a fixed last step to the ladder with its own discount and wording, and those
units count as sellable stock. A Markdown Earnings
screen reports what each marked-down batch sold, what it brought in, what the discount cost, and
how much expired unsold anyway.

Email when expired

A scheduled digest email listing every batch that has reached its expiry date – or is about to,
within a window you choose – sent to the shop users you pick, daily, weekly, every 2 weeks or
every 3 weeks. Each batch is only ever mailed once, every send is recorded in an Email Log, and
a “Send one now” button lets you run it on demand. Individual products can opt
out.

Automatic category switching

Have WooCommerce move stock for you: categories you choose (for example “Clearance” or “Last
chance”) are added to a product as it nears its closest expiry date, and categories are removed
– or every category stripped – once that date has passed. If a fresh, later-dated batch pushes
the expiry date back out, both changes are reversed automatically, and categories you assigned
by hand are never touched. An optional Switching Log screen records every move the nightly
run makes, with the product, the direction and the batch that caused it.

Built for real shops

  • Fully translation-ready, with a choice of date formats for the dates it prints.
  • WooCommerce HPOS (High-Performance Order Storage) and Cart & Checkout Blocks
    compatible (see Requirements below).
  • No account, no subscription, no external service: the plugin never contacts a remote server
    and sends no analytics or telemetry of any kind. Everything runs on your own site.
  • No bundled third-party libraries – it uses the copies of jQuery and Select2 that WordPress
    and WooCommerce already ship.
  • Every file shipped is unminified, human-readable source. There is no build step.

Requirements

WooCommerce 10.0 or later must be installed and active. The plugin will not activate without
it. If WooCommerce is later disabled: on a single site, the plugin deactivates itself with an
explanatory notice the next time an administrator opens wp-admin; on a network activation the
plugin stays active and shows a notice on sites without WooCommerce, where its features stay
off. MySQL 5.7 or later, or MariaDB 10.0.2 or later, is also required – the stock locks nest
named locks.

Installation

  1. Install and activate WooCommerce, if it isn’t already. This plugin adds product types to
    WooCommerce and will refuse to activate without it.
  2. Install this plugin. Either upload the plugin’s zip file under Plugins > Add New >
    Upload Plugin
    , or upload the extracted folder to /wp-content/plugins/ over FTP/SFTP,
    then activate it.
  3. Create a product the normal WooCommerce way (Products > Add New), and choose Food
    Simple Product
    or Food Variable Product from the Product data type dropdown.
  4. Open Food Products > Settings in the wp-admin menu to configure the date format, expiry
    email notifications, the Expiry Dashboard and automatic category switching.

Frequently asked questions

Does this require WooCommerce?

Yes. The plugin adds WooCommerce product types and will not activate without it.

Does it work with my existing products?

Yes. Existing Simple and Variable products are left exactly as they are. The food features appear only on products you switch to Food Simple Product or Food Variable Product, and you can switch a product back at any time.

How do I add a nutrition table to a WooCommerce product?

Switch the product to Food Simple Product or Food Variable Product from the Product data type dropdown, then fill in its Nutrition tab. It’s pre-filled with the EU-mandatory energy, fat, carbohydrate, protein and salt rows, declared per 100 g or per 100 ml, and shown to shoppers as its own tab on the product page.

How do I show allergens in bold on a WooCommerce product?

Once a product is a Food Simple Product or Food Variable Product, its Ingredients tab lets you mark any ingredient as one of the 14 EU-declarable allergens. The product page prints the ingredient list as one sentence with those allergens in bold, plus a “may contain” line.

Can I show a best-before date on the product page?

Yes. Turn on “Show expiry date in shop” on the product’s Expiry & Tracking tab – always, or only once the date falls within a number of days you choose.

Can I automatically discount food that is about to expire?

Yes, with Automatic Markdown. Set a ladder of discount steps (for example 15% a week out, 30% three days out) and the shopper is offered the batch closest to its date at that price on the product page; the offer withdraws itself once the batch is sold out or expired.

Can I track expiry dates per variation?

Yes. Food Variable Products keep their own batch table per variation, since expiry dates and quantities are physical stock facts and WooCommerce already tracks stock per variation. Nutrients work the other way round: one shared table for the whole product, which any single variation can override.

Why does a new Food Variable Product show its variations straight away?

WooCommerce’s newer variations editor doesn’t know what type a product is until after it has been saved once, so a Food Variable Product created with it would show no variation controls at all on first use. This plugin switches WooCommerce back to its classic variations editor on the Add new product screen only, whatever product type you end up creating, so a Food Variable Product works from the moment you create it. Every other product screen, and every already-saved product, keeps WooCommerce’s own choice of editor untouched.

What is the Expiry Dashboard?

An admin screen listing every batch row from every food product’s Expiry & Tracking table in one place, sorted by closest expiry date first, filterable by date range and exportable as CSV. It can be turned off on the Settings page.

Can I get emailed when a product expires?

Yes. Turn on “Send the expiry digest email” on the Notification Email tab and choose recipients and a frequency (daily, weekly, every 2 weeks or every 3 weeks). Each expiring batch row is emailed once and logged. Set an “upcoming expiry window” to be warned a few days ahead instead of only after the fact.

Does the plugin call any external service?

No. It makes no remote requests, requires no account or API key, and collects no analytics or telemetry.

Does Automatic Markdown work with the block-based product page?

The reduced-batch choice is a field in WooCommerce’s classic add-to-cart form, so it appears on the classic single product template and in the Add to Cart form block that renders that form. The Cart, Mini Cart and Checkout blocks all show the batch and offer a reduced line was bought under.

What happens to the batch units held by an order that never pays?

Starting checkout claims the batch units in the cart so two shoppers cannot both buy the last one. If the order is never paid, those units are put back automatically once WooCommerce’s own “Hold stock (minutes)” setting (WooCommerce > Settings > Products > Inventory) has passed, no matter how the order was started. When that setting is left empty, 60 minutes is used instead. You don’t need to cancel the order by hand to free the stock. Nothing is released while a product’s Expiry & Tracking is switched off.

Will automatic category switching mess up my categories?

No. It records exactly what it added or removed on each product and reverses only that. Any category you assigned by hand is left alone, and individual products can opt out of category switching entirely on their Expiry & Tracking tab. Opting a product out, or turning category switching (or Expiry & Tracking) off, puts back whatever it had changed at that moment.

What happens to my data if I delete the plugin?

Deleting the plugin removes only its own settings (fpwc_generel_settings_options, fpwc_appearance_settings_options), the email log, the category switching log and a note of any stock hand-back still in progress. Nutrition, ingredient and Expiry & Tracking data saved on your products, and the batch a marked-down order line was bought from, are left untouched, so reinstalling picks up exactly where you left off. One thing is worth doing first: deactivating or deleting the plugin does not hand stock back to WooCommerce by itself. Turn Expiry & Tracking off in the settings before you remove the…

Changelog

Fixes translations not loading in the ingredient and product-type editors.

1.4.2

  • Fixed: the ingredient and product-type editors now load their translations. The script translation files shipped in 1.4.1 had the wrong file names, so both editors stayed in English.

1.4.1

  • Added translations for 25 languages: Arabic, Chinese (Simplified and Traditional), Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, Icelandic, Indonesian, Italian, Japanese, Korean, Norwegian (Bokmål), Polish, Portuguese (Brazil), Romanian, Russian, Spanish, Swedish, Turkish and Ukrainian.
  • Translations ship as .mo and .l10n.php files for PHP and as JSON for the admin scripts, so the ingredient and product-type editors are translated too.
  • Each language uses its own plural rules, so counts like “3 days” or “5 sub-ingredients” read correctly.
  • The offer label tokens {date}, {days} and {percent} work the same in every language.

1.4.0

  • Requires WooCommerce 10.0 or later. Earlier WooCommerce releases let block checkout give back a batch claim before payment; the plugin now warns in wp-admin when it finds one.
  • Fixed: saving a product no longer undoes sales made while its edit screen was open. A batch that sold or moved in the meantime keeps its real count, and you are told.
  • Fixed: an unpaid order’s batch units are put back automatically after WooCommerce’s Hold stock time.
  • Fixed: turning Expiry & Tracking off hands stock back to WooCommerce in batches that resume if interrupted, and are finished before the plugin is deactivated.
  • Fixed: an order can no longer take the same units twice when two payment notifications arrive together, and a stock update held up by a busy lock is retried instead of dropped.
  • Fixed: on multisite, one site without WooCommerce no longer switches the plugin off across the whole network, and sites sharing a database server no longer wait on each other’s locks.
  • Fixed: the settings screens save on WooCommerce 10.0.
  • “N in stock” now follows WooCommerce’s Stock display format setting.
  • The expiry digest log records recipients by user rather than by email address.
  • Smaller fixes: the Expiry Dashboard deletes a batch by its id, duplicating a product never copies its batches, “Send one now” respects the Expiry & Tracking switch, uninstalling clears every scheduled job, and plural wording is correct in every language.

1.3.1

  • Fixed batch expiry, category switching, digest retries and Markdown Earnings edge cases;
    improved performance for larger catalogues and made Food Variable controls more reliable.
  • Fixed: two shoppers checking out the last units at once could both be sold them. Batch stock
    is now claimed while checkout can still refuse, in classic and block checkout alike.
  • Fixed: switching batch tracking off, changing the product type or turning Expiry & Tracking
    off now gives WooCommerce its stock management back, with the batch total as the quantity.
  • Fixed: sold-out and written-off batches no longer set the best-before date shown in the shop.
    Where automatic markdown can offer the stock, the date is shown on the offer instead.
  • Fixed: saving settings no longer sends the expiry digest at once or moves its schedule.
  • Fixed: removing the last email recipient or category from a setting now saves.
  • Fixed: a negative batch quantity typed in the editor is saved as zero rather than as stock.
  • Fixed: Mini Cart blocks outside the shop pages now style the batch and offer lines.

1.3.0

Correctness release. The headline fix is a race condition in how batch stock was written.

  • Fixed: two customers checking out at the same time could both buy the last units of a batch.
    Every batch movement – a sale, a refund, a write-off, a product save – read the batch table,
    changed it in PHP and wrote it back, so the second write silently discarded the first one’s
    deduction and the batch sold past its physical stock. Since the batch table is the stock, the
    product’s sellable figure was wrong with it. All nine places that write a batch table now do so
    under a per-product lock. On a database with no lock support the write still goes through and a
    line is written to the error log, because failing to record a sale that has already been paid
    for is the same oversell by another route.
  • Changed: a refund only puts units back on the shelf when “Restock refunded items” is ticked.
    Previously every refund restocked, even when the customer kept damaged goods. Refunds made
    before this release are treated as restocking, so nothing already in your books moves.
  • Fixed: automatic category switching ignored quantity, so a written-off batch kept a product in
    the “expired” category every night however much fresh stock was behind it. It now looks only at
    batches that still have units, as the settings screen always said it did.
  • Fixed: re-saving a product wiped its write-off history, zeroing the “Written off” column in
    Markdown Earnings.
  • Fixed: weekly, 2-weekly and 3-weekly digests were never scheduled when the plugin was activated
    • only when the settings page was next saved.
  • Fixed: the digest emailed products that are no longer tracked, and batches with no units left.
  • Fixed: a reduced price could show as the full price in the mini-cart and on block-based carts
    until the next page load.
  • Fixed: refunding, cancelling or trashing an order placed while Automatic Markdown was on did not
    credit its units back once the feature was switched off. Deleting a refund, and trashing an
    order outright, now re-count it too.
  • Fixed: on shops entering prices excluding tax and showing them including it (or the reverse),
    the batch picker showed a different “full price” than the one printed above it, and Markdown
    Earnings added two different tax bases together.
  • Fixed: in “hide” mode, products taken off the shop still used up their slot in the product grid,
    so a page of twelve could render four.
  • Fixed: a product switched away from a food type kept answering its stock from batches nobody
    could edit any more.
  • Fixed: dates and times in the Switching Log could disagree by a day, and the date filter could
    miss entries from the day it was filtering on.
  • Fixed: “Copy to a new draft” carried the original’s category-switching state, so the copy began
    life as expired.
  • Fixed: a nearing-expiry category could be left on a product after it had passed through expired
    and back out again.
  • Fixed: opening a variable product marked every variation as changed before anything was edited.
  • Fixed: a reduced cart line that dropped to full price, because its batch sold out while the
    shopper browsed, became a second line for the same product on the next add to cart.
  • Security: the recipient picker no longer returns other users’ email addresses, and the markdown
    unit cap is bounded.
  • Quantities and packing dates are stored as numbers and dates rather than as whatever was typed.
  • Documented in the FAQ: once a product’s batch table takes over as its stock, WooCommerce’s own
    stock figure for it is not recoverable after uninstalling.

1.2.0

  • New “Appearance” settings tab: thirteen colours covering the ingredient list, the nutrition
    table, the batch picker, the “Reduced to clear” badge and the best-before line, with a live
    preview on a light and a dark theme and a WCAG contrast check on the pairs that carry text.
    Every field starts empty and empty keeps the shipped styling, so an untouched shop is served
    no extra CSS at all and keeps following its theme.
  • The plugin is now called “Food Products for WooCommerce” wherever its name is shown.
  • Automatic Markdown now offers every batch that is close enough to its date, each at its own
    step, instead of only the one closest to expiry. The shopper picks the date they want.
  • The Expiry Dashboard’s columns can be sorted by clicking their headings, and the CSV export
    follows the same order.
  • The product page stylesheets now inherit the theme’s font, size and colours, so the nutrition
    table, ingredient list, best-before line and batch picker read correctly on dark and light
    themes alike without custom CSS.
  • Stylesheets and scripts are only loaded on the pages that use them: a non-food product page
    loads none of them, and the markdown stylesheet no longer loads on every page of the site.

Full changelog on WordPress.org →

Screenshots

A Food Simple Product on the shop front end, with the nutrition declaration table, the
ingredient list with allergens in bold, and the expiry date shown to the shopper.
A Food Simple Product on the shop front end, with the nutrition declaration table, the…
The Nutrition tab in the product editor: the label/amount/unit table declared per 100 g or
100 ml, pre-filled with the EU-mandatory rows and reorderable by drag.
The Nutrition tab in the product editor: the label/amount/unit table declared per 100 g…
The Ingredients tab: ingredients in declaration order, each with an optional percentage,
sub-ingredients and one of the 14 EU-declarable allergens.
The Ingredients tab: ingredients in declaration order, each with an optional percentage…
The Expiry & Tracking tab: the batch table with expiry date, quantity, batch number and
supplier, which doubles as the product's stock.
The Expiry & Tracking tab: the batch table with expiry date, quantity, batch number and…
The Automatic Markdown settings, where you set the discount steps that reduce a batch as its
expiry date gets closer.
The Automatic Markdown settings, where you set the discount steps that reduce a batch as…
The Markdown Earnings dashboard, showing what marked-down stock sold for against what it
would otherwise have been written off for.
The Markdown Earnings dashboard, showing what marked-down stock sold for against what it…
The Expiry Dashboard: every batch row from every food product in one list, closest expiry
first, filterable by date range and exportable as CSV.
The Expiry Dashboard: every batch row from every food product in one list, closest expiry…

For developers

Is this your plugin? Show off the numbers.

Add a live badge to your site, docs or GitHub README. It updates on its own — no account needed.

Active installs badge Rating badge Health score badge

FAQ

Food Products for WooCommerce: quick answers

Straight answers, pulled from live WordPress.org data.

Live data from WordPress.org · checked Oct 20, 2026

Is Food Products for WooCommerce free?

Yes. Food Products for WooCommerce is free to download and use from the official WordPress.org plugin directory.

Is Food Products for WooCommerce safe to use in 2026?

Food Products for WooCommerce is a solid plugin choice in 2026, with a few things worth checking first. Was last updated 3 weeks ago, and scores 64/100 on our health check.

How many websites use Food Products for WooCommerce?

Food Products for WooCommerce is active on <10 WordPress websites and has been downloaded 364 times since it launched in September 2026. It was downloaded 189 times in the last 30 days.

Does Food Products for WooCommerce work with WordPress 7.1?

Yes. The developer has tested Food Products for WooCommerce up to WordPress 7.1.3, the latest release. It requires WordPress 6.8 or newer.

What PHP version does Food Products for WooCommerce need?

Food Products for WooCommerce requires PHP 7.4 or higher. Most hosts run PHP 8.x today, so it works on any modern WordPress hosting.

When was Food Products for WooCommerce last updated?

The latest version, 1.4.2, was released on September 26, 2026 (3 weeks ago).

Who makes Food Products for WooCommerce?

Food Products for WooCommerce is developed and maintained by Mac.

Powered by PageForge

Want thousands of pages that rank like these? Build them in an afternoon.

This directory runs on the same engine as PageForge. Turn any spreadsheet, CSV or API into thousands of fast, SEO-ready WordPress pages — with schema, internal links and AI-written copy baked in.

  • CSV, Google Sheets & API data sources
  • AI content, schema & internal links per page
  • Works with Elementor, Gutenberg, Yoast & Rank Math
  • Free on WordPress.org — no credit card
Sarah is here to help!
Hi there! 👋 Need help finding what you're looking for?
Sarah
Sarah
Online & Ready to Help
Hi there! 👋 Need help finding what you're looking for?

We'll use this to continue our conversation

Just now ✓ Verified

Join 500+ SEO Pros Scaling Their Strategy

Get exclusive programmatic SEO tactics, AI content workflows, and the latest PageForge updates delivered straight to your inbox. Stay ahead of the algorithm.

We care about your data in our privacy policy.