{"id":324227,"date":"2026-06-14T13:07:49","date_gmt":"2026-06-14T13:07:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/agentic-storefront-for-publishers\/"},"modified":"2026-06-14T13:07:32","modified_gmt":"2026-06-14T13:07:32","slug":"xpay-agentic-commerce-for-publishers","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/xpay-agentic-commerce-for-publishers\/","author":23500773,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.3","stable_tag":"0.4.3","tested":"7.0","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"xpay\u2726 Agentic Commerce for Publishers","header_author":"xpay","header_description":"Contextual product recommendations for content publishers. Renders a recommendation widget via shortcode or Gutenberg block, and publishes an agent-readable product feed at \/.well-known\/agent-storefront.json so AI assistants can discover and recommend products from your site.","assets_banners_color":"28b58a","last_updated":"2026-06-14 13:07:32","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.xpay.sh\/publishers\/wordpress-plugin\/","header_author_uri":"https:\/\/www.xpay.sh","rating":0,"author_block_rating":0,"active_installs":0,"downloads":23,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.3":{"tag":"0.4.3","author":"xpaysh","date":"2026-06-14 13:07:32"}},"upgrade_notice":{"0.4.3":"<p>New URL-pattern targeting for the site-wide widget: narrow to specific paths or disable entirely from Settings.<\/p>","0.4.1":"<p>Connect-return now accepts both new and legacy query parameters from the onboard page. Plugin-check warnings cleared.<\/p>","0.4.0":"<p>Renamed plugin (new slug). Native settings screen replaces the embedded iframe. Auto-inject removed \u2014 use shortcode or block to place the widget.<\/p>","0.3.6":"<p>Pre-WP.org-submit polish. No behavioural change.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3572002,"resolution":"128x128","location":"assets","locale":"","width":256,"height":256},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3572002,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3572002,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3572002,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"xpay\/recommendations":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"xpay\/recommendations","title":"Recommendations","description":"Contextual product recommendations for this post.","category":"widgets","icon":"products","keywords":["recommendations","products","affiliate","xpay"],"textdomain":"xpay-agentic-commerce-for-publishers","supports":{"html":false,"align":["wide","full"]},"attributes":{"title":{"type":"string","default":""},"limit":{"type":"number","default":3},"layout":{"type":"string","default":"cards"}},"editorScript":"file:.\/index.js"}},"tagged_versions":["0.4.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Native WordPress settings screen with brand-safety, Amazon Associates and emitter toggles.","2":"Recommendations block in the editor.","3":"Front-end recommendation widget rendered by the shortcode."}},"plugin_section":[],"plugin_tags":[369,267091,2353,239487,3669],"plugin_category":[35,53],"plugin_contributors":[265642],"plugin_business_model":[],"class_list":["post-324227","plugin","type-plugin","status-publish","hentry","plugin_tags-affiliate","plugin_tags-agentic","plugin_tags-ai","plugin_tags-llms","plugin_tags-recommendations","plugin_category-advertising","plugin_category-ratings-and-reviews","plugin_contributors-xpaysh","plugin_committers-xpaysh"],"banners":{"banner":"https:\/\/ps.w.org\/xpay-agentic-commerce-for-publishers\/assets\/banner-772x250.png?rev=3572002","banner_2x":"https:\/\/ps.w.org\/xpay-agentic-commerce-for-publishers\/assets\/banner-1544x500.png?rev=3572002","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/xpay-agentic-commerce-for-publishers\/assets\/icon-128x128.png?rev=3572002","icon_2x":"https:\/\/ps.w.org\/xpay-agentic-commerce-for-publishers\/assets\/icon-256x256.png?rev=3572002","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Plugin landing page:<\/strong> https:\/\/www.xpay.sh\/publishers\/wordpress-plugin\/ \u00b7 <strong>Documentation:<\/strong> https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin \u00b7 <strong>Source code:<\/strong> https:\/\/github.com\/xpaysh\/xpay-agentic-commerce-for-publishers<\/p>\n\n<p><strong>Your readers are increasingly arriving from ChatGPT, Claude, Gemini and Perplexity.<\/strong> They are also still arriving the usual way. xpay\u2726 Agentic Commerce helps you serve both at once.<\/p>\n\n<p>For human readers, the plugin loads a lightweight recommendation widget (a floating button + a footer drawer) on your connected site \u2014 install once, works on every page, no shortcode required. You can narrow the widget to a subset of paths or disable site-wide loading entirely in the settings. For inline placement inside a specific post, use the <code>[xpay_recs]<\/code> shortcode or the Recommendations Gutenberg block. The plugin never modifies your post content directly \u2014 recommendations live in a sandboxed iframe hosted at <code>widget.xpay.sh<\/code>, sets no third-party cookies, and uses no behavioural targeting.<\/p>\n\n<p>For AI assistants and agents, the plugin publishes a single endpoint at <code>\/.well-known\/agent-storefront.json<\/code> that lists products contextually relevant to your site. Agents that fetch it can discover and (where the underlying merchants support it) transact, with the resulting referral attributed back to your site.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Site-wide widget (floating button + footer drawer)<\/strong> \u2014 loads on every page of your connected site by default. Disable site-wide loading entirely, or narrow it to matching paths only, from Settings \u2192 xpay Agentic Commerce \u2192 \"Where the widget loads\". URL patterns support <code>*<\/code> wildcards (PostHog-style).<\/li>\n<li><strong>Inline placement<\/strong> \u2014 shortcode <code>[xpay_recs]<\/code> and a Gutenberg block for placing a product-card grid inside a specific post. Independent of the site-wide widget. The plugin never modifies post content via <code>the_content<\/code> \u2014 placement is always explicit.<\/li>\n<li><strong>Privacy-first<\/strong> \u2014 the plugin sets no third-party cookies and emits no tracking pixels. The decision API receives only the public URL, post title, public categories and tags. Personalization is off unless you turn it on and a Consent API plugin reports positive consent.<\/li>\n<li><strong>Agent storefront endpoint<\/strong> \u2014 publishes <code>\/.well-known\/agent-storefront.json<\/code> so AI assistants can list products contextually relevant to the page they are reading. Detects existing <code>.well-known<\/code> files and refuses to overwrite them.<\/li>\n<li><strong>Optional <code>llms.txt<\/code> augmentation<\/strong> \u2014 append a clearly-delimited block to your <code>llms.txt<\/code>, only if you have opted in. Never replaces an existing <code>llms.txt<\/code>.<\/li>\n<li><strong>Brand-safety controls<\/strong> \u2014 exclude product categories and merchant domains directly from the native settings screen.<\/li>\n<li><strong>Amazon Associates<\/strong> \u2014 set your Amazon Associates tag. Any Amazon link the widget surfaces gets <code>?tag=&lt;yours&gt;<\/code> appended. Amazon pays you directly.<\/li>\n<li><strong>Native WordPress settings screen<\/strong> \u2014 all configuration happens inside a standard wp-admin settings page (Settings \u2192 xpay Agentic Commerce). No remote UI, no embedded admin iframe.<\/li>\n<\/ul>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li><strong>It does not modify your post content.<\/strong> The plugin never hooks <code>the_content<\/code> or rewrites your post bodies. The site-wide widget lives in page chrome (floating button + drawer); inline placement requires an explicit shortcode or block.<\/li>\n<li><strong>It does not collect visitor identifiers.<\/strong> The plugin sets no cookies on your site and emits no tracking pixels.<\/li>\n<li><strong>It does not change your existing themes, posts or templates.<\/strong><\/li>\n<li><strong>It does not require a merchant relationship.<\/strong> Publishers can install and connect with no e-commerce site of their own.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>This plugin contacts services operated by xpay (xpay.sh).<\/p>\n\n<p><strong>1. <code>publisher-api.xpay.sh<\/code><\/strong> \u2014 backend API.<\/p>\n\n<ul>\n<li><code>POST \/storefront\/decide<\/code> \u2014 recommendation decision API. The widget iframe (front-end) calls this when it renders. Data sent: page URL, title, categories, tags, <code>site_id<\/code>. No visitor identifier.<\/li>\n<li><code>POST \/storefront\/beacon<\/code> \u2014 load\/click event endpoint. The widget iframe fires this anonymously when it mounts (load) and when a reader clicks a product card (click). Data sent: <code>site_id<\/code>, hostname, post URL, merchant domain (on click), user-agent string. No visitor identifier.<\/li>\n<li><code>POST \/storefront\/register<\/code> \u2014 registration endpoint. Called once from the <code>app.xpay.sh<\/code> onboard page during one-click connect to mint a <code>site_id<\/code>.<\/li>\n<li><code>GET \/storefront\/agent-card\/{site_id}<\/code> \u2014 server-to-server call from your WordPress install to build the <code>\/.well-known\/agent-storefront.json<\/code> response.<\/li>\n<li><code>GET \/storefront\/sites<\/code> \u2014 used by the publisher dashboard at <code>app.xpay.sh<\/code>, not by this plugin.<\/li>\n<\/ul>\n\n<p><strong>2. <code>widget.xpay.sh<\/code><\/strong> \u2014 sandboxed iframe host for the front-end widget. Loaded only on posts where you place the <code>[xpay_recs]<\/code> shortcode or the Recommendations block, and only when consent allows. Data passed via URL parameters: <code>site_id<\/code>, post URL, title, public categories, public tags. No visitor identifier.<\/p>\n\n<p><strong>3. <code>app.xpay.sh<\/code><\/strong> \u2014 publisher dashboard. Opened in a new tab from the settings page (a button labelled \"Open xpay dashboard\"). Never embedded.<\/p>\n\n<p>The xpay terms of use and privacy policy: https:\/\/www.xpay.sh\/legal\/terms-of-use\/ and https:\/\/www.xpay.sh\/legal\/privacy-policy\/.<\/p>\n\n<h4>Privacy<\/h4>\n\n<ul>\n<li><strong>No third-party cookies, no tracking pixels.<\/strong> The plugin sets no cookies and emits no tracking pixels on your site.<\/li>\n<li><strong>Page-context only, no visitor identifiers.<\/strong> The decision API and beacons receive only the public URL of the page, its public title, and its public categories and tags \u2014 the same data already in your HTML for search engines.<\/li>\n<li><strong>Iframe sandbox isolation.<\/strong> The front-end widget renders inside a sandboxed iframe loaded from <code>widget.xpay.sh<\/code>. The host page and the iframe are separate browsing contexts that cannot read each other.<\/li>\n<li><strong>WP Consent API integration.<\/strong> When the WP Consent API plugin is installed and reports a hard \"no\" for marketing consent, the widget iframe does not render.<\/li>\n<li><strong>All settings stored locally.<\/strong> Your Amazon Associates tag, excluded categories, excluded domains and toggles are stored in WordPress <code>wp_options<\/code>. They are not copied to xpay's backend.<\/li>\n<li><strong>Cleanup on uninstall.<\/strong> Deleting the plugin removes every <code>wp_options<\/code> row it created and disables the agent storefront endpoint.<\/li>\n<\/ul>\n\n<h4>Where the recommended products come from<\/h4>\n\n<p>The recommendation engine uses a curated catalog of merchants from xpay's own merchant network, with affiliate-network fallbacks. The agent storefront endpoint only lists products from agent-ready merchants, since those are the only ones an AI assistant can transact with.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from this directory or upload the ZIP via Plugins \u2192 Add New \u2192 Upload.<\/li>\n<li>Activate. You will be taken to <strong>Settings \u2192 xpay Agentic Commerce<\/strong>.<\/li>\n<li>Click <strong>Connect site<\/strong>. A new browser tab opens on xpay.sh and returns you here with a <code>site_id<\/code> written into your settings.<\/li>\n<li>To show recommendations on a post, add the <code>[xpay_recs]<\/code> shortcode or insert the <strong>Recommendations<\/strong> block in the editor. The widget renders only where you place it.<\/li>\n<li>(Optional) Enable the agent storefront endpoint to allow AI assistants to discover products from your site.<\/li>\n<\/ol>\n\n<p>Detailed step-by-step with screenshots:<\/p>\n\n<ul>\n<li><strong>Installing the plugin<\/strong> \u2014 https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin\/installing<\/li>\n<li><strong>Connecting your site<\/strong> \u2014 https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin\/connecting<\/li>\n<li><strong>Placing the widget<\/strong> \u2014 https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin\/using<\/li>\n<li><strong>Settings reference<\/strong> \u2014 https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin\/settings<\/li>\n<li><strong>Troubleshooting<\/strong> \u2014 https:\/\/docs.xpay.sh\/en\/publishers\/wordpress-plugin\/troubleshooting<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20slow%20down%20my%20site%3F\"><h3>Does this plugin slow down my site?<\/h3><\/dt>\n<dd><p>The plugin itself enqueues no front-end scripts unless a post actually contains the shortcode or block. The widget iframe loads lazily \u2014 one network round-trip, async after the page is interactive. The agent endpoint is served server-side without touching the front-end.<\/p><\/dd>\n<dt id=\"does%20it%20conflict%20with%20my%20ad%20network%20%28mediavine%2C%20raptive%2C%20ezoic%29%3F\"><h3>Does it conflict with my ad network (Mediavine, Raptive, Ezoic)?<\/h3><\/dt>\n<dd><p>The widget renders as editorial product cards with affiliate-link buy buttons, not as advertising, and only appears where you explicitly place it. Most ad networks permit such widgets in parallel. Always verify against your specific ad-network agreement before going live.<\/p><\/dd>\n<dt id=\"why%20is%20the%20front-end%20widget%20rendered%20in%20an%20iframe%3F\"><h3>Why is the front-end widget rendered in an iframe?<\/h3><\/dt>\n<dd><p>Two reasons. (1) The widget UI iterates quickly at <code>widget.xpay.sh<\/code> \u2014 iframing means we don't ship a WordPress plugin update every time the UI improves. (2) The iframe is a separate browsing context: the host page can't read into it, and it can't read into the host page. That's strong privacy isolation for a third-party recommendation widget.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>Yes \u2014 this plugin has no dependency on WooCommerce. It is designed for content publishers without their own store.<\/p><\/dd>\n<dt id=\"how%20does%20the%20agent%20storefront%20endpoint%20work%3F\"><h3>How does the agent storefront endpoint work?<\/h3><\/dt>\n<dd><p>After you enable it in settings, your site serves <code>https:\/\/your-site.example\/.well-known\/agent-storefront.json<\/code> with a list of products an AI assistant can recommend. The list is generated server-side. The plugin will not overwrite an existing file at that path \u2014 if one is detected the emitter stays silent until you remove the conflict.<\/p><\/dd>\n<dt id=\"can%20i%20remove%20the%20plugin%20cleanly%3F\"><h3>Can I remove the plugin cleanly?<\/h3><\/dt>\n<dd><p>Yes. Deleting the plugin removes all settings, transients and the agent storefront endpoint. No data is left in your database.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>New \"Where the widget loads\" settings section: master on\/off toggle (default on), \"Show only on these paths\" include rules, and \"Never show on these paths\" exclude rules. Wildcards <code>*<\/code> and <code>?<\/code> are supported via fnmatch, matched against the request path.<\/li>\n<li>Connect-return handler accepts both <code>xpayacp_*<\/code> and legacy <code>asp_*<\/code> query parameters from the xpay onboard page.<\/li>\n<li><code>$_GET<\/code> index checks refactored to explicit branches so static analysers can verify each access.<\/li>\n<li><code>$xpayacp_options<\/code> and <code>$xpayacp_opt<\/code> variables in <code>uninstall.php<\/code> properly prefixed.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li><strong>Renamed to xpay\u2726 Agentic Commerce for Publishers.<\/strong> New slug <code>xpay-agentic-commerce-for-publishers<\/code>. The previous working name overlapped with Automattic's Storefront theme.<\/li>\n<li><strong>Native WordPress settings screen.<\/strong> The admin settings screen is now a standard wp-admin page built with the Settings API. The embedded <code>widget.xpay.sh\/embed\/admin\/settings<\/code> iframe has been removed; no remote UI is loaded into wp-admin.<\/li>\n<li><strong>Auto-injection of the widget removed.<\/strong> The widget no longer appends itself to post content. It renders only where you place the <code>[xpay_recs]<\/code> shortcode or the Recommendations block. Existing sites with the auto-inject toggle previously on must add the shortcode or block where they want the widget.<\/li>\n<li><strong>Signed <code>\/page-context<\/code> REST endpoint.<\/strong> The widget iframe now signs its <code>page-context<\/code> requests with an HMAC derived from the per-site secret minted at activation. The endpoint no longer accepts unauthenticated reads.<\/li>\n<li><strong>Tightened admin handlers.<\/strong> The disconnect action now runs through a nonced <code>admin-post.php<\/code> handler with an explicit <code>manage_options<\/code> capability check.<\/li>\n<li>All function, class, constant, option, transient and shortcode-internal prefixes consolidated under <code>xpayacp_<\/code> \/ <code>XPAYACP_<\/code>.<\/li>\n<\/ul>\n\n<h4>0.3.6<\/h4>\n\n<ul>\n<li>Pre-WordPress.org-submit hardening pass against the published guidelines.<\/li>\n<li><code>\/llms.txt<\/code> body is now composed from pre-escaped values.<\/li>\n<li>Readme privacy section reworded to match the code's actual behaviour.<\/li>\n<li>Added empty <code>index.php<\/code> silence files to every plugin subdirectory.<\/li>\n<\/ul>\n\n<h4>0.3.5<\/h4>\n\n<ul>\n<li>Front-end widget script now flows through <code>wp_register_script<\/code> \/ <code>wp_enqueue_script<\/code> \/ <code>script_loader_tag<\/code>.<\/li>\n<li>Readme short description rewritten in plain English.<\/li>\n<\/ul>\n\n<h4>0.3.4<\/h4>\n\n<ul>\n<li>Plugin URI updated to the dedicated landing page.<\/li>\n<li>Documentation set published at <code>docs.xpay.sh\/en\/publishers\/wordpress-plugin\/*<\/code>.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Thin-shell architecture \u2014 front-end widget runs inside a sandboxed iframe.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>One-click \"Open xpay dashboard\" link from the connected settings screen.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Shortcode and Gutenberg block for placing recommendation widgets manually.<\/li>\n<li><code>\/.well-known\/agent-storefront.json<\/code> emitter with detect-existing safety check.<\/li>\n<li>Optional <code>llms.txt<\/code> append (off by default).<\/li>\n<li>WP Consent API integration.<\/li>\n<li>Brand-safety exclude lists.<\/li>\n<li>Optional Amazon Associates per-site tag.<\/li>\n<\/ul>","raw_excerpt":"Add contextual product recommendations to your WordPress posts and publish an agent-readable product feed for AI shopping assistants.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324227","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=324227"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/xpaysh"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324227"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324227"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324227"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324227"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324227"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}