v0.39.0
Added
-
Product links you share now carry richer previews (#679).
- When a product is shared on social media or in a messaging app, the preview card now shows whether it's in stock, on backorder or sold out, plus its condition when you've set one, new, used or refurbished.
- On Twitter/X, the preview also shows price and stock as readable text beneath the image, matching what stores running Rank Math or the Yoast WooCommerce SEO add-on already show.
- The product photo's size is included too, so previews render at full size right away instead of sometimes needing to be measured first.
- Its description (the featured image's alt text) is included as well, for anyone using a screen reader.
- Nothing to set up. This is read from what you've already filled in: your product's stock status, its Condition attribute if it has one, and your featured image's alt text.
-
Your blog posts and pages now get share previews too (#680).
- On a store with no SEO plugin, sharing a post or page gave whoever received it a blank card: no title, no summary, no image. Your product pages have had these for a while; everything else had nothing.
- Posts and pages now carry a title, a summary taken from your excerpt or the post itself, your featured image, and a description for search results.
- Your store stays out of the way when Yoast, Rank Math, All in One SEO, SEOPress or Jetpack's social previews are already doing this. If you use Jetpack's SEO description without its social previews, you get the share card and keep Jetpack's description, with no duplication.
- Less common SEO plugins are not yet recognised, so if you run one of those you may see two sets of tags. Turning the plugin's metadata off in its settings avoids it, and wider detection is planned.
- Only posts and pages. Author and date archives are left alone, because a made-up summary there is worse than none.
Fixed
-
Search results on your store shared as a blank link, and could share worse than before (#692).
- Someone searching your shop and pasting that link into Slack or Facebook got no preview: no headline, no image, no summary.
- Search pages now get the same kind of preview as your Shop page, headlined with what was searched for, and page two of a long result list no longer claims to be page one.
- On a store using Jetpack's social previews, this was worse than nothing. Your store removed Jetpack's tags from search pages, because it normally replaces them with better ones, but on search it put nothing back. That page now gets a real preview instead.
- Search pages stay out of search-engine results exactly as before. That setting is about crawlers; this is about what people see when a link is shared.
-
Your Shop page could go out with no description at all (#682).
- Product and category pages each fall back to a generated description when you haven't written one. Your Shop page did not, so on a store with an empty tagline and an empty Shop page, which is how WooCommerce ships, it published none.
- It now falls back to naming what you sell, taken from your top product categories: "Shop Hoodies, Tees and Accessories at Saltwarp." Anything you wrote yourself still wins.
-
Page two of your Shop listing claimed to be page one when shared (#682).
- Every paginated Shop page published the same address and headline as the first, so sharing page two showed a preview of page one.
- Both now match the page you are actually on, and the headline agrees with the browser tab. Product category listings get the same fix.
- The shared address is also built from your shop's own permalink now, so sorting or filtering the page no longer changes the address it publishes to social networks.
-
A Shop page containing only a stray space published that as your description (#682).
- Opening your Shop page in the editor, pressing Enter and leaving stores an invisible character. Your store treated that as your description, published it, and skipped both your site tagline and the generated fallback beneath it.
- Leftovers from a deactivated plugin behaved the same way, so a shortcode could end up as your search-result snippet.
- Your store now looks for actual words before publishing anything, and falls through to the next candidate when it does not find any.
-
Your share previews are unaffected when another SEO plugin is installed but silent (#676).
- Rank Math is active from the moment you install it, but publishes nothing until you finish its setup wizard. Yoast and All in One SEO both have a switch that turns their share tags off, which people use when another plugin is handling them.
- In all three cases your store checks that the other plugin actually published something before standing its own tags down, rather than assuming it did because it is installed. If it published nothing, your store publishes its own.
- A free product's price is published as 0.00 rather than 0, because both Rank Math and All in One SEO discard a bare zero on the way out and the price would have vanished.
-
Rank Math and All in One SEO both described your product pages to social networks too (#676).
- Same fix as Yoast, through each plugin's own output rather than a second set of tags. Products are labelled as products; category, shop and search pages as ordinary pages.
- Rank Math was already close. It gets the price on products with options, which it leaves out, and the stock wording Pinterest reads, which it never emits.
- All in One SEO gets price, currency and stock, and its "article" labels are removed from your product and shop pages.
- One thing to know about All in One SEO: it publishes no share tags at all on a product category, so on those pages your store keeps publishing its own.
-
Yoast SEO and your store both described your product pages to social networks (#676).
- With Yoast active, your product, category and shop pages carried two sets of share tags, and Yoast's called every one of them an article. A product is not an article, and neither is a category listing.
- Your store now corrects that inside Yoast's own output rather than publishing a second set. Products are labelled as products, and category, shop and search pages as ordinary pages.
- The commerce facts Yoast leaves out are filled in beside its own: price, currency and stock. If you run the paid Yoast WooCommerce SEO add-on, it already supplies most of these and keeps supplying them; your store only adds what is missing, which on a product with options is the price.
- Yoast's "modified on" date is no longer attached to your product and shop pages. It describes an article, and these are not articles.
- Anything you wrote in Yoast's own SEO fields still wins, exactly as before.
-
SEOPress and your store both described your product pages to social networks (#676).
- With SEOPress active, every product, category and shop page carried two sets of share tags. Networks pick one, so previews looked fine at a glance, but which one you got was not yours to choose.
- Your store now stands SEOPress's social tags down on those pages and publishes its own, which carry the commerce details SEOPress does not: price, stock, and condition.
- Everything else SEOPress does is untouched. Your titles, canonical links, robots directives, meta descriptions and structured data are all still SEOPress's.
- Off commerce pages nothing changes. Your posts and pages are still described entirely by SEOPress.
- Your posts and pages are untouched. This applies only to product, category, shop and search pages.
-
Sharing your Shop page or a product category showed a blank preview (#683).
- The preview card was set up to display a large photo, but no photo was attached to it, so social networks and messaging apps fell back to showing a plain link.
- Your Shop page now uses its own featured image, the one on its edit screen in WordPress, and a product category uses the category image you set in WooCommerce.
- Where you haven't set either, your store picks one of your Featured products instead. That reads a choice you already made, so there is nothing new to fill in, and the picture stays put rather than changing as shoppers page through or re-sort the listing.
- If your store has no image to offer at all, the preview now asks for the small card format rather than promising a photo it cannot supply.
- The image's size is sent along too, so previews render at full size right away instead of sometimes needing to be measured first, and it is left out when your image library cannot report it rather than guessed at.
- Products without a featured image are covered by the same fix. They were asking for the large card too, with nothing to fill it. They now ask for the small one. Products that do have a featured image are unchanged.
-
Your meta description appeared twice when another SEO plugin was active (#669).
- With Yoast SEO, Rank Math, SEOPress or All in One SEO also running, your product, category and shop pages each carried two meta descriptions. Search engines pick one of them, so nothing broke outright, but validators flagged it and the only way to clear it was to deactivate one of the two plugins.
- Your store now checks whether the other SEO plugin is supplying a description for the page it is about to render, and stays quiet when it is. One description per page, whichever plugin wrote it, with nothing to deactivate.
- Where the other plugin supplies nothing, your store still publishes its own, keeping a description on the page in the common case: free Yoast with nothing filled in on most pages, and SEOPress on your Shop page, or on a product category you haven't written a category description for. One gap remains: some SEO plugins have a separate switch that turns descriptions off completely, and it can suppress the other plugin's tag after your store has already stayed quiet for it, leaving the page with none.
- Two things are unchanged. Social-share tags can still appear twice, which is tracked separately (#676). And your page title is still filled by the other SEO plugin while it is active, on every page except your shop listing under SEOPress.
-
The notice about overlapping SEO plugins never fired for free Yoast SEO or SEOPress (#669).
- It only recognized the paid Yoast WooCommerce SEO add-on, not the free Yoast plugin most stores actually run. Free Yoast produces the same duplicate tags, but never triggered the notice.
- SEOPress was not recognized at all, so stores running it never saw the notice either.
- The notice now covers free Yoast SEO and SEOPress, alongside Rank Math, All in One SEO, and the paid Yoast add-on it already covered.
- Free Yoast and its paid add-on are normally both active together, since the add-on requires the free plugin. You still see one notice naming Yoast, not two.
-
SEO titles and descriptions you wrote yourself were being thrown away on products and shop pages (#668).
- If you filled in the SEO fields on a product or on your Shop page, your store ignored them and published its own generated text instead. The fields looked live in the editor and did nothing.
- Your own words now win wherever you wrote them, on products and on the Shop page. Where you left them blank, your store generates a description as before. A description longer than search engines display is shortened, the same length limit your store already applied to generated descriptions.
- Titles are published as you wrote them, with two small exceptions. Any HTML you typed is shown as plain text rather than treated as markup, which is what keeps a stray tag from breaking the page. And on page two and beyond of your Shop listing, the page number is added at the end, exactly as WordPress does it, so each page has a distinct title.
- Your Shop page is the case that was most stuck: WooCommerce shows your product listing at that address, so the title and description on the page itself were never reachable. They work now. The share preview when someone posts your Shop page on social was already reading that page's description, which is why the problem was easy to miss.
- On a product where you wrote your own title, your store no longer appends the brand name to it. The brand is still published separately in the structured data assistants and search engines read.
-
Most AI traffic was recorded as "unknown" (#655).
- Assistants tell your store who they are with a header, and your store's own instructions showed the wrong spelling for it. Assistants that followed those instructions were filed as unknown, so your order attribution under-counted the ones behaving best.
- The instructions now show the exact text to send, both in the API reference and in the manifest assistants read at run time.
- Your store also now understands near-miss spellings instead of discarding them. Nothing verifies this header, so being strict never stopped anyone pretending to be ChatGPT. It only stopped honest assistants being counted, and meant your per-assistant allowlist choices were never applied to them.
- One consequence worth knowing: your settings now reach assistants they previously missed, in both directions. An assistant you had blocked is now actually blocked when it identifies itself sloppily, and an unrecognised assistant using one of those spellings is now refused rather than let through, unless you have allowed unknown assistants. Before this change a malformed header slipped past your settings entirely.
-
Searching by category returned nothing on stores with extensions installed (#660).
- A shopper's assistant asking for a "bag" was told the store had none, even with a bag sitting in your Bags category. Asking for the product by name still worked, so search looked healthy.
- Your store asked WordPress for the label sets belonging to products, but asked in a way that only accepted an exact answer. Once another plugin attached one of those sets to anything else, it dropped out of search silently.
- Any of categories, tags, brands or attributes like size and colour can be affected. Which ones break depends on what else you have installed. Filtering by category from the API kept working throughout, which is why this was easy to miss.
-
Out-of-stock products were offered to AI assistants as available (#658).
- WooCommerce tracks stock in two places, and for some products they disagree. A variable product whose every option is unavailable still reports "in stock" internally, while your storefront correctly shows shoppers "Out of stock".
- Your store was sending assistants the internal answer. An assistant could recommend something a shopper then couldn't buy.
- Availability now follows what your product page shows. Products you sell through an external link are unaffected — they stay available, because they can still be bought, just not on your site.
-
Products with no price were offered to AI assistants as free (#658).
- A product you never set a price on was sent to assistants quoted at $0.00. The commerce standard treats a price of zero as a genuine "this is free", so an assistant reading it would tell a shopper the item costs nothing.
- WooCommerce reports "no price set" and "priced at zero" identically to the API, so there was no way to tell the two apart — and no way for a response to say "price unknown" at all.
- Products with no price are now left out of your store's commerce-standard catalog and MCP connection, not every surface that lists your products. Search skips them; a direct lookup gets an explanation instead of a price. Products you have genuinely priced at zero are unaffected.
- Set a price on the product and it reappears for assistants immediately. Nothing else about your store changes.
-
The plugin listing said it had no MCP support, while shipping an MCP server that's on by default (#653).
- The FAQ answered "Not currently" and explained why a plugin couldn't run one. The plugin has run a public MCP server for shopping agents for several releases.
- Merchants reading the listing had no way to know the feature existed, or that it was already switched on.
- The FAQ now describes what actually ships, and points at the setting that turns it off.
-
AI assistants that follow the commerce standard couldn't use your MCP connection (#651).
- The three tools your store offers over MCP were named back-to-front compared with the Universal Commerce Protocol standard —
catalog_searchwhere the standard sayssearch_catalog. - Assistants that go by the standard's names, rather than asking your store what it offers, decided your store had no catalog and gave up before sending a single search. Shopify's own UCP client did exactly that.
- The tools are now named
search_catalog,lookup_catalogandcreate_checkout. - The MCP connection is on by default, so every store with syndication switched on starts serving the new names as soon as it upgrades.
- Assistants that ask your store what it offers pick the new names up on their own. You don't need to do anything.
- The three tools your store offers over MCP were named back-to-front compared with the Universal Commerce Protocol standard —
-
Agents could only ever see the first ten products (#656, #659).
- The API reference told agents to page with
pageandper_page. The code readslimitandcursor, so paging silently did nothing and every request returned the same first ten products. - The brand filter was documented as
brandsbut read asbrand, so brand filtering silently did nothing too. - Sorting had the same problem: the reference said
sort.order, the code readssort.direction. A missing direction falls back to ascending, so cheapest-first happened to come out right — and asking for most expensive first returned cheapest first, the exact opposite of the request. - The reference also listed a
relevancesort option that never existed. Asking for it quietly fell back to default ordering. The real options are now documented: price, title, date, newest, popularity, rating and menu order. - The reference now matches the code, and unknown keys inside
filters,pagination, andsortcome back in theX-WC-AI-Storefront-Unknown-Paramsheader instead of vanishing. Browsers can now read that header cross-origin, which they previously could not. - Assistants connected over MCP get the same list. MCP has no response headers, so the unrecognized names come back as a warning in the response — named, so the assistant can correct the call rather than just learn something went wrong.
- The API reference told agents to page with