=== fuzzy where-to-buy ===
Contributors: fuzzy
Tags: store locator, where to buy, dispensary, cannabis, schema
Requires at least: 6.3
Requires PHP: 7.4
Stable tag: 1.5.0
License: MIT

The dispensaries that carry your brand, printed in your page as real text with schema.org JSON-LD, from live dispensary menus.

== Description ==

One install covers every brand site you run. Put the shortcode on any page (or use the Elementor widget):

    [fuzzy_where_to_buy brand="your-brand-slug"]

Options: state="NJ", city="Jersey City" (a town page), product="..." (a product page), limit="50", title="...", theme="inherit|light|dark|auto", accent="#0a6e4d", radius="10", density="compact", finder="1" (adds the interactive finder with town, ZIP, Near me and a map under the list).

The list is server-rendered: your server fetches it from fuzzy, keeps it for six hours and prints plain HTML, so search engines and AI answer engines read the stores as your page's own content. After six hours the page shows the last good copy straight away while WP-Cron fetches a fresh one in the background, so visitors and crawlers never wait on fuzzy (only the very first view of a page does). When fuzzy can't be reached, the last good copy is shown. On a single post or page, the list's schema.org markup names that page's URL.

Each list ends with a small "Powered by fuzzy" credit: the fuzzy logo, linking to https://www.fuzzy.so. The plugin is free; the credit is the price.

Products page: [fuzzy_products brand="your-brand-slug" state="NJ"] lists your products from live menus, each with its shelf price range and how many dispensaries carry it, with schema.org Product markup (in Elementor, set the widget's Show to Products).

On a product's own page, add product="..." to [fuzzy_where_to_buy] and the list says what that product sells for and where ("$10–$15 at 10 dispensaries in New Jersey"), with a schema.org Product.

Every product page, with no shortcode: on a WooCommerce site, the plugin offers (once, on the dashboard) to add where to buy to every product page. Each page's title is matched to the menus ("Choco Chunk Cookie" is the menus' "Choco Chunk 10mg"), and the page gets the dispensaries that carry that product, its price line and Product markup, and common questions. A page whose product no store carries is left as it is. Turn it on or off, and pick the post types, under Settings → fuzzy where to buy.

Questions shoppers ask: [fuzzy_faq brand="your-brand-slug" state="NJ"] prints "Where can I buy …?", "How much does … cost?", the most-carried products and the towns with the most stores, answered from live menus, with schema.org FAQPage markup. faq="1" on [fuzzy_where_to_buy] adds them under the list.

Sitemap dates: each page remembers when its list last changed (a store added or dropped, a price moved), and its date in the sitemap (WordPress's, Yoast's or Rank Math's) and in Yoast's page schema follows, so search engines come back when the menus change.

What lists show: under Settings → fuzzy where to buy, choose whether lists show prices (each store's shelf price, price ranges, and the price in search markup) and how many stores carry it, and which common questions to answer. Both are on by default. Any shortcode can override: prices="0", counts="0", questions="where,towns". In Elementor, the widget has the same two switches.

== Updates ==

New versions come from www.fuzzy.so and appear on the Plugins screen like any other plugin's update. Turn on "Enable auto-updates" for this plugin and it stays current with no one installing anything again. Most improvements to the list (its wording, layout and data) need no plugin update at all: they come with the list itself.

== Privacy ==

Visitors' browsers never contact fuzzy for the list: no cookies, no shopper identifiers. Your server sends the brand, the options above, your site's hostname and, on a single post or page, that page's address. Twice a day it also reads fuzzy's version file to check for plugin updates. With finder="1", the finder loads in a frame from www.fuzzy.so and uses the visitor's location only when they press Near me.

== Changelog ==

= 1.5.0 =
* Choose what lists show, site-wide or per shortcode: prices (prices="0"), store counts (counts="0") and which questions (questions="where,price,products,towns"). With prices off, no price appears anywhere, including the search markup.

= 1.4.0 =
* Product pages: where to buy, the price line and questions on every product page, matched by title. Off until someone turns it on (the dashboard notice or Settings → fuzzy where to buy).
* [fuzzy_faq], and faq="1" on [fuzzy_where_to_buy]: common questions answered from live menus, with FAQPage markup. The Elementor widget can show them too.
* The sitemap's date for a page moves when its list changes.
* On WooCommerce product pages, the dispensary offer joins WooCommerce's own Product markup instead of adding a second Product.

= 1.3.0 =
* [fuzzy_products]: your products with shelf prices and store counts, with schema.org Product markup. The Elementor widget gains a Show setting.
* "View details" on the Plugins screen now describes the plugin.

= 1.2.0 =
* Updates from www.fuzzy.so: new versions show on the Plugins screen, and auto-updates can be turned on.

= 1.1.0 =
* An expired list no longer makes the visitor wait: the last good copy is printed at once and a fresh one is fetched by WP-Cron in the background.
* The list's JSON-LD carries the page's URL on single posts and pages.

= 1.0.0 =
* First release.
