{"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-19T21:25:25","modified_gmt":"2026-09-19T21:25:25","slug":"promptless-cpt-pages","status":"publish","type":"plugin","link":"https:\/\/sv.wordpress.org\/plugins\/promptless-cpt-pages\/","author":23458468,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.10.1","stable_tag":"0.10.1","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-19 21:25:25","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":963,"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.10.1":{"tag":"0.10.1","author":"promptlesswp","date":"2026-09-19 21:25:25","revision":3703679},"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.1":"<p>Fixes a connector delete that removed records permanently, event lists that dropped all-day and open-ended events, and admin saves that erased settings made through the connector. Deleting the plugin now keeps your data unless you opt in.<\/p>","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 Add to calendar 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>"},"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.10.1","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 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>Five layout variants per grouping \u2014 compact-grid, card-grid, featured-card, horizontal-row, gallery.<\/li>\n<li>Four source modes \u2014 <code>manual<\/code>, <code>child_posts<\/code>, <code>taxonomy_match<\/code>, <code>meta_match<\/code> (including reverse lookups across types).<\/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 (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 Post Types<\/strong> in the admin to register your first custom post type.<\/li>\n<li>To enable the connector for Claude, visit <strong>Post Runtime \u2192 Connector<\/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.1<\/h4>\n\n<ul>\n<li>Changed: deleting the plugin keeps post types, fields, groupings and record values unless PCPTPAGES_REMOVE_ALL_DATA is set in wp-config.php.<\/li>\n<li>Fixed: the connector's delete removed records permanently while reporting a trash; connector writes could take up to an hour to show on the page.<\/li>\n<li>Fixed: all-day events moved to Past on their last day, records with no end date appeared in no list, and a long event dropped out of the calendar feed.<\/li>\n<li>Fixed: saving a type or grouping in the admin erased settings made through the connector (custom address, REST base, Iconify icon, reverse lookups).<\/li>\n<\/ul>\n\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>","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:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/320844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=320844"}],"author":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/promptlesswp"}],"wp:attachment":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=320844"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=320844"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=320844"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=320844"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=320844"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=320844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}