Skip to content

ProducerKit 2.0.0

Choose a tag to compare

@jwincek jwincek released this 02 Sep 21:41
· 151 commits to main since this release
9a4030e

Farm Stand Manager becomes ProducerKit, absorbs WC Artisan Tools, and serves any small producer — a farm, a bakery, a beekeeper, a potter, a band, a comics artist.

⚠️ Read before updating an existing site

There is no upgrade path from 1.x. Every stored identifier was renamed and nothing is migrated — post types, taxonomies, meta keys, database tables, options, cron hooks, block names, the REST namespace. Content created by 1.x will not be visible after updating.

Export first, or stay on 1.1.0. On a new install there is nothing to worry about.

This was a deliberate choice made while the plugin had no installed base: lfuf was short for Leftfield Urban Farm, the single site it began as, and every identifier in the plugin carried that name. A row count confirmed the install was genuinely empty, so the window was used before it closed permanently at first real install.

Added

Producer profiles. Sixteen trades — Farm, Bakery, Beekeeping, Musician, Author, Comics & Graphic Novels, Painting & Drawing, Screen Printing, Taxidermy, and seven crafts — each re-labelling the product fields and seeding that trade's vocabulary. A potter's Material is a Clay Body; a beekeeper's is a Floral Source; a printer's is a Substrate.

A site can run more than one. Which fields exist and which terms are seeded combine across the active profiles, because those are facts about the install. The wording resolves per person, because there is one field with one label and "Wood Species" and "Flour" have no sensible merge — so on a site run by two people, the grower sees Material and the baker sees Flour over the same field.

Commissions. Made-to-order requests with a quote round-trip: a customer describes what they want, the maker quotes a price and a date, the customer accepts or declines from an emailed link. Its own table, an enforced status machine, an admin queue, and a request-form block whose Type and Material options come from the active profile.

Optional WooCommerce module. Without WooCommerce, requests settle directly — cash, Venmo, or an invoice. With it, they can settle through the store. Nothing in the commission workflow requires it.

Trade fields on the front end. Material, Finish and Component render on the Product Card and the single product page, labelled as the viewer's own profile names them.

Changed

The admin menu. Five top-level items became three, kept together rather than scattered. The catalogue reads Catalog and events read Calendar, because WooCommerce already owns "Products" and The Events Calendar owns "Events" in the same sidebar.

One Interactivity store. Six per-block stores became a single shared namespace with feature modules. Per-block JavaScript fell from 800 lines to 147.

Fixed

  • An RSVP placed through an Event Card never recorded that the event had just filled. Both blocks registered into the same store from separate files with their own copies of the submit action; the copies had drifted, and on a page holding both, load order decided the behaviour for both.
  • Commission rate limiting hashed visitor IP addresses with an unsalted digest, which is reversible by brute force. All IP hashing is now salted per-site.
  • The spam-guard integration passed its arguments in the wrong shape, so the form context never reached it and its hidden fields were dropped from JSON submissions.
  • Producer profiles let you enter Clay Body and Glaze, and nothing displayed them.

Requirements

WordPress 6.9+ · PHP 8.1+ · WooCommerce optional

Verified on this release: 24 unit and 171 integration tests, PHPCS clean, Plugin Check clean, and PHPUnit passing on PHP 8.1 — the version the header promises.