{"id":339435,"date":"2026-07-16T12:34:47","date_gmt":"2026-07-16T12:34:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/product-markdown-mirror\/"},"modified":"2026-07-16T12:34:16","modified_gmt":"2026-07-16T12:34:16","slug":"markdown-mirror-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/markdown-mirror-for-woocommerce\/","author":15678212,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Markdown Mirror for WooCommerce","header_author":"AgentMint","header_description":"Serves read-only Markdown mirrors of WooCommerce product pages at {product-url}.md with rel=\"alternate\" discovery. No tracking, no store writes.","assets_banners_color":"2751a3","last_updated":"2026-07-16 12:34:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/agentmint.net\/blueprints\/product-markdown-mirror\/","header_author_uri":"https:\/\/agentmint.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":16,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"abdalsalaam","date":"2026-07-16 12:34:16"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3610231,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3610231,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3610231,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3610231,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3610231,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3610231,"resolution":"1","location":"assets","locale":"","width":2560,"height":1920},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3610231,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3610231,"resolution":"3","location":"assets","locale":"","width":2560,"height":960}},"screenshots":{"1":"The Markdown mirrors section under WooCommerce, Settings, Products.","2":"A product mirror served as text\/markdown in the browser.","3":"A category mirror with its paginated product list in the browser."}},"plugin_section":[],"plugin_tags":[246305,247962,4608,702,286],"plugin_category":[45],"plugin_contributors":[217865],"plugin_business_model":[],"class_list":["post-339435","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-agents","plugin_tags-machine-readable","plugin_tags-markdown","plugin_tags-products","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-abdalsalaam","plugin_committers-abdalsalaam"],"banners":{"banner":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/banner-772x250.png?rev=3610231","banner_2x":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/banner-1544x500.png?rev=3610231","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/icon.svg?rev=3610231","icon":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/icon.svg?rev=3610231","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/screenshot-1.png?rev=3610231","caption":"The Markdown mirrors section under WooCommerce, Settings, Products."},{"src":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/screenshot-2.png?rev=3610231","caption":"A product mirror served as text\/markdown in the browser."},{"src":"https:\/\/ps.w.org\/markdown-mirror-for-woocommerce\/assets\/screenshot-3.png?rev=3610231","caption":"A category mirror with its paginated product list in the browser."}],"raw_content":"<!--section=description-->\n<p>Markdown Mirror for WooCommerce serves a plain Markdown copy of each WooCommerce product page at the product URL plus a <code>.md<\/code> 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.<\/p>\n\n<p>Example: <code>https:\/\/example.com\/product\/ceramic-dripper\/<\/code> also serves <code>https:\/\/example.com\/product\/ceramic-dripper.md<\/code>.<\/p>\n\n<p><strong>What each mirror contains<\/strong><\/p>\n\n<ul>\n<li>The product name and a one-line factual summary<\/li>\n<li>Identifiers: GTIN (WooCommerce's core field), SKU, brand<\/li>\n<li>Classification: categories as hierarchical paths and tags, each linked to its archive (or its .md mirror when taxonomy mirrors are enabled)<\/li>\n<li>Specifications: visible attributes, weight, dimensions<\/li>\n<li>Price with currency, sale end dates, and the store's tax display<\/li>\n<li>Availability with the store's own stock display (quantities appear exactly when your store shows them), and per-variation lines for variable products<\/li>\n<li>Reviews: the real average rating and review count, only when reviews exist<\/li>\n<li>Images: main and gallery image URLs with their alt text<\/li>\n<li>The product short and full descriptions as plain text (optional, on by default)<\/li>\n<li>A canonical link back to the product page and the real last-updated date<\/li>\n<\/ul>\n\n<p>Sections with no data are omitted, never padded. Every mirror sends a canonical <code>Link<\/code> header pointing at your HTML page and an <code>X-Robots-Tag: noindex<\/code> header, so the mirror never competes with your product page in search. Each product page also gets one <code>rel=\"alternate\"<\/code> link tag so agents can discover the mirror.<\/p>\n\n<p><strong>Taxonomy mirrors<\/strong><\/p>\n\n<p>Product categories (including hierarchical paths like <code>\/product-category\/clothing\/shirts.md<\/code>), brands, and tags get <code>.md<\/code> 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 <code>\/page\/2.md<\/code>, <code>\/page\/3.md<\/code>, 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.<\/p>\n\n<p><strong>You choose what mirrors carry<\/strong><\/p>\n\n<p>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.<\/p>\n\n<p><strong>What this plugin never does<\/strong><\/p>\n\n<ul>\n<li>It never writes to your products, your theme, or your database content. Mirrors are virtual URLs, generated on request and cached.<\/li>\n<li>It never sends anything anywhere. No telemetry, no analytics, no remote requests, no tracking of you or your shoppers.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>Requirements<\/strong><\/p>\n\n<ul>\n<li>WooCommerce 9.2 or newer<\/li>\n<li>Pretty permalinks (Settings, Permalinks, anything except Plain)<\/li>\n<\/ul>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li><code>mdmirwc_is_mirrored<\/code> - exclude products from mirroring<\/li>\n<li><code>mdmirwc_sections<\/code> - add or reorder document sections (for example shipping data your site actually holds)<\/li>\n<li><code>mdmirwc_document<\/code> - filter the final document<\/li>\n<li><code>mdmirwc_cache_max_age<\/code> - HTTP Cache-Control max-age (default 300 seconds)<\/li>\n<li><code>mdmirwc_cache_ttl<\/code> - server-side cache TTL (default one hour; invalidation hooks keep mirrors correct regardless)<\/li>\n<li><code>mdmirwc_max_variants<\/code> - variant lines cap (default 50, disclosed in output when applied)<\/li>\n<li><code>mdmirwc_conflicting_plugins<\/code> - the known list of other .md-serving plugins<\/li>\n<li><code>mdmirwc_term_is_mirrored<\/code> - exclude term archives from mirroring<\/li>\n<li><code>mdmirwc_term_sections<\/code> \/ <code>mdmirwc_term_document<\/code> - extend or filter term mirror documents<\/li>\n<li><code>mdmirwc_term_page_size<\/code> - products per term mirror page (default 100)<\/li>\n<li><code>mdmirwc_term_cache_max_age<\/code> \/ <code>mdmirwc_term_cache_ttl<\/code> - term mirror cache controls<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20is%20my%20product%27s%20mirror%3F\"><h3>Where is my product's mirror?<\/h3><\/dt>\n<dd><p>Take the product page URL, remove the trailing slash, and add <code>.md<\/code>. The product page's HTML head also carries a <code>link rel=\"alternate\" type=\"text\/markdown\"<\/code> tag pointing at it.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20send%20my%20data%20anywhere%3F\"><h3>Does this plugin send my data anywhere?<\/h3><\/dt>\n<dd><p>No. It makes zero remote requests. Everything is generated inside your site and served from your site.<\/p><\/dd>\n<dt id=\"will%20this%20improve%20my%20ai%20or%20search%20rankings%3F\"><h3>Will this improve my AI or search rankings?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"why%20does%20the%20mirror%20not%20show%20shipping%20or%20return%20details%3F\"><h3>Why does the mirror not show shipping or return details?<\/h3><\/dt>\n<dd><p>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 <code>mdmirwc_sections<\/code> filter.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20plain%20permalinks%3F\"><h3>Does it work with Plain permalinks?<\/h3><\/dt>\n<dd><p>No. The <code>.md<\/code> URLs need pretty permalinks (Settings, Permalinks). Nearly all WooCommerce stores already use them.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20my%20seo%20plugin%3F\"><h3>Will it conflict with my SEO plugin?<\/h3><\/dt>\n<dd><p>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 <code>.md<\/code> 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.<\/p><\/dd>\n<dt id=\"are%20password-protected%2C%20draft%2C%20or%20hidden%20products%20mirrored%3F\"><h3>Are password-protected, draft, or hidden products mirrored?<\/h3><\/dt>\n<dd><p>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 <code>mdmirwc_is_mirrored<\/code> filter to exclude specific products.<\/p><\/dd>\n<dt id=\"where%20are%20the%20settings%3F\"><h3>Where are the settings?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20choose%20what%20the%20mirror%20contains%3F\"><h3>Can I choose what the mirror contains?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20does%20pagination%20work%20on%20term%20mirrors%3F\"><h3>How does pagination work on term mirrors?<\/h3><\/dt>\n<dd><p>Each term mirror lists up to 100 products per page and links the next page (<code>...\/your-category\/page\/2.md<\/code>). Every page states \"page N of M\", so nothing is ever silently cut off. Pages past the last one return 404.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%3F\"><h3>What happens when I uninstall?<\/h3><\/dt>\n<dd><p>Everything the plugin stored is removed: settings, cached mirrors, term cache versions, on every site of a multisite network. Nothing else is touched.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>","raw_excerpt":"Serve read-only Markdown mirrors of your WooCommerce product pages at {product-url}.md. No tracking, no store writes, honest by design.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/339435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=339435"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abdalsalaam"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=339435"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=339435"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=339435"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=339435"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=339435"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=339435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}