{"id":259154,"date":"2026-01-01T19:53:28","date_gmt":"2026-01-01T19:53:28","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/markdown-fm\/"},"modified":"2026-09-28T12:33:01","modified_gmt":"2026-09-28T12:33:01","slug":"yaml-custom-fields","status":"publish","type":"plugin","link":"https:\/\/rhg.wordpress.org\/plugins\/yaml-custom-fields\/","author":15411520,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.1.3","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"YAML Custom Fields","header_author":"Studio Cita","header_description":"A WordPress plugin for managing YAML frontmatter schemas in theme templates","assets_banners_color":"6d64c5","last_updated":"2026-09-28 12:33:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/maliMirkec\/yaml-custom-fields","header_author_uri":"https:\/\/www.cita.hr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":761,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.3":{"tag":"1.2.3","author":"starbist","date":"2026-01-01 19:56:32","revision":3430737},"1.2.4":{"tag":"1.2.4","author":"starbist","date":"2026-01-06 22:02:30","revision":3433936},"1.2.5":{"tag":"1.2.5","author":"starbist","date":"2026-01-21 10:12:38","revision":3443949},"1.2.6":{"tag":"1.2.6","author":"starbist","date":"2026-02-05 11:22:19","revision":3454540},"1.2.7":{"tag":"1.2.7","author":"starbist","date":"2026-03-05 12:34:46","revision":3475636},"1.2.8":{"tag":"1.2.8","author":"starbist","date":"2026-07-09 07:49:44","revision":3601105},"1.2.9":{"tag":"1.2.9","author":"starbist","date":"2026-07-09 09:05:15","revision":3601211},"2.0.0":{"tag":"2.0.0","author":"starbist","date":"2026-09-28 12:33:01","revision":3717169}},"upgrade_notice":{"2.0.0":"<p>Back up first. Needs WordPress 6.4+. The shared value tick now wins in ycf_get_fields(), and a page value beats a site detail with the same name. Schemas with mistakes are refused. The database is tidied once, by itself.<\/p>","1.2.6":"<p>Important fix for code fields. HTML\/JavaScript\/CSS code is now properly preserved using base64 encoding. Re-save any code fields that previously had content stripped.<\/p>","1.2.5":"<p>Bug fix for code field sanitization. Code fields now preserve raw content correctly without premature HTML entity encoding.<\/p>","1.2.4":"<p>Asset folder reorganization for better WordPress.org compliance. All functionality remains unchanged.<\/p>","1.2.3":"<p>Bug fix for dynamic block fields. Taxonomy, post type, and data object fields now render correctly when adding blocks dynamically.<\/p>","1.2.2":"<p>Important security update with nonce verification fixes. Updated to PHP 8.1+ requirement with Symfony 6.4 compatibility.<\/p>","1.2.1":"<p>Fixes for export\/import functionality and template global field handling. Recommended update for better data portability.<\/p>","1.2.0":"<p>Major feature update introducing Template Global Fields for shared default values across posts using the same template.<\/p>","1.1.0":"<p>Code quality improvements, consolidated Export\/Import page, and enhanced security. All functionality remains backwards compatible.<\/p>","1.0.0":"<p>Initial release of YAML Custom Fields.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717169,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3430736,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717169,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717169,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3717169,"resolution":"1","location":"assets","locale":"","width":2880,"height":1920},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3717169,"resolution":"2","location":"assets","locale":"","width":2880,"height":1920},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3717169,"resolution":"3","location":"assets","locale":"","width":2880,"height":1920},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3717169,"resolution":"4","location":"assets","locale":"","width":2880,"height":1920},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3717169,"resolution":"5","location":"assets","locale":"","width":2880,"height":1920}},"screenshots":{"1":"The YAML CF screen, with a switch per template and the status of its fields.","2":"The schema editor for a template.","3":"The schema editor for a site part, like the header.","4":"The content of a site part.","5":"The Documentation page, written in plain words."}},"plugin_section":[],"plugin_tags":[529,2010,2235,1117,31642],"plugin_category":[55],"plugin_contributors":[253140],"plugin_business_model":[],"class_list":["post-259154","plugin","type-plugin","status-publish","hentry","plugin_tags-content","plugin_tags-custom-fields","plugin_tags-fields","plugin_tags-schema","plugin_tags-yaml","plugin_category-seo-and-marketing","plugin_contributors-starbist","plugin_committers-starbist"],"banners":{"banner":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/banner-772x250.png?rev=3717169","banner_2x":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/banner-1544x500.png?rev=3717169","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/icon-128x128.png?rev=3717169","icon_2x":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/icon-256x256.png?rev=3430736","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/screenshot-1.png?rev=3717169","caption":"The YAML CF screen, with a switch per template and the status of its fields."},{"src":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/screenshot-2.png?rev=3717169","caption":"The schema editor for a template."},{"src":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/screenshot-3.png?rev=3717169","caption":"The schema editor for a site part, like the header."},{"src":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/screenshot-4.png?rev=3717169","caption":"The content of a site part."},{"src":"https:\/\/ps.w.org\/yaml-custom-fields\/assets\/screenshot-5.png?rev=3717169","caption":"The Documentation page, written in plain words."}],"raw_content":"<!--section=description-->\n<p>YAML Custom Fields adds boxes to fill in on pages, like \"Headline\", \"Team photo\" or \"Event date\". Writers fill them in. The website shows them in the right place.<\/p>\n\n<p>You list the fields of each page template in a short text, called a schema. Each field takes a few lines.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Gives each page template its own fields.<\/li>\n<li>Adds fields to the header, the footer and other site parts.<\/li>\n<li>Adds shared fields: one value for every page with the same template.<\/li>\n<li>Keeps site details, like a phone number, for the whole site.<\/li>\n<li>Lets writers build pages from sections they add, remove and reorder.<\/li>\n<li>Keeps collections, like team members, for any page to pick from.<\/li>\n<li>Exports and imports fields and content, for backups or moving to another site.<\/li>\n<li>Finds missing images and files, and content left behind by removed fields.<\/li>\n<li>Shows fields in block themes with a shortcode.<\/li>\n<li>Makes fields available over the REST API.<\/li>\n<\/ul>\n\n<h4>Field types<\/h4>\n\n<ul>\n<li>One line of text<\/li>\n<li>Several lines of text<\/li>\n<li>Text with formatting (bold, links, lists)<\/li>\n<li>Code, like an embed or a form<\/li>\n<li>Yes or no (tick box)<\/li>\n<li>Number<\/li>\n<li>Date, with or without time<\/li>\n<li>Dropdown<\/li>\n<li>Category or tag<\/li>\n<li>Kind of content (posts, pages and more)<\/li>\n<li>Item from a collection<\/li>\n<li>Image, or a gallery<\/li>\n<li>File, or several files<\/li>\n<li>Group of fields<\/li>\n<li>Sections<\/li>\n<li>Info box: a note for writers<\/li>\n<li>Section heading: a title with a gap above it<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Go to <strong>YAML CF<\/strong> and switch on <strong>Custom fields<\/strong> for a template.<\/li>\n<li><p>Click <strong>Create schema<\/strong> and list the fields:<\/p>\n\n<p>fields:<\/p>\n\n<ul>\n<li>name: headline\nlabel: Headline\ntype: string<\/li>\n<li>name: photo\nlabel: Photo\ntype: image<\/li>\n<\/ul><\/li>\n<li><p>Open a page that uses the template. The fields are in a \"Custom fields\" box. In the block editor it's below the content. In the classic editor it's below the title.<\/p><\/li>\n<li><p>Show each field in the theme with one line:<\/p>\n\n<\/li>\n<\/ol>\n\n<p>The <strong>Documentation<\/strong> page in the plugin explains every step in plain words.<\/p>\n\n<h3>Developer Documentation<\/h3>\n\n<p>The full guide is on the plugin's Documentation page. Here's the short version.<\/p>\n\n<h4>Functions<\/h4>\n\n<pre><code>ycf_get_field( 'name' )                        \/\/ One field\nycf_get_field( 'name', 42 )                    \/\/ A field of another post\nycf_get_field( 'name', 'partial:header.php' )  \/\/ A site part\nycf_get_field( 'title', null, $section )       \/\/ A field inside a section\nycf_get_fields()                               \/\/ All fields\nycf_has_field( 'name' )                        \/\/ Does it have a value?\nycf_get_image( 'name', null, 'large' )         \/\/ Image: id, url, alt, title, caption, width, height\nycf_get_file( 'name' )                         \/\/ File: id, url, path, filename, filesize, mime_type, title\nycf_get_term( 'name' )                         \/\/ Category or tag (WP_Term)\nycf_get_post_type( 'name' )                    \/\/ Content type (WP_Post_Type)\nycf_get_data_object( 'name' )                  \/\/ An item from a collection\nycf_get_data_objects( 'short-name' )           \/\/ Every item in a collection\nycf_get_global_field( 'name' )                 \/\/ One site detail\nycf_get_global_fields()                        \/\/ All site details\n<\/code><\/pre>\n\n<p>Each function also has a long name starting with <code>yaml_cf_<\/code>.<\/p>\n\n<p>Always escape what you print: <code>esc_html()<\/code> for text, <code>esc_url()<\/code> for links, <code>wp_kses_post()<\/code> for formatted text. Code fields print as they are.<\/p>\n\n<h4>Shortcode<\/h4>\n\n<pre><code>[ycf field=\"headline\"]\n[ycf field=\"hero\" size=\"large\"]\n[ycf field=\"phone\" source=\"site\"]\n[ycf field=\"subtitle\" default=\"Coming soon\"]\n<\/code><\/pre>\n\n<h4>Where data is stored<\/h4>\n\n<ul>\n<li>Page fields: post meta <code>_yaml_cf_data<\/code><\/li>\n<li>Schemas: option <code>yaml_cf_schemas<\/code><\/li>\n<li>Site parts: option <code>yaml_cf_partial_data<\/code><\/li>\n<li>Shared fields: options <code>yaml_cf_template_global_schemas<\/code> and <code>yaml_cf_template_global_data<\/code><\/li>\n<li>Site details: options <code>yaml_cf_global_schema<\/code> and <code>yaml_cf_global_data<\/code><\/li>\n<li>Collections: option <code>yaml_cf_data_object_types<\/code>. Each item has its own option, plus a small index per collection. Read them with <code>ycf_get_data_objects()<\/code>.<\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>YAML Custom Fields doesn't collect or send any data. Everything stays in your WordPress database.<\/p>\n\n<h3>Third-Party Libraries<\/h3>\n\n<ul>\n<li><strong>Symfony YAML<\/strong> (6.4), MIT license (works with GPL)\n\n<ul>\n<li>Homepage: https:\/\/symfony.com\/components\/Yaml<\/li>\n<li>License: https:\/\/github.com\/symfony\/yaml\/blob\/6.4\/LICENSE<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li>Made by <a href=\"https:\/\/www.cita.hr\">Studio Cita<\/a><\/li>\n<li>Lead developer: <a href=\"https:\/\/www.silvestar.codes\">Silvestar Bistrovi\u0107<\/a><\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\">Plugin documentation<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\/issues\">Report a problem<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>In the WordPress admin, go to <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Search for \"YAML Custom Fields\".<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Go to <strong>YAML CF<\/strong> in the menu on the left.<\/li>\n<\/ol>\n\n<p>For a ZIP file, use <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.4 or newer<\/li>\n<li>PHP 8.1 or newer<\/li>\n<\/ul>\n\n<p>Everything else is included.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20a%20schema%3F\"><h3>What is a schema?<\/h3><\/dt>\n<dd><p>A short list of the fields a page gets. Each field has a name, a label and a type. It's written in YAML, a simple text format with one setting per line.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20code%3F\"><h3>Do I need to code?<\/h3><\/dt>\n<dd><p>Writers don't. They only fill in fields. To show fields on the website, the theme needs one line per field. The <strong>Copy code<\/strong> button next to each field copies that line for you.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20any%20theme%3F\"><h3>Does it work with any theme?<\/h3><\/dt>\n<dd><p>Yes, classic and block themes. A child theme is scanned together with its parent, so the parent's templates are listed too.<\/p>\n\n<p>Block themes have no template files to edit. Use the <code>[ycf field=\"name\"]<\/code> shortcode in a Shortcode block.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20block%20editor%3F\"><h3>Does it work with the block editor?<\/h3><\/dt>\n<dd><p>Yes. The fields are in a \"Custom fields\" box below the content. You don't need the Classic Editor plugin.<\/p><\/dd>\n<dt id=\"is%20there%20an%20api%3F\"><h3>Is there an API?<\/h3><\/dt>\n<dd><p>Yes, the WordPress REST API. Every page and post has a <code>yaml_cf<\/code> object. There are also routes for site details and collections. The Documentation page has the details.<\/p><\/dd>\n<dt id=\"which%20content%20types%20are%20supported%3F\"><h3>Which content types are supported?<\/h3><\/dt>\n<dd><p>Posts, pages and other public content types, like an \"Events\" type from a theme or plugin.<\/p><\/dd>\n<dt id=\"who%20can%20change%20the%20setup%3F\"><h3>Who can change the setup?<\/h3><\/dt>\n<dd><p>Only administrators change schemas and settings. Writers fill in fields on posts they may edit.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20turn%20the%20plugin%20off%3F\"><h3>What happens when I turn the plugin off?<\/h3><\/dt>\n<dd><p>Nothing is lost. The content stays.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>All its data is removed: schemas, site details, collections and page content. To keep the content, tick <strong>Keep the content if the plugin is deleted<\/strong> under <strong>YAML CF \u2192 Settings<\/strong> first.<\/p><\/dd>\n<dt id=\"how%20do%20i%20move%20content%20to%20another%20site%3F\"><h3>How do I move content to another site?<\/h3><\/dt>\n<dd><p>Use <strong>YAML CF \u2192 Export &amp; Import<\/strong> to save it to a file. Images and files aren't in that file, so copy the media library too. Then <strong>Content Check<\/strong> finds anything missing.<\/p><\/dd>\n<dt id=\"where%20do%20i%20report%20problems%3F\"><h3>Where do I report problems?<\/h3><\/dt>\n<dd><p>On <a href=\"https:\/\/github.com\/maliMirkec\/yaml-custom-fields\/issues\">GitHub<\/a>. Please say what you did, what you expected and what happened.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<p><strong>Changed<\/strong><\/p>\n\n<ul>\n<li><strong>Needs WordPress 6.4 or newer.<\/strong> Older versions weren't tested. WordPress won't offer this update to older sites.<\/li>\n<li><strong>The shared value tick always wins.<\/strong> When \"Use the shared value on this page\" is ticked, <code>ycf_get_fields()<\/code> now shows the shared value too. Before, it ignored the tick.<\/li>\n<li><strong>A page's own value beats a site detail with the same name.<\/strong><\/li>\n<li><strong><code>ycf_has_field()<\/code> means \"has a value\".<\/strong> An empty text or an empty list is no value. An unticked box or a zero still is.<\/li>\n<li><strong>Mistakes in a schema are refused when saved.<\/strong> Unknown types (with a \"Did you mean\u2026?\" hint), the same name twice, names with square brackets, and names the plugin uses itself. Schemas already saved keep working.<\/li>\n<\/ul>\n\n<p><strong>New<\/strong><\/p>\n\n<ul>\n<li><strong>Works in the block editor.<\/strong> The fields are a real box now. No Classic Editor plugin needed.<\/li>\n<li><strong>Block themes.<\/strong> Their templates are listed and can have fields.<\/li>\n<li><strong><code>[ycf]<\/code> shortcode.<\/strong> Show a field without editing the theme. Works in a Shortcode block, a widget or the content.<\/li>\n<li><strong>REST API.<\/strong> Every page and post has a <code>yaml_cf<\/code> object. There are routes for site details and collections. You can save through it too, with the same checks as the editor.<\/li>\n<li><strong>Settings screen.<\/strong> <strong>YAML CF \u2192 Settings<\/strong> has three choices: page caches, REST API access, and what happens when the plugin is deleted.<\/li>\n<li><strong>Keep content when the plugin is deleted.<\/strong> A choice on the Settings screen.<\/li>\n<li><strong>Galleries.<\/strong> Image fields take <code>list: true<\/code>. Pick many images at once. Reorder by dragging or with the keyboard.<\/li>\n<li><strong>Search box for big lists.<\/strong> A category or collection field with more than 50 choices becomes a search box. Change the limit with the <code>yaml_cf_picker_threshold<\/code> filter.<\/li>\n<li><strong>Sections fold away.<\/strong> Each section shows its first field as its title. A small <strong>Collapse all<\/strong> button folds them all.<\/li>\n<li><strong>Save and add another.<\/strong> For collection items. Saves and opens an empty item.<\/li>\n<li><strong>Content Check finds left-behind content.<\/strong> Values of removed fields are listed under \"Values with no field\", with a button to remove them.<\/li>\n<li><strong>Warning when a field loses its place.<\/strong> Removing or renaming a field in any schema says which fields are affected.<\/li>\n<li><strong><code>yaml_cf_field_value<\/code> filter.<\/strong> Change any value before the theme gets it.<\/li>\n<li><strong>Use site details on these pages.<\/strong> The switch is back on the main screen.<\/li>\n<\/ul>\n\n<p><strong>Better<\/strong><\/p>\n\n<ul>\n<li><strong>One kind of message.<\/strong> Messages look the same everywhere, with the same icons. Nothing pops up in a corner. Nothing disappears on its own. Results of a switch or button show right next to it, so the page doesn't jump.<\/li>\n<li><strong>Accessible messages.<\/strong> Screen readers read each message once, with its kind (\"Error:\", \"Warning:\"). Errors get keyboard focus. Pickers say how many results they found.<\/li>\n<li><strong>Icons.<\/strong> Headings, columns and buttons have icons. The same thing always has the same icon.<\/li>\n<li><strong>One field per row<\/strong> in every form.<\/li>\n<li><strong>The Custom fields box<\/strong> can be folded in the classic editor too, and remembers it. The \"not saved yet\" line works in the block editor too.<\/li>\n<li><strong>Main screen.<\/strong> The table doesn't jump when you switch templates on and off. It works on small screens.<\/li>\n<li><strong>Faster.<\/strong> Plugin data isn't loaded on every page view. Values are worked out once per page. Editor scripts only load where there are fields. Editor pages are much smaller.<\/li>\n<li><strong>Collections scale.<\/strong> Each item has its own database row. The item list has pages of 50.<\/li>\n<li><strong>No copy of the schema in every post.<\/strong> Schema changes take effect at once.<\/li>\n<li><strong>\"Add section\" is drawn by the server,<\/strong> so a new section is the same as one that was already there.<\/li>\n<li><strong>Clearer texts.<\/strong> Onboarding says the theme needs a line of code. An empty template list says why. Permission messages say what's really needed.<\/li>\n<\/ul>\n\n<p><strong>Fixed<\/strong><\/p>\n\n<ul>\n<li>Removing a field from a schema no longer deletes its content. Put the name back and the content comes back. The same on every screen.<\/li>\n<li>A tick box can be unticked again.<\/li>\n<li>Importing no longer empties fields the file doesn't mention.<\/li>\n<li>A template with only shared fields now shows the Custom fields box.<\/li>\n<li>Child themes showed no templates.<\/li>\n<li>Themes built on <code>singular.php<\/code> (like Twenty Twenty) couldn't get page fields.<\/li>\n<li><code>ycf_get_field()<\/code> and <code>ycf_get_fields()<\/code> could give different values for the same field.<\/li>\n<li>A typo in a field type showed nothing and then lost the field's content.<\/li>\n<li>Two fields could share a name, and one replaced the other.<\/li>\n<li>Shortcuts like <code>- info:<\/code> and <code>- section:<\/code> caused warnings in shared fields and inside sections.<\/li>\n<li>Fields could be saved into another post when a plugin saved a second post at the same time.<\/li>\n<li>A form left open too long lost your changes without a word. Now it says so.<\/li>\n<li>Collection labels didn't update after a schema change.<\/li>\n<li>A collection field could show an item from another collection.<\/li>\n<li>Big collection imports could lose their lock.<\/li>\n<li>Imports kept image IDs from another site in site details, site parts and shared content.<\/li>\n<li><code>ycf_get_image()<\/code> with a custom size like <code>[300, 200]<\/code> crashed the page.<\/li>\n<li>Fields named with digits only (like <code>2024<\/code>) could be renamed by some saves.<\/li>\n<li>The import preview couldn't tick pages from older export files.<\/li>\n<li>Content Check offered to delete fields still in use.<\/li>\n<li>\"Empty all fields\" left galleries, file lists and pickers filled.<\/li>\n<li>Import messages didn't show in the block editor.<\/li>\n<li>The active filter button in Content Check was unreadable.<\/li>\n<\/ul>\n\n<p><strong>Security<\/strong><\/p>\n\n<ul>\n<li>Admin-only actions use their own security token.<\/li>\n<li>Writers can only get their own post's schema.<\/li>\n<li>The category picker checks the user may use that taxonomy.<\/li>\n<li>Site details no longer leak to visitors through a page's REST data.<\/li>\n<li>Picker labels are inserted as text, not HTML.<\/li>\n<li>CSS cleaning repeats until nothing is left to remove.<\/li>\n<li>Schemas over 256 KB are refused.<\/li>\n<\/ul>\n\n<p><strong>Removed<\/strong><\/p>\n\n<ul>\n<li>Nine old background requests nothing used anymore.<\/li>\n<\/ul>\n\n<p><strong>Updated<\/strong><\/p>\n\n<ul>\n<li>Tested with WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li><strong>UPDATED: WordPress 7.0 Compatibility<\/strong> - Confirmed compatibility and updated \"Tested up to\"<\/li>\n<li><strong>FIX: Import JSON Parsing<\/strong> - Fixed \"Invalid JSON: Syntax error\" when importing settings, page data, or data objects whose field values contain HTML\/rich-text content, by removing an errant sanitize_textarea_field() call that corrupted the JSON payload before parsing<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li><strong>NEW: Multiple File Uploads<\/strong> - File fields now support <code>list: true<\/code> to attach multiple files, with a dedicated admin UI for adding and removing files<\/li>\n<li><strong>UPDATED: ycf_get_file() for Lists<\/strong> - When <code>list: true<\/code> is set, <code>ycf_get_file()<\/code> returns an array of file-data arrays instead of a single one<\/li>\n<li><strong>IMPROVED: Attachment Validation<\/strong> - Validation now checks each attachment ID in file\/image list fields individually<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li><strong>FIX: Data Object Fields in Blocks\/Objects<\/strong> - Fixed data_object fields not rendering correctly when nested inside block or object fields by adding recursive data object collection in AssetManager and DataObjectController<\/li>\n<li><strong>FIX: Attachment Data Validation<\/strong> - Fixed attachment validation logic to correctly handle the case where a schema exists but has no image\/file fields, preventing numeric values from being incorrectly cleared<\/li>\n<li><strong>FIX: Import Schema Parsing<\/strong> - Fixed data object import to parse YAML schema before validating attachment data, ensuring attachment IDs are preserved correctly during import<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li><strong>FIX: Code Field HTML Preservation<\/strong> - Code fields now use base64 encoding with a marker prefix to preserve HTML\/JavaScript\/CSS code exactly as entered, preventing WordPress sanitization from stripping tags<\/li>\n<li><strong>FIX: Code Field Re-save Protection<\/strong> - Already-encoded code fields are now preserved on re-save even if schema detection fails, preventing data loss on page refresh<\/li>\n<li><strong>NEW: Auto-decode on Frontend<\/strong> - Code field values are automatically decoded when retrieved via yaml_cf_get_field() and related functions<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li><strong>FIX: Code Field Sanitization<\/strong> - Changed filter from FILTER_SANITIZE_FULL_SPECIAL_CHARS to FILTER_UNSAFE_RAW in postRaw() to preserve raw data for schema-aware sanitization, fixing HTML entities being encoded before code fields could be properly identified<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li><strong>REFACTOR: Assets Folder Structure<\/strong> - Reorganized assets for WordPress.org compliance<\/li>\n<li><strong>IMPROVED: File Organization<\/strong> - Separated admin assets (CSS\/JS) into 'admin-assets' folder<\/li>\n<li><strong>IMPROVED: Plugin Assets<\/strong> - Moved WordPress.org assets (icons, banners, screenshots) to 'assets' folder<\/li>\n<li><strong>UPDATED: File References<\/strong> - Updated all asset paths in templates and AssetManager<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li><strong>FIX: Dynamic Block Fields<\/strong> - Fixed taxonomy, post_type, and data_object fields not rendering correctly in dynamically added blocks<\/li>\n<li><strong>NEW: JavaScript Field Handlers<\/strong> - Added missing post_type and data_object field support to JavaScript block rendering<\/li>\n<li><strong>IMPROVED: Field Type Parity<\/strong> - All field types now work identically in both static (PHP) and dynamic (JavaScript) rendering<\/li>\n<li><strong>IMPROVED: Data Localization<\/strong> - Enhanced controllers to pass taxonomy terms, post types, and data objects to JavaScript<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li><strong>UPDATED: Symfony Libraries<\/strong> - Updated Symfony YAML Component to 6.4 and Deprecation Contracts to 3.6.0 for PHP 8.1+ compatibility<\/li>\n<li><strong>SECURITY: Nonce Verification<\/strong> - Fixed GET parameter access to verify nonces before accessing other parameters<\/li>\n<li><strong>IMPROVED: Script Enqueuing<\/strong> - Converted all inline scripts to proper wp_enqueue_script usage with wp_localize_script<\/li>\n<li><strong>REQUIREMENT: PHP 8.1+<\/strong> - Minimum PHP version requirement (Symfony 6.4 LTS supports PHP 8.1+)<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li><strong>FIX: Export\/Import<\/strong> - Template global schemas and data now properly exported and imported<\/li>\n<li><strong>FIX: Page Data Export<\/strong> - Schema is now included in page data exports (form-based and AJAX)<\/li>\n<li><strong>FIX: Page Data Import<\/strong> - Now correctly handles both single-post and multi-post export formats<\/li>\n<li><strong>NEW: Template Global Readonly Display<\/strong> - Template-global-only fields now display as readonly in post editor<\/li>\n<li><strong>NEW: Auto-fallback for Template Global Fields<\/strong> - <code>ycf_get_field()<\/code> now automatically retrieves template global data<\/li>\n<li>Fixed browser autocomplete issues with template global form fields<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>NEW: Template Global Fields<\/strong> - Define shared default values for all posts using the same template<\/li>\n<li><strong>NEW: Per-field global\/local toggle<\/strong> - Each field can independently use template global or page-specific data<\/li>\n<li><strong>NEW: Dual-field interface<\/strong> - Visual side-by-side comparison of template global and page-specific values<\/li>\n<li><strong>NEW: Auto-merge data hierarchy<\/strong> - Intelligent data priority system (page &gt; template global &gt; site global)<\/li>\n<li>Enhanced post editor UI with clear visual indicators for global vs local data<\/li>\n<li>Improved field rendering system with unique IDs for dual fields<\/li>\n<li>Added per-field preferences storage for granular control<\/li>\n<li>Better reset functionality that preserves global data<\/li>\n<li>Enhanced documentation with Template Global Fields guide<\/li>\n<li>Improved admin interface organization for template management<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Improved code quality and WordPress Coding Standards compliance<\/li>\n<li>Consolidated Export\/Import functionality into single admin page<\/li>\n<li>Renamed \"Export Page Data\" to \"Export\/Import\" for clarity<\/li>\n<li>Reorganized admin menu structure (Export\/Import now positioned above Documentation)<\/li>\n<li>Enhanced database query performance with optimized caching strategy<\/li>\n<li>Implemented post tracking system for efficient cache management<\/li>\n<li>Improved input sanitization using filter_input() throughout the plugin<\/li>\n<li>Enhanced output escaping for better security<\/li>\n<li>Added production-safe logging system with WordPress hooks<\/li>\n<li>Better file upload validation and error handling<\/li>\n<li>Removed all phpcs:ignore suppressions in favor of proper WordPress coding practices<\/li>\n<li>Added phpcs.xml.dist configuration file for consistent code standards<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Support for 15+ field types<\/li>\n<li>Template and partial support<\/li>\n<li>ACF-like template functions with context_data parameter for block fields<\/li>\n<li>Taxonomy field type for categories, tags, and custom taxonomies (single\/multiple selection)<\/li>\n<li>Post Type field type for selecting registered WordPress post types<\/li>\n<li>Data Objects feature for managing structured, reusable data (universities, companies, etc.)<\/li>\n<li>Enhanced helper functions: ycf_get_field(), ycf_get_image(), ycf_get_file(), ycf_get_term(), ycf_get_post_type(), ycf_get_data_object(), ycf_get_data_objects()<\/li>\n<li>Block\/repeater functionality with context-aware field access<\/li>\n<li>WordPress media integration<\/li>\n<li>Administrator-only access<\/li>\n<li>Clean uninstall<\/li>\n<li>Clear buttons for image and file fields<\/li>\n<li>Reset All Data button for clearing all custom fields<\/li>\n<li>Confirmation alerts for destructive actions<\/li>\n<li>Copy snippet buttons for all field types with complete function signatures<\/li>\n<\/ul>","raw_excerpt":"Custom fields for pages, posts and every part of the site. You set the fields once. Writers fill them in.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/259154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=259154"}],"author":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/starbist"}],"wp:attachment":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=259154"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=259154"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=259154"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=259154"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=259154"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=259154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}