Title: Markdown Mirror for WooCommerce
Author: Abdalsalaam Halawa
Published: <strong>July 16, 2026</strong>
Last modified: July 16, 2026

---

Search plugins

![](https://ps.w.org/markdown-mirror-for-woocommerce/assets/banner-772x250.png?rev
=3610231)

![](https://ps.w.org/markdown-mirror-for-woocommerce/assets/icon.svg?rev=3610231)

# Markdown Mirror for WooCommerce

 By [Abdalsalaam Halawa](https://profiles.wordpress.org/abdalsalaam/)

[Download](https://downloads.wordpress.org/plugin/markdown-mirror-for-woocommerce.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/markdown-mirror-for-woocommerce/#description)
 * [Reviews](https://wordpress.org/plugins/markdown-mirror-for-woocommerce/#reviews)
 * [Development](https://wordpress.org/plugins/markdown-mirror-for-woocommerce/#developers)

 [Support](https://wordpress.org/support/plugin/markdown-mirror-for-woocommerce/)

## Description

Markdown Mirror for WooCommerce serves a plain Markdown copy of each WooCommerce
product page at the product URL plus a `.md` suffix. AI agents and crawlers that
prefer token-light text get the same facts your product page shows, ordered so the
decision-relevant data comes first: identifiers, specifications, price, availability,
variants.

Example: `https://example.com/product/ceramic-dripper/` also serves `https://example.
com/product/ceramic-dripper.md`.

**What each mirror contains**

 * The product name and a one-line factual summary
 * Identifiers: GTIN (WooCommerce’s core field), SKU, brand
 * Classification: categories as hierarchical paths and tags, each linked to its
   archive (or its .md mirror when taxonomy mirrors are enabled)
 * Specifications: visible attributes, weight, dimensions
 * Price with currency, sale end dates, and the store’s tax display
 * Availability with the store’s own stock display (quantities appear exactly when
   your store shows them), and per-variation lines for variable products
 * Reviews: the real average rating and review count, only when reviews exist
 * Images: main and gallery image URLs with their alt text
 * The product short and full descriptions as plain text (optional, on by default)
 * A canonical link back to the product page and the real last-updated date

Sections with no data are omitted, never padded. Every mirror sends a canonical `
Link` header pointing at your HTML page and an `X-Robots-Tag: noindex` header, so
the mirror never competes with your product page in search. Each product page also
gets one `rel="alternate"` link tag so agents can discover the mirror.

**Taxonomy mirrors**

Product categories (including hierarchical paths like `/product-category/clothing/
shirts.md`), brands, and tags get `.md` mirrors of their archive pages too, each
behind its own toggle. Each term mirror carries the term name and description, subcategories
with their own mirror links, and a paginated product list (100 per page at `/page/
2.md`, `/page/3.md`, and so on, with previous/next links stated in the document;
never silent truncation). Term mirrors follow archive visibility rules, so catalog-
hidden products stay out, exactly as on the archive page itself. Because terms carry
no honest modified date, term mirrors send no Last-Modified header and print no 
fabricated freshness date.

**You choose what mirrors carry**

Everything is on by default. In WooCommerce, Settings, Products, Markdown mirrors
you can switch off any product mirror section (identifiers, classification, specifications,
price, availability, variants, reviews, images, short description, full description)
and any taxonomy mirror group. Sections with no data are always omitted automatically.

**What this plugin never does**

 * It never writes to your products, your theme, or your database content. Mirrors
   are virtual URLs, generated on request and cached.
 * It never sends anything anywhere. No telemetry, no analytics, no remote requests,
   no tracking of you or your shoppers.
 * It never lets the mirror say something your page does not. There is no setting
   for “agent-only” content, on purpose: the mirror always reflects the same product
   data your shoppers see. Serving different content to agents than to humans is
   cloaking, and this plugin makes it structurally impossible.

**Requirements**

 * WooCommerce 9.2 or newer
 * Pretty permalinks (Settings, Permalinks, anything except Plain)

**For developers**

 * `mdmirwc_is_mirrored` – exclude products from mirroring
 * `mdmirwc_sections` – add or reorder document sections (for example shipping data
   your site actually holds)
 * `mdmirwc_document` – filter the final document
 * `mdmirwc_cache_max_age` – HTTP Cache-Control max-age (default 300 seconds)
 * `mdmirwc_cache_ttl` – server-side cache TTL (default one hour; invalidation hooks
   keep mirrors correct regardless)
 * `mdmirwc_max_variants` – variant lines cap (default 50, disclosed in output when
   applied)
 * `mdmirwc_conflicting_plugins` – the known list of other .md-serving plugins
 * `mdmirwc_term_is_mirrored` – exclude term archives from mirroring
 * `mdmirwc_term_sections` / `mdmirwc_term_document` – extend or filter term mirror
   documents
 * `mdmirwc_term_page_size` – products per term mirror page (default 100)
 * `mdmirwc_term_cache_max_age` / `mdmirwc_term_cache_ttl` – term mirror cache controls

## Screenshots

[⌊The Markdown mirrors section under WooCommerce, Settings, Products.⌉⌊The Markdown
mirrors section under WooCommerce, Settings, Products.⌉[

The Markdown mirrors section under WooCommerce, Settings, Products.

[⌊A product mirror served as text/markdown in the browser.⌉⌊A product mirror served
as text/markdown in the browser.⌉[

A product mirror served as text/markdown in the browser.

[⌊A category mirror with its paginated product list in the browser.⌉⌊A category 
mirror with its paginated product list in the browser.⌉[

A category mirror with its paginated product list in the browser.

## FAQ

### Where is my product’s mirror?

Take the product page URL, remove the trailing slash, and add `.md`. The product
page’s HTML head also carries a `link rel="alternate" type="text/markdown"` tag 
pointing at it.

### Does this plugin send my data anywhere?

No. It makes zero remote requests. Everything is generated inside your site and 
served from your site.

### Will this improve my AI or search rankings?

Honestly: nobody can promise that, and this plugin does not. No shopping agent documents
fetching product Markdown today. The mirror is cheap to serve and standards-shaped;
treat it as groundwork.

### Why does the mirror not show shipping or return details?

WooCommerce holds no single honest answer for shipping cost or return terms at product
level, and this plugin never invents data. Developers can add sections from data
their site actually holds via the `mdmirwc_sections` filter.

### Does it work with Plain permalinks?

No. The `.md` URLs need pretty permalinks (Settings, Permalinks). Nearly all WooCommerce
stores already use them.

### Will it conflict with my SEO plugin?

No. The plugin emits no schema, changes no canonicals or titles, and adds exactly
one link tag to product pages. If another active plugin also serves `.md` URLs, 
the Status row on the plugin’s settings screen reports the conflict, names the other
plugin, and explains why you should keep only one. The plugin adds no admin notices.

### Are password-protected, draft, or hidden products mirrored?

Password-protected and unpublished products are never mirrored (their mirror URLs
return 404). Catalog-hidden products still have public pages in WooCommerce, so 
they mirror; use the `mdmirwc_is_mirrored` filter to exclude specific products.

### Where are the settings?

WooCommerce, Settings, Products, Markdown mirrors. There is also a Settings link
right on the plugin’s row in your plugins list. Everything is on by default; uncheck
what you do not want. Brand options appear only when your store has the brands taxonomy.

### Can I choose what the mirror contains?

Yes. Every product mirror section has its own checkbox (identifiers, classification,
specifications, price, availability, variants, reviews, images, and the short and
full descriptions), and each taxonomy group has its own toggle. Turning a section
off only omits it; nothing can make a mirror say something your page does not.

### How does pagination work on term mirrors?

Each term mirror lists up to 100 products per page and links the next page (`.../
your-category/page/2.md`). Every page states “page N of M”, so nothing is ever silently
cut off. Pages past the last one return 404.

### What happens when I uninstall?

Everything the plugin stored is removed: settings, cached mirrors, term cache versions,
on every site of a multisite network. Nothing else is touched.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Markdown Mirror for WooCommerce” is open source software. The following people 
have contributed to this plugin.

Contributors

 *   [ Abdalsalaam Halawa ](https://profiles.wordpress.org/abdalsalaam/)

[Translate “Markdown Mirror for WooCommerce” into your language.](https://translate.wordpress.org/projects/wp-plugins/markdown-mirror-for-woocommerce)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/markdown-mirror-for-woocommerce/),
check out the [SVN repository](https://plugins.svn.wordpress.org/markdown-mirror-for-woocommerce/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/markdown-mirror-for-woocommerce/)
by [RSS](https://plugins.trac.wordpress.org/log/markdown-mirror-for-woocommerce/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * Initial release: product mirrors at {product-url}.md carrying identifiers, classification,
   specifications, price, availability, variants, reviews, images, and descriptions,
   with rel=alternate discovery, canonical and noindex headers, short-TTL caching
   with full invalidation, conflict detection, and complete uninstall.
 * Taxonomy mirrors for product categories (hierarchical paths included), brands,
   and tags with paginated product lists (100 per page, previous/next links, honest
   404 past the last page) and precise cache invalidation.
 * Native settings section under WooCommerce, Settings, Products with per-section
   content control and a Status row reporting .md-serving conflicts (no admin notices);
   everything on by default; Settings link on the plugins screen.

## Meta

 *  Version **1.0.0**
 *  Last updated **7 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [ai agents](https://wordpress.org/plugins/tags/ai-agents/)[machine-readable](https://wordpress.org/plugins/tags/machine-readable/)
   [markdown](https://wordpress.org/plugins/tags/markdown/)[products](https://wordpress.org/plugins/tags/products/)
   [woocommerce](https://wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://wordpress.org/plugins/markdown-mirror-for-woocommerce/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/markdown-mirror-for-woocommerce/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/markdown-mirror-for-woocommerce/reviews/)

## Contributors

 *   [ Abdalsalaam Halawa ](https://profiles.wordpress.org/abdalsalaam/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/markdown-mirror-for-woocommerce/)