{"id":330335,"date":"2026-08-30T19:32:14","date_gmt":"2026-08-30T19:32:14","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/bindery\/"},"modified":"2026-08-30T20:45:18","modified_gmt":"2026-08-30T20:45:18","slug":"bindery","status":"publish","type":"plugin","link":"https:\/\/af.wordpress.org\/plugins\/bindery\/","author":23520919,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.6","stable_tag":"0.3.6","tested":"7.1","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Bindery","header_author":"Dumitru Balaban","header_description":"Editable regions for hand-built themes. Declare what a client may edit in clean theme code; Bindery binds it to a locked, multilingual editor \u2014 no markup ownership, no builder bloat.","assets_banners_color":"cb987d","last_updated":"2026-08-30 20:45:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":114,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.6":{"tag":"0.3.6","author":"dumitrubalaban","date":"2026-08-30 20:45:18","revision":3673108}},"upgrade_notice":{"0.1.0":"<p>First public release of Bindery.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3673108,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3673108,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3673114,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3673114,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"bindery\/slider":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/slider","version":"0.1.0","title":"Bindery Slider","category":"design","icon":"images-alt2","description":"An auto-advancing slider whose slides are a Bindery repeater \u2014 edit slides inline per language; the carousel runs from the block's own viewScript on the front end.","keywords":["bindery","slider","carousel","repeater","slides"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"repeater"},"subfields":{"type":"object","default":{"title":"h3","text":"p"}},"labels":{"type":"object","default":{}},"autoplay":{"type":"boolean","default":true},"interval":{"type":"number","default":5000}},"usesContext":["postId"],"supports":{"html":false,"align":["wide","full"]},"editorScript":"file:.\/index.js","style":"file:.\/style.css","viewScript":"file:.\/view.js","render":"file:.\/render.php"},"bindery\/icon":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/icon","version":"0.1.0","title":"Bindery Icon","category":"design","icon":"star-filled","description":"An editable icon \u2014 the client picks one from a curated set; stored per language and rendered as inline SVG.","keywords":["bindery","icon","svg"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"text"},"size":{"type":"number","default":48},"color":{"type":"string","default":"#d8b75d"}},"usesContext":["postId"],"supports":{"html":false},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"},"bindery\/cards":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/cards","version":"0.1.0","title":"Bindery Cards","category":"design","icon":"grid-view","description":"An editable grid of cards backed by a Bindery repeater field \u2014 clients add, remove, reorder and edit rows inline, per language.","keywords":["bindery","repeater","cards","grid","features"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"repeater"},"subfields":{"type":"object","default":{"title":"h4","body":"p"}},"labels":{"type":"object","default":{}},"columns":{"type":"number","default":3}},"usesContext":["postId"],"supports":{"html":false,"align":["wide","full"]},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"},"bindery\/image":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/image","version":"0.1.0","title":"Bindery Image","category":"media","icon":"format-image","description":"An editable image \u2014 the client picks one from the media library inline; stored per language and rendered from the attachment.","keywords":["bindery","image","media","picture"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"image"},"size":{"type":"string","default":"large"},"alt":{"type":"string","default":""}},"usesContext":["postId"],"supports":{"html":false,"align":["wide","full"]},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"},"bindery\/button":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/button","version":"0.1.0","title":"Bindery Button","category":"design","icon":"button","description":"An editable call-to-action button \u2014 label and link, both stored per language and rendered as a real anchor.","keywords":["bindery","button","cta","link"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"button"}},"usesContext":["postId"],"supports":{"html":false},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"},"bindery\/editable-text":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/editable-text","version":"0.1.0","title":"Bindery Editable Text","category":"text","icon":"edit-page","description":"A text region whose content is resolved from a Bindery field \u2014 clean markup the developer controls, editable only where allowed.","keywords":["bindery","editable","field","binding"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"tag":{"type":"string","default":"p"},"placeholder":{"type":"string","default":""},"locked":{"type":"boolean","default":false}},"usesContext":["postId"],"supports":{"html":false,"className":true,"anchor":true},"editorScript":"file:.\/index.js","style":"file:.\/style.css","viewScript":"file:.\/view.js","render":"file:.\/render.php"},"bindery\/section":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/section","version":"0.1.0","title":"Bindery Section","category":"design","icon":"cover-image","description":"A full-width section with an editable background image and any blocks inside \u2014 ideal for hero areas.","keywords":["bindery","section","cover","hero","background"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"image"},"overlay":{"type":"number","default":45},"minHeight":{"type":"string","default":"420px"}},"usesContext":["postId"],"supports":{"html":false,"align":["wide","full"]},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"},"bindery\/form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"bindery\/form","version":"0.1.0","title":"Bindery Form","category":"design","icon":"email","description":"A contact\/lead form \u2014 editable labels per language, submissions stored in wp-admin and emailed. Spam-protected.","keywords":["bindery","form","contact","lead","email"],"textdomain":"bindery","attributes":{"fieldKey":{"type":"string","default":""},"binderyType":{"type":"string","default":"form"}},"usesContext":["postId"],"supports":{"html":false,"align":["wide"]},"editorScript":"file:.\/index.js","style":"file:.\/style.css","viewScript":"file:.\/view.js","render":"file:.\/render.php"}},"tagged_versions":["0.3.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3673108,"resolution":"1","location":"assets","locale":"","width":2849,"height":1542},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3673108,"resolution":"2","location":"assets","locale":"","width":2848,"height":1547},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3673114,"resolution":"3","location":"assets","locale":"","width":2846,"height":1546},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3673114,"resolution":"4","location":"assets","locale":"","width":2851,"height":1544},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3673114,"resolution":"5","location":"assets","locale":"","width":1376,"height":768}},"screenshots":{"1":"The settings screen \u2014 turn on inline editing and tick which elements (headings, paragraphs, lists\u2026) clients can edit. No code required.","2":"Editing on the live page \u2014 the \"Edit page\" overlay outlines every editable region; click and type to change text in place.","3":"Auto content editing \u2014 existing page text becomes editable automatically, per page, with full revision history.","4":"Eight self-contained blocks and ready-made patterns for richer editable layouts, all adapting to your theme.","5":"History &amp; Data \u2014 per-field revision history, one-click restore, and JSON export\/import for site migrations."}},"plugin_section":[],"plugin_tags":[246427,20802,278388,31174,99],"plugin_category":[48],"plugin_contributors":[278389],"plugin_business_model":[],"class_list":["post-330335","plugin","type-plugin","status-publish","hentry","plugin_tags-block-bindings","plugin_tags-content-editor","plugin_tags-editable-content","plugin_tags-inline-editing","plugin_tags-multilingual","plugin_category-language-tools","plugin_contributors-dumitrubalaban","plugin_committers-dumitrubalaban"],"banners":{"banner":"https:\/\/ps.w.org\/bindery\/assets\/banner-772x250.jpg?rev=3673114","banner_2x":"https:\/\/ps.w.org\/bindery\/assets\/banner-1544x500.jpg?rev=3673114","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bindery\/assets\/icon-128x128.png?rev=3673108","icon_2x":"https:\/\/ps.w.org\/bindery\/assets\/icon-256x256.png?rev=3673108","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/bindery\/assets\/screenshot-1.png?rev=3673108","caption":"The settings screen \u2014 turn on inline editing and tick which elements (headings, paragraphs, lists\u2026) clients can edit. No code required."},{"src":"https:\/\/ps.w.org\/bindery\/assets\/screenshot-2.png?rev=3673108","caption":"Editing on the live page \u2014 the \"Edit page\" overlay outlines every editable region; click and type to change text in place."},{"src":"https:\/\/ps.w.org\/bindery\/assets\/screenshot-3.png?rev=3673114","caption":"Auto content editing \u2014 existing page text becomes editable automatically, per page, with full revision history."},{"src":"https:\/\/ps.w.org\/bindery\/assets\/screenshot-4.png?rev=3673114","caption":"Eight self-contained blocks and ready-made patterns for richer editable layouts, all adapting to your theme."},{"src":"https:\/\/ps.w.org\/bindery\/assets\/screenshot-5.jpg?rev=3673114","caption":"History &amp; Data \u2014 per-field revision history, one-click restore, and JSON export\/import for site migrations."}],"raw_content":"<!--section=description-->\n<p><strong>Bindery gives any WordPress theme a clean, locked, edit-in-place experience \u2014 without a page builder and without giving up hand-written markup.<\/strong><\/p>\n\n<p>Custom and AI-built themes are fast and clean, but content-hostile: a client can't change a headline or a phone number without a developer. Page builders fix that but bloat your markup and your editing screen. Bindery is the missing middle \u2014 <strong>you decide what a client may change, and they edit only that, right on the live page.<\/strong><\/p>\n\n<p>Everything is built on native WordPress primitives (the Block Bindings API, <code>block.json<\/code>, the REST API), so Bindery never owns your markup and adds no builder lock-in.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Edit on the live page.<\/strong> A floating \"\u270e Edit page\" button turns the regions you declared into inline-editable text. Click, type, click away \u2014 saved.<\/li>\n<li><strong>No-code setup.<\/strong> From the <strong>Bindery<\/strong> settings screen, tick which HTML tags (headings, paragraphs, lists, quotes\u2026) become editable site-wide. That's it.<\/li>\n<li><strong>Or mark regions in code.<\/strong> A one-line template helper (<code>bindery_attrs()<\/code>) makes a single element editable; template tags render declared fields anywhere; eight ready-made blocks cover richer content.<\/li>\n<li><strong>Locked by design.<\/strong> Only declared regions are editable. Layout, structure and anything unmarked stay untouchable \u2014 clients can't break the design.<\/li>\n<li><strong>Multilingual.<\/strong> Every field stores a value per language; unedited languages fall back to your code default.<\/li>\n<li><strong>Revision history + one-click restore<\/strong> for every edit.<\/li>\n<li><strong>Export \/ import<\/strong> all content as JSON for staging \u2192 production migrations (also via WP-CLI).<\/li>\n<li><strong>Theme-portable.<\/strong> Verified across Astra, OceanWP, Neve, the default Twenty-* themes and block (FSE) themes; the bundled blocks adapt to your theme's colours.<\/li>\n<\/ul>\n\n<h4>Five ways to make content editable<\/h4>\n\n<ol>\n<li><strong>Settings page<\/strong> \u2014 choose editable tags, zero code.<\/li>\n<li><strong>Attribute helper<\/strong> \u2014 <code>bindery_attrs()<\/code> marks one element editable in your template.<\/li>\n<li><strong>Blocks<\/strong> \u2014 drop a Bindery block into the block editor.<\/li>\n<li><strong>Template tags<\/strong> \u2014 <code>bindery_field()<\/code> \/ <code>bindery_value()<\/code> render a declared field in PHP.<\/li>\n<li><strong>Auto mode<\/strong> \u2014 make all existing page text editable automatically.<\/li>\n<\/ol>\n\n<h4>Built for developers, too<\/h4>\n\n<p>A small DI container with four filter-driven seams (field types, value sources, storage adapters, locale providers). Values live in their own table, never in your markup; writes are whitelisted to the fields actually on the page and sanitized per type; output is escaped per type. WP-CLI commands for export\/import\/history\/restore. Full API in the bundled <code>DEVELOPERS.md<\/code> and <code>README.md<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>bindery<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>Bindery<\/strong> through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Bindery<\/strong> in the admin menu, turn on inline editing and tick which elements are editable.<\/li>\n<li>Visit any page on the front end and click <strong>\u270e Edit page<\/strong> to start editing.<\/li>\n<\/ol>\n\n<p>No build step or Composer is required to use the plugin \u2014 the compiled assets ship in the package.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20bindery%20change%20my%20theme%27s%20markup%3F\"><h3>Does Bindery change my theme's markup?<\/h3><\/dt>\n<dd><p>No. It resolves a value (a client's saved override, or your code default) and outputs your own clean markup. Editable regions are marked with <code>data-*<\/code> attributes that are only emitted for logged-in users who can edit; visitors get clean HTML.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20write%20code%3F\"><h3>Do I have to write code?<\/h3><\/dt>\n<dd><p>No. With auto content editing enabled on the settings page, your existing page text becomes editable with no code at all. Code helpers exist for developers who want precise, per-region control.<\/p><\/dd>\n<dt id=\"where%20is%20the%20content%20stored%3F\"><h3>Where is the content stored?<\/h3><\/dt>\n<dd><p>In a dedicated table (<code>wp_bindery_values<\/code>), one row per field\/page\/language \u2014 never mixed into your post markup. Your code default is never stored, so improving it in code reaches every site that hasn't overridden the field.<\/p><\/dd>\n<dt id=\"can%20a%20client%20break%20the%20layout%3F\"><h3>Can a client break the layout?<\/h3><\/dt>\n<dd><p>No. Only the regions you declared editable can be changed. Everything else \u2014 structure, classes, layout \u2014 is untouchable.<\/p><\/dd>\n<dt id=\"is%20it%20multilingual%3F\"><h3>Is it multilingual?<\/h3><\/dt>\n<dd><p>Yes. Each field stores a value per language, with a language switcher in the edit overlay. Plug in WPML\/Polylang via a filter, or use the built-in provider.<\/p><\/dd>\n<dt id=\"can%20i%20move%20content%20between%20sites%3F\"><h3>Can I move content between sites?<\/h3><\/dt>\n<dd><p>Yes \u2014 export\/import all values as JSON from the settings page or with <code>wp bindery export<\/code> \/ <code>wp bindery import<\/code>.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20builders%3F\"><h3>Does it work with page builders?<\/h3><\/dt>\n<dd><p>Bindery is an alternative to page builders, not an add-on. It works with any classic or block theme and the native block editor.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20for%20the%20compiled%20javascript%3F\"><h3>Where is the source code for the compiled JavaScript?<\/h3><\/dt>\n<dd><p>The <code>\/build<\/code> directory shipped with the plugin (block editor scripts, the settings screen, and the front-end overlay's compiled entry points) is generated from the human-readable source in <code>\/src-js<\/code> using <code>@wordpress\/scripts<\/code> and the included <code>webpack.config.js<\/code>. Both the full source and the build configuration are published in the plugin's public repository:<\/p>\n\n<p>https:\/\/github.com\/dumitrubalaban\/bindery<\/p>\n\n<p>Run <code>npm install &amp;&amp; npm run build<\/code> from the repository root to reproduce <code>\/build<\/code> from <code>\/src-js<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>No-code settings page: choose which element types are client-editable, per post type.<\/li>\n<li>Front-end inline edit overlay with per-language switching, accent colour and strict mode.<\/li>\n<li>Automatic content editing: make existing page text editable without declaring fields.<\/li>\n<li>Attribute helper and template tags for precise, code-declared editable regions.<\/li>\n<li>Eight self-contained blocks (editable text, cards, slider, image, button, icon, form, section) plus block patterns.<\/li>\n<li>Per-language values on a custom table; value precedence (saved override, else code default).<\/li>\n<li>Whitelisted, capability-gated REST editing; per-type sanitization and escaping.<\/li>\n<li>Revision history with one-click restore; JSON export\/import (settings page and WP-CLI).<\/li>\n<li>Per-request value caching, multisite-aware activation, accessibility pass.<\/li>\n<\/ul>","raw_excerpt":"Let clients edit your theme&#039;s text on the live page \u2014 you choose exactly what is editable. Clean markup, no page builder, multilingual.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/330335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=330335"}],"author":[{"embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dumitrubalaban"}],"wp:attachment":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=330335"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=330335"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=330335"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=330335"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=330335"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=330335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}