{"id":320844,"date":"2026-06-12T20:04:47","date_gmt":"2026-06-12T20:04:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/promptless-cpt-pages\/"},"modified":"2026-09-14T22:15:03","modified_gmt":"2026-09-14T22:15:03","slug":"promptless-cpt-pages","status":"publish","type":"plugin","link":"https:\/\/gd.wordpress.org\/plugins\/promptless-cpt-pages\/","author":23458468,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.10.0","stable_tag":"0.10.0","tested":"7.1.1","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Promptless CPT Pages","header_author":"Promptless WP","header_description":"Render CPT single pages with structured data display, layout variants, and admin or AI population. Works standalone or with Promptless WP.","assets_banners_color":"","last_updated":"2026-09-14 22:15:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/promptlesswp.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":900,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.10.0":{"tag":"0.10.0","author":"promptlesswp","date":"2026-09-14 22:15:03","revision":3695999},"0.5.3":{"tag":"0.5.3","author":"promptlesswp","date":"2026-06-12 20:04:21","revision":3570492},"0.6.0":{"tag":"0.6.0","author":"promptlesswp","date":"2026-06-15 02:05:50","revision":3572348},"0.6.1":{"tag":"0.6.1","author":"promptlesswp","date":"2026-06-24 00:28:34","revision":3583899},"0.6.2":{"tag":"0.6.2","author":"promptlesswp","date":"2026-06-25 15:13:32","revision":3586315},"0.6.3":{"tag":"0.6.3","author":"promptlesswp","date":"2026-07-03 12:29:42","revision":3595235},"0.6.4":{"tag":"0.6.4","author":"promptlesswp","date":"2026-07-05 15:08:02","revision":3596865},"0.6.5":{"tag":"0.6.5","author":"promptlesswp","date":"2026-07-11 14:40:39","revision":3604022},"0.6.6":{"tag":"0.6.6","author":"promptlesswp","date":"2026-07-16 12:28:36","revision":3610217},"0.6.7":{"tag":"0.6.7","author":"promptlesswp","date":"2026-07-23 17:56:04","revision":3620356},"0.6.8":{"tag":"0.6.8","author":"promptlesswp","date":"2026-08-07 13:17:08","revision":3637892},"0.6.9":{"tag":"0.6.9","author":"promptlesswp","date":"2026-08-13 12:24:20","revision":3645279},"0.7.0":{"tag":"0.7.0","author":"promptlesswp","date":"2026-08-19 16:35:35","revision":3655031},"0.7.2":{"tag":"0.7.2","author":"promptlesswp","date":"2026-08-21 19:04:21","revision":3659534},"0.8.0":{"tag":"0.8.0","author":"promptlesswp","date":"2026-09-03 17:34:53","revision":3680165},"0.8.1":{"tag":"0.8.1","author":"promptlesswp","date":"2026-09-07 16:58:47","revision":3685308},"0.9.1":{"tag":"0.9.1","author":"promptlesswp","date":"2026-09-12 23:04:57","revision":3693186}},"upgrade_notice":{"0.10.0":"<p>Records can take a photo URL from the connector or a FlowMint import; each image is downloaded once and reused. Archive pages load less CSS. Additive; no settings change.<\/p>","0.9.1":"<p>Plugin Check clean-up of the 0.9.0 package; no behaviour change. Safe for all users.<\/p>","0.9.0":"<p>Adds &quot;Add to calendar&quot; links and a subscribable calendar feed for event-shaped record types, external-identity upsert for ingesting records from other systems, and right-to-left stylesheets. Fixes orphaned category rows on delete and a purge that skipped trashed records. No settings change.<\/p>","0.8.1":"<p>Accessibility fix: the &quot;Skip to content&quot; link now moves keyboard focus on custom post type single pages instead of only scrolling. No content or settings change.<\/p>","0.8.0":"<p>Fixes two data-handling bugs: deleting a post type destroyed grouping definitions it claimed to preserve, and &quot;purge data&quot; left most behind. Also stops a bug that created ~20 junk autoloaded options per grouping save, and clears existing ones automatically.<\/p>","0.7.2":"<p>Adds a Location \/ map field: enter an address and the single page shows a click-to-load map \u2014 no Google Maps API key or setup. Place it above, below, or in the sidebar, overridable per post. Works with or without Promptless WP. Additive; existing fields unchanged.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3605294,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3605294,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.10.0","0.5.3","0.6.0","0.6.1","0.6.2","0.6.3","0.6.4","0.6.5","0.6.6","0.6.7","0.6.8","0.6.9","0.7.0","0.7.2","0.8.0","0.8.1","0.9.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Admin UI for registering a custom post type \u2014 name, slug, labels, icon picker, archive on\/off","2":"Grouping definitions per CPT \u2014 define a named cluster of items sharing a layout variant and a position (above main \/ below main \/ sidebar)","3":"The per-post meta box for filling in grouping items, with the four layout-variant preview cards","4":"Frontend render of a CPT single page with the compact-grid variant for an \"amenities\" grouping","5":"Claude Cowork connector setup \u2014 opt-in App Password generation, default-disabled kill switch"}},"plugin_section":[],"plugin_tags":[2010,1487,20731,23364,129283],"plugin_category":[],"plugin_contributors":[265095],"plugin_business_model":[],"class_list":["post-320844","plugin","type-plugin","status-publish","hentry","plugin_tags-custom-fields","plugin_tags-custom-post-types","plugin_tags-post-template","plugin_tags-single-page","plugin_tags-structured-content","plugin_contributors-promptlesswp","plugin_committers-promptlesswp"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/promptless-cpt-pages\/assets\/icon-128x128.png?rev=3605294","icon_2x":"https:\/\/ps.w.org\/promptless-cpt-pages\/assets\/icon-256x256.png?rev=3605294","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Promptless CPT Pages provides a constrained, opinionated primitive for repeatable structured content on custom-post-type single pages:<\/p>\n\n<ul>\n<li>Register custom post types from an admin UI \u2014 no ACF \/ MetaBox \/ Pods dependency.<\/li>\n<li>Define \"groupings\" per CPT \u2014 named clusters of items sharing a layout variant and a position (above main \/ below main \/ sidebar).<\/li>\n<li>Items follow one shape \u2014 <code>{ image-or-icon, heading, supporting_text, optional link }<\/code>.<\/li>\n<li>Four layout variants per grouping \u2014 compact-grid, card-grid, featured-card, horizontal-row.<\/li>\n<li>Three source modes \u2014 <code>manual<\/code>, <code>child_posts<\/code>, <code>taxonomy_match<\/code>.<\/li>\n<li>Curated icon library of 53 icons across 13 categories, extensible via the <code>pre_icon_library<\/code> filter.<\/li>\n<li>Connector REST API + MCP tools (18 endpoints under <code>\/wp-json\/post-runtime\/v1\/connector\/<\/code>) so AI assistants like Claude Cowork can register CPTs, define groupings, populate per-post values, and preview rendered output.<\/li>\n<li>Design-token inheritance from Promptless WP \u2014 colors, spacing, typography, radii. Graceful fallback when Promptless is not installed.<\/li>\n<\/ul>\n\n<p>Promptless CPT Pages is positioned as a free companion plugin to Promptless WP (the page builder) and Promptless Forms (the form renderer). It owns dynamic CPT single-page rendering; it does not replace Promptless for landing-page composition or Promptless Forms for forms.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to one third-party service: the Iconify API. It is used solely to display icons that you choose to use, and only when you opt into using them. If you do not use Iconify icons, no external service is ever contacted.<\/p>\n\n<h4>Iconify API<\/h4>\n\n<p>What it is and what it is for: the plugin bundles the open-source <code>iconify-icon<\/code> web component locally (<code>assets\/js\/iconify-icon.min.js<\/code> \u2014 it is shipped inside the plugin and is NOT loaded from any CDN). When a CPT single page, archive card, grouping item, or post field uses an Iconify-format icon identifier written in <code>collection:name<\/code> form (for example <code>mdi:home<\/code> or <code>material-symbols:business-outline<\/code>), the web component requests that single icon's SVG path data from the Iconify API at render time so the icon can be displayed. This is what makes 200,000+ open-source icons available without bundling them all into the plugin.<\/p>\n\n<p>What data is sent, and when: only the icon identifier you chose to use (for example <code>mdi:home<\/code>) is sent, as part of the request URL, at the moment a page containing that icon is viewed in a visitor's browser. The request is made by the visitor's browser \u2014 not by your server. No personal data, no user content, no site URL, and no identifiers of any kind are transmitted.<\/p>\n\n<p>When it is NOT contacted: the plugin also ships a built-in library of 53 icons that render inline as SVG with zero network requests. If you use only those built-in icons \u2014 or no icons at all \u2014 the Iconify API is never contacted.<\/p>\n\n<p>Service provider: Iconify (Iconify O\u00dc).<\/p>\n\n<p>Endpoints contacted: https:\/\/api.iconify.design (primary), with https:\/\/api.simplesvg.com and https:\/\/api.unisvg.com as automatic fallbacks used only if the primary endpoint is unreachable.<\/p>\n\n<p>Terms of use: https:\/\/iconify.design\/docs\/api\/ \u2014 the Iconify API is a free, open-source public service released under the Apache 2.0 License; the \"Public API\" section documents the terms of use.<\/p>\n\n<p>Privacy policy: https:\/\/iconify.design\/privacy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install via WP Admin \u2192 Plugins \u2192 Add New \u2192 Upload Plugin.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Visit <strong>Post Runtime \u2192 CPTs<\/strong> in the admin to register your first custom post type.<\/li>\n<li>To enable the Claude Cowork connector, visit <strong>Post Runtime \u2192 Claude Connection<\/strong> and follow the setup steps.<\/li>\n<\/ol>\n\n<p>For full documentation see <code>CLAUDE.md<\/code> and <code>docs\/<\/code> inside the plugin folder.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20promptless%20wp%3F\"><h3>Does this plugin require Promptless WP?<\/h3><\/dt>\n<dd><p>No. PRE renders standalone with sensible default styling. When Promptless WP is active, PRE automatically inherits its <code>--aisb-*<\/code> design tokens for visual consistency.<\/p><\/dd>\n<dt id=\"can%20i%20use%20existing%20acf%20%2F%20metabox%20fields%20with%20groupings%3F\"><h3>Can I use existing ACF \/ MetaBox fields with groupings?<\/h3><\/dt>\n<dd><p>Not in this version. Promptless CPT Pages owns its own field model end-to-end via grouping items. ACF interop is out of scope for v0.x.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>Per-post grouping values live in WordPress post meta. CPT and grouping definitions live in <code>wp_options<\/code>. No custom database tables.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Added: records accept a photo URL (<code>featured_image_url<\/code>) on the connector and in FlowMint imports. The image is downloaded into the media library once per URL, reused on every later sync, set as the featured image with the title as alt text, and a URL that fails is a warning rather than an error.<\/li>\n<li>Changed: post-type archive pages no longer load the single-page stylesheet they never used, so they load faster. Single pages are unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Fixed: three Plugin Check errors in the 0.9.0 package (two prohibited <code>suppress_filters<\/code> declarations, one missing translators comment). No behaviour change.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Added: a calendar for event-shaped record types. Each record page has \"Add to calendar\" (a standard .ics download) and \"Google Calendar\" links, and each type has a subscribable feed of its upcoming records that Apple Calendar, Google Calendar and Outlook keep up to date. Built on WordPress core's feed mechanism; the connector reports the feed address.<\/li>\n<li>Added: records that mirror another system are identified by source and external id. Creating one twice updates it instead of duplicating it, unchanged records are recognised, and the connector has an upsert route and tool \u2014 the primitive behind scheduled ingests from vendor systems.<\/li>\n<li>Added: right-to-left languages load right-to-left stylesheets, so an Arabic or Hebrew site gets mirrored cards, heroes, maps and admin screens.<\/li>\n<li>Fixed: permanently deleting a record of a deleted type left its category and tag rows behind; the earlier \"purge data\" ran as one unbounded request and skipped trashed records \u2014 it is batched now and covers them.<\/li>\n<li>Fixed: \"Skip to content\" moves keyboard focus on record pages.<\/li>\n<\/ul>\n\n<h4>0.8.1<\/h4>\n\n<ul>\n<li>Fixed: \"Skip to content\" did nothing on custom post type single pages. The template mirrors the theme's <code>&lt;main&gt;<\/code> but had not been updated with it, so activating the link scrolled the page without moving keyboard focus \u2014 the next Tab went back to the top of the navigation (WCAG 2.4.1).<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Added: the connector can now list and delete the posts it creates. Previously it could build a set of content and then had no way to review or undo it without going into wp-admin by hand.<\/li>\n<li>Added: re-registering a post type you deleted earlier now tells you what came back \u2014 existing groupings, fields and posts \u2014 instead of looking like a fresh start and then failing confusingly.<\/li>\n<li>Fixed: deleting a post type destroyed its grouping definitions even though it reported that your data was preserved. Re-registering brought back content that could no longer be displayed. Nothing is destroyed now unless you explicitly ask to purge.<\/li>\n<li>Fixed: \"purge data\" left most of the data behind \u2014 field definitions, saved values and backup rows. It now removes all of it.<\/li>\n<li>Fixed: every grouping save created around 20 junk database options that were loaded on every page request, growing with each save. Rows already on your site are removed automatically the first time you visit wp-admin after updating.<\/li>\n<li>Fixed: the connector used up its hourly request allowance about twice as fast as it should have.<\/li>\n<li>Fixed: the connector could not reach an HTTPS local development site.<\/li>\n<\/ul>\n\n<h4>0.7.2<\/h4>\n\n<ul>\n<li>Added: a new \"Location \/ map\" field type. Enter a street address on a post and its single page shows a click-to-load map \u2014 no Google Maps API key, no coordinates, no setup. Cards and archive listings show the address as text. You choose the zoom level (street \/ neighborhood \/ city), whether the map loads on click (privacy-friendly, the default) or automatically, and whether to show a \"Get directions\" link. You also choose where the map sits on the page \u2014 above the content, below it, or in the sidebar \u2014 the same placement control your grouping sections use, and each post can override it. If a post has no address, the map uses your Business Identity address (when Promptless WP is set up). The map is self-contained \u2014 it does NOT require Promptless WP and works on any theme; when Promptless WP is active the map simply picks up your brand colours automatically. Works from the editor by hand or through the AI connector.<\/li>\n<li>Updated: tested up to WordPress 7.1.<\/li>\n<\/ul>","raw_excerpt":"Render CPT single pages with structured data display, layout variants, and admin or AI population. Works standalone or with Promptless WP.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/320844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=320844"}],"author":[{"embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/promptlesswp"}],"wp:attachment":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=320844"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=320844"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=320844"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=320844"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=320844"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=320844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}